Projekt składa się z czterech plików: hotel.js
, hotel.html
, client/client.js
oraz lib/reservations.json
.
hotel.js
jest skryptem po stronie serwera. Odpala się on poleceniem
node hotel.js
Zadaniem tego skryptu jest utworzenie serwera HTTP i opracowanie zapytań od klienta. Serwer jest uruchomiony na porcie 8080, system jest dostępny po adresie http://localhost:8080
let server=http.createServer(hotel)
// Listen on port 8080, IP defaults to 127.0.0.1
server.listen(8080);
// Put a friendly message on the terminal
console.log("Server running at http://127.0.0.1:8080/");
hotel
jest funkcją, w której ustala się, w jaki sposób opracowuje się zapytania klienta
let hotel=function (request, response) { // Parse the request for arguments and store them in get variable. // This function parses the url from request and returns object representation. let get = url.parse(request.url, true).query; if(request.url=='/hotel.js'){ notFound(response); } else if(request.url=='/' || request.url=='/hotel.html'){ fs.readFile('hotel.html', 'utf-8', getReadFile(response,'text/html')); } else if(request.url.substr(-3)=='.js'){ fs.readFile('.'+request.url, 'utf-8', getReadFile(response,'application/javascript')); } else if(get['data']=='calendar'){ response.writeHead(200, {'Content-Type': 'text/plain'}); response.end(getCalendar(get['year'],get['month'],get['day'])); } else if(get['data']=='rooms'){ response.writeHead(200, {'Content-Type': 'text/plain'}); response.end(getRooms(get['year'],get['month'],get['day'])); } else if(get['data']=='book'){ response.writeHead(200, {'Content-Type': 'text/plain'}); response.end(bookRoom(get['room'],get['year'],get['month'],get['day'])); } else{ notFound(response); } }
Przykładowo, jeżeli URI w zapytaniu to /
lub /hotel.html
, to serwowany zostanie plik hotel.html
z typem MIME text/html
. Jeżeli URI kończy się przez .js
, to zostanie serwowany odpowiedni plik z typem MIME application/javascript
(za wyjątkiem pliku hotel.js
).
Pozostałe zapytania opracowuje się w zależności od parametru data
zapytania. Na przykład, w odpowiedzi na zapytanie z URI /?data=calendar&year=2013&month=5&day=23
zostanie serwowany z typem MIME text/plain
wynik funkcji getCalendar(2013,5,23)
. Zwróć uwagę na to, że miesiące ja numeruję od zera. 5 — to jest czerwiec.
Plik hotel.html
zawiera kod HTML.
<!DOCTYPE HTML> <html> <head> <title>Rezerwacja noclegów w motelu “Overlook”</title> <meta charset="utf-8"> <script src="client/client.js"></script> </head> <body> <header> <h1>Rezerwacja noclegów w motelu “Overlook”</h1> </header> <ahead id='calendar'></ahead> <article> <h1><time id='dat'>Data</time></h1> <ul id='rooms'>Rooms</ul> </article> </body> </html>
Zawiera on trzy pojemniki: <ahead id='calendar'></ahead>
, <time id='dat'>Data</time>
, <ul id='rooms'>Rooms</ul>
, odpowiednio dla kalendarza, bieżącej daty oraz dla listy pokojów. Dane dla tych elementów pobierane są z serwera AJAX'em.
client/client.js
jest skryptem, działającym po stronie klienta(przeglądarki). W szczególności, funkcja setup
pobiera z serwera dane, dotyczące dzisiejszego dnia oraz ustawia callbacki na kliknięcie po kalendarzu oraz po liście pokoi.
Callbacki na kliknięcie na kalendarzu oraz na liście pokoi zostało zaimplementowane z użyciem wzorca „delegowanie zdarzeń”. W szczególności po kliknięciu na datę w kalendarzu ładują się dane o rezerwacjach z tej daty.
W pliku lib/reservations.json
zapisane są dane o rejestracjach w formacie JSON:
{ "2014-05-01": { "101": true, "203": true, "304": true }, "2014-05-4": { "101": true, "102": true } }
Dane są przechowywane po stronie serwera. Na początku pracy serwera dane są wczytywane z pliku i zapisywane w zmiennej reservations
:
let reservations; fs.readFile("lib/reservations.json",'utf-8', function(error, data){ if(error){ console.log("can't read file"); process.exit(); } else{ reservations = JSON.parse(data); } } );