Mój pierwszy serwer HTTP w Node.JS

By | 21 March 2016

Zapewne jak większość z deweloperów backend’owych język JavaScript kojarzy mi się z tworzeniem raczej frontendu’u. Nie lubimy go, bo… jest inny. Pisząc skrypty dla UI często spotykałem się z sytuacją, że coś nie działa i nie wiedziałem dlaczego. Sprawy nie ułatwiał brak wsparcia dla debugowania, przynajmniej do czasu, aż zacząłem wykorzystywać odpowiednie dodatki do przeglądarek.

Postanowiłem jednak bardziej zaprzyjaźnić się z tym językiem i po kilku tygodniach obcowania muszę powiedzieć, że bardzo mi się podoba. Aktualnie JavaScript jest bardzo rozwiniętą platformą do wytwarzania aplikacji i wspiera to zadanie na każdym etapie – od bazy danych, przez serwer aplikacji, po frontend (no ale to nie jest dziwne ;-)).

Na pierwszy ogień podczas mojej podróży poszła możliwość napisania w JavaScript prostego serwera HTTP. Zadanie nie jest trudne.

Zakładam, że zainstalowany jest już interpreter Node.js, w którym będą uruchamiane nasze skrypty oraz mamy zainstalowany NPM do zarządzania pakietami. No to do boju…

W pierwszej kolejności musimy pobrać pakiet http-server za pomocą polecenia:


npm install http-server --save


Instalujemy pakiet tylko w naszym projekcie, ale jeśli potrzebujecie można zainstalować go jako globalny wykorzystując przełącznik -g.

Idziemy do kodu. Poniżej przykład najprostszego serwera HTTP:


var http = require('http');
var port = process.env.port || 8080;
http.createServer(function ( request, response) {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Hello World\n');
}).listen(port);

Niezbyt ambitnie, co? W pierwszej kolejności dodajemy instancję pakietu serwera http i definiujemy port. Następnie poleceniem createServer() tworzymy instancję serwera i przekazujemy do niej funkcję obsługującą każde żądanie (ang. handler). Funkcja ta przyjmuje dwa parametry reprezentujące żądanie i odpowiedź serwera. Czyli zgodnie z intuicją, czytamy co jest w żądaniu (ang. request), a wynik zapisujemy w odpowiedzi (ang. response).

Nasz serwer jest dość ubogi, gdyż aktualnie na każde żądanie odpowie prostym “Hello World”. Spróbujmy go trochę zróżnicować. Napiszmy kawałek kodu, który powita nas gdy w URL napiszemy (..)/hello i pożegna – gdy (..)/bye . Aby to zrobić musimy odpowiednio zmodyfikować funkcję obsługującą żądanie.


var http = require('http');
var port = process.env.port || 8080;
http.createServer(function (req, res) {
    var retval;
    switch (req.url.substr(1).split("/")[0]) {
        case "hello":
            retval = "Hello world";
            break;
        case "bye":
            retval = "Bye world";
            break;
        default:
            res.writeHead(404, "Unknown resource")
            res.end();
            break;
    }
    
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end(retval + '\n');
}).listen(port);

Parametr request posiada właściwość url, który zawiera przekazaną treść adresu. Wystarczy odpowiednią instrukcją sprawdzić jej wartość i zareagować. Zauważcie, że nasz serwer na każde inne żądanie niż opisane wyżej odpowie kodem HTTP 404.

Nasze rozwiązanie nie jest idealne, ale wystarczające do prostych rozwiązań. Gdy ścieżek, które będziemy chcieli obsługiwać będzie bardzo dużo, musimy w jakiś sposób zarządzać funkcjami je obsługującymi i wygodnie te ścieżki obsługiwać. Do tego celu możemy wykorzystać jeden z wielu pakietów obsługujących routingi (np. http-router, router, routes-router, …). Ale o tym już w następnym wpisie…

Leave a Reply

Your email address will not be published. Required fields are marked *