Przejdź do treści

Pierwsze WebAPI w Node.js - Bez frameworka i zewnętrznych bibliotek

Aby napisać API w Node.js nie jest potrzebna żadna dodatkowa biblioteka taka jak np. Express, Koa, Hapi czy NestJS.

Pokażę Ci pierwszy, bardzo okrojony, przykład aplikacji reagującej na wysyłane do niej żądania HTTP. Stworzymy aplikację i udostępnimy pseudo API, ale posłużymy się tylko natywnymi rozwiązaniami, które otrzymujemy w Node.js.

Głównie w celu nauki i zrozumienia, że do komunikacji za pomocą protokołu HTTP, niepotrzebna jest nam zewnętrzna biblioteka.

Oczywiście wraz z bibliotekami dostajemy wiele rozwiązanych za nas problemów oraz pojawia się także ciekawsza abstrakcja, która może ułatwić i sprawić nieco przyjemniejszym sam development.

Natomiast o tym na sam koniec.

Moduł HTTP

Implementacja protokołu HTTP, niezbędnego w komunikacji klient <=> serwer w typowych aplikacjach webowych, w Node.js zawarta jest w module HTTP. To on pozwala nam na wysyłanie żądań z naszej aplikacji do innej, ale również na obsługę żądań HTTP, które trafią do naszej aplikacji.

Za pomocą udostępnionych funkcji, nie musimy zejść na poziom dokumentacji RFC, aby móc korzystać z protokołu. W module HTTP znajdziemy także klasy reprezentujące dane oraz zachowanie m.in.:

  • ClientRequest - klasa wewnętrzna, reprezentuje żądanie, które jest przetwarzane w toku;
  • Server - umożliwia tworzenie serwera obsługującego HTTP;
  • ServerResponse - reprezentująca dane wysyłane w odpowiedzi do klienta;
  • IncomingMessage - reprezentacja danych przychodzących do serwera od klienta - nagłówki, metoda, adres URL;

Operacje przetwarzania, przyjmowanych danych oraz danych wysyłanych do klienta mogą dziać się za pomocą strumieni. To szczególnie ważne, jeśli nie chcemy blokować działania aplikacji na czas przetworzenia całej porcji danych. Szczególnie gdy musimy przetwarzać megabajty danych i więcej.

Przykład

Dlaczego od razu nie pokazuję rozwiązania opartego o jakiś konkretny framework lub dodatkową bibliotekę? Ponieważ:

  • to jeden z fundamentów Node.js, natywne wbudowany;
  • pokazuję podstawę, na której bazują biblioteki;
  • gdy wiesz, jak pewne mechanizmy działają od środka, łatwiej znajdować błędy przykryte warstwą abstrakcji, którą w sposób bezpośredni przyjmujemy, korzystając z bibliotek;

Wracając jednak do konkretów, stwórz plik server.js, przeklej do niego poniższy kod oraz przeanalizuj go:

1
2
3
4
5
const http = require('http');

http.createServer((req, res) => {
  res.end(`Hello World!`);
}).listen(3000);

Aby utworzyć serwer, który będzie obsługiwał wszystkie żądania, nie potrzeba zbyt wiele.

  • Funkcja createServer() przyjmuje jako parametr funkcję, która odpowiada za przetworzenie żądania.
  • Nie zrobiłem tutaj niczego szczególnego - odpowiadamy po prostu wiadomością Hello World.
  • Natomiast funkcja listen() finalnie uruchamia serwer HTTP na podanym porcie, w tym przypadku 3000.

Uruchom aplikację poprzez wydanie polecenia: node server.js, a następnie wywołaj w przeglądarce adresu http://localhost:3000

Przykłady związane z tworzeniem API bez zależności zewnętrznych udostępniam w projekcie NodeStart na GitHub.

Czy i kiedy warto?

Czy warto stosować produkcyjnie, implementację pisaną od podstaw? Mógłbym odpowiedzieć jedynie TO ZALEŻY, bo to prawda. Ale…

Osobiście, nie spotkałem się jeszcze z takim przypadkiem. Zawsze wykorzystywaliśmy rozwiązania usprawniające nam prace, w tym przypadku, chociażby routingu - różne implementacja dla poszczególnych adresów URL oraz metod. POST na url /animals będzie zachowywał się zupełnie inaczej od GET na /animals.

Pamiętajmy jednak, że pewne wymagania mogą być niemożliwe lub bardzo ciężkie do realizacji, podczas wykorzystania gotowego rozwiązania. Wtedy warto znać nie tylko ograniczeń bibliotek, ale także możliwości samego ekosystemu, z którego korzystamy.

Alternatywne moduły

Krótkim słowem na zakończenie, przy okazji modułu HTTP należy również wspomnieć o innych modułach w Node.js, które związane są z HTTP:

HTTP to protokół, bez którego dzisiejsze funkcjonowanie internetu nie byłoby możliwe. Ze względu na popularność, bardzo często się z nim spotkasz. Zachęcam Cię do zagłębienia podstaw takich jak: nagłówki, metody, status kody, ciasteczka, cache czy CORS. Całkiem ciekawe opracowanie umieszczone jest na MDN Web Docs.