Utwórz serwer HTTP w Node.js za pomocą Code Przykład

⚡ Inteligentne podsumowanie

Node.js buduje działający serwer WWW w kilku linijkach, wykorzystując wbudowany moduł http. Serwer nasłuchuje na wybranym porcie i odpowiada na każde żądanie, podając kod statusu i treść, podczas gdy osobny kod pobiera dane z innych stron.

  • 🖥️. Tworzenie serwera: http.createServer rejestruje wywołanie zwrotne, które jest uruchamiane raz na każde żądanie przychodzące i odbiera obiekty żądania i odpowiedzi.
  • 🔢 Status i nagłówki: writeHead wysyła kod statusu i typ zawartości przed zapisaniem jakiejkolwiek treści.
  • 🔌 Powiązanie portu: server.listen podłącza aplikację do portu. Można wybrać dowolny, wolny numer portu.
  • 📥 Żądania wychodzące: Pobieranie danych z innej witryny wymaga klienta HTTP, a Node dostarcza teraz globalną funkcję pobierania.
  • ⚠️ Wycofany klient: Moduł request został uznany za przestarzały w lutym 2020 r. i nie należy go używać w nowym kodzie.
  • 🛠️. Błędy podczas uruchamiania: Błąd EADDRINUSE oznacza, że ​​wybrany port jest już obsługiwany przez inny proces.

Utwórz serwer WWW HTTP w Node.js

node.js Framework jest używany głównie do tworzenia aplikacji serwerowych. Można go z łatwością wykorzystać do budowy serwerów WWW, które udostępniają treści użytkownikom.

Kilka modułów obsługuje żądania związane z serwerem, wbudowany http Moduł jest jednym z najważniejszych. Przyjrzymy się, jak stworzyć prostą aplikację serwera WWW w Node.js, a następnie jak zażądać danych z innej witryny.

Węzeł jako serwer WWW korzystający z protokołu HTTP

Przyjrzyjmy się przykładowi tworzenia i uruchamiania pierwszej aplikacji Node.js.

Aplikacja tworzy prosty moduł serwera, który nasłuchuje na porcie 7000. Gdy przeglądarka wysyła żądanie na ten port, serwer wysyła Witaj świecie odpowiedź dla klienta.

Węzeł jako serwer WWW korzystający z protokołu HTTP

Code Wyjaśnienie

  1. require funkcja odczytuje JAVASCRIPT plik, uruchamia go i zwraca obiekt eksportu. Tutaj ładuje http modułu, aby jego funkcjonalność była dostępna w aplikacji.
  2. Aplikacja serwerowa jest tworzona z prostej funkcji. Funkcja ta jest uruchamiana za każdym razem, gdy żądanie dociera do serwera.
  3. Po otrzymaniu żądania, odpowiedź jest wysyłana ze statusem 200To standardowy kod statusu w nagłówku HTTP informujący o pomyślnej odpowiedzi.
  4. Treść odpowiedzi jest sama w sobie ciągiem znaków Witaj świecie.
  5. server.listen sprawia, że ​​aplikacja nasłuchuje żądań klienta na porcie 7000. Można użyć dowolnego dostępnego portu.

Jeśli polecenie zostanie wykonane pomyślnie, w przeglądarce pojawi się następujący komunikat.

Wydajność

Wyjście serwera internetowego węzła

Z wyników:

  • Przeglądanie do localhosta URL na porcie 7000 wyświetla ciąg Witaj świecie na stronie.
  • Ponieważ kod określa port 7000, dane wyjściowe będą widoczne tylko po przejściu do tego portu.

Oto kod, dla porównania:

var http = require('http');

var server = http.createServer(function(request, response) {
    response.writeHead(200, { "Content-Type": "text/plain" });
    response.end("Hello World\n");
});

server.listen(7000);

Obsługa żądań GET w Node.js

W Node.js żądanie GET w celu pobrania danych z innej witryny jest proste. Historycznie wymagało to request moduł, zainstalowany z wiersza poleceń:

npm install request

To polecenie prosi menedżera pakietów Node o pobranie i zainstalowanie wymaganego modułu. Po pomyślnej instalacji w wierszu poleceń wyświetlana jest nazwa i wersja zainstalowanego modułu w formacie <name>@<version>.

wyjście żądania instalacji npm

Na powyższym zrzucie ekranu widać, request moduł i jego numer wersji zostały pobrane i zainstalowane.

Tworzenie żądania GET w Node.js

Code Wyjaśnienie

  1. request Moduł zainstalowany w poprzednim kroku udostępnia funkcje niezbędne do wysyłania żądań GET do stron internetowych.
  2. Żądanie GET jest wysyłane do witryny, a po otrzymaniu odpowiedzi uruchamiane jest wywołanie zwrotne. Wywołanie zwrotne otrzymuje trzy parametry:
    1. Błąd — rejestruje wszelkie błędy wykryte podczas tworzenia żądania.
    2. Odpowiedź — zawiera nagłówki HTTP zwrócone w odpowiedzi.
    3. Ciało — zawiera całą treść odpowiedzi.
  3. Treść otrzymana w body parametr jest zapisywany na konsoli.

Oto kod, dla porównania:

var request = require("request");

request("https://example.com", function(error, response, body) {
    // Always check the error parameter before using the body
    if (error) {
        console.error("Request failed:", error.message);
        return;
    }
    console.log(body);
});

⚠️ Informacja o wycofaniu: dotychczasowy request moduł był całkowicie wycofane w lutym 2020 r. i nie otrzymuje dalszych aktualizacji. Nadal się instaluje i działa, więc powyższy przykład pozostaje ważny dla istniejących projektów, ale npm install request teraz wyświetla ostrzeżenie o wycofaniu. Nowy kod powinien używać wbudowanego fetch Funkcja pokazana w następnej sekcji.

Jak tworzyć żądania HTTP z natywnym pobieraniem w Node.js

Węzeł zawiera globalny fetch Funkcja od wersji 18, zgodna z API już dostępnym w przeglądarkach. Instalacja pakietu nie jest wymagana, a funkcja zwraca obietnicę, więc działa bezpośrednio z async/await.

// No require and no npm install needed on Node 18 or later

async function getData() {
    try {
        const response = await fetch("https://example.com");

        // fetch does NOT reject on 404 or 500 — check ok yourself
        if (!response.ok) {
            throw new Error("HTTP status " + response.status);
        }

        const body = await response.text();
        console.log(body);

    } catch (err) {
        // Network failures and the throw above both land here
        console.error("Request failed:", err.message);
    }
}

getData();

Warto zwrócić uwagę na trzy różnice w stosunku do stylu wywołania zwrotnego. Po pierwsze, fetch odrzuca tylko w przypadku awarii na poziomie sieci; błąd HTTP 404 lub 500 nadal jest rozwiązywany pomyślnie, dlatego response.ok istnieje check i dlaczego jego pominięcie jest najczęstszym błędem przy przechodzeniu z requestPo drugie, treść nie jest dostarczana wraz z odpowiedzią — należy ją odczytać w sposób wyraźny. response.text() dla zwykłego tekstu lub response.json() dla JSON, a każdy z nich zwraca własną obietnicę. Po trzecie, ponieważ całe wywołanie jest oparte na obietnicy, pojedyncza try/catch obejmuje zarówno żądanie, jak i odczyt treści, całkowicie zastępując parametr wywołania zwrotnego błędu.

W przypadku skryptów, które muszą działać na Node 16 lub starszym, zainstaluj node-fetch or axios zamiast tego, ponieważ oba udostępniają porównywalny interfejs oparty na obietnicach i wymagają jedynie zmiany w wierszu importu po uaktualnieniu środowiska wykonawczego.

żądanie vs pobieranie vs axios: Którego użyć

W większości materiałów Node pojawiają się trzy klienty HTTP, a tylko jeden z nich jest rozsądnym domyślnym rozwiązaniem dla nowych projektów. Różnią się one statusem konserwacji, tym, czy zależność jest w ogóle potrzebna, oraz sposobem sygnalizowania błędu, dlatego poniższa tabela zestawia je obok siebie.

WYGLĄD zażądać pobierz (wbudowany) aksjos
Status Przestarzałe od 2020 r. Utrzymywane w rdzeniu Aktywnie utrzymywane
instalacja sprzętu pakiet npm Brak na Node 18+ pakiet npm
Styl Wywołanie zwrotne w pierwszej kolejności błędu Obietnica Obietnica
Analiza składniowa JSON Ręcznie lub opcja JSON Manualnie przez response.json() automatycznie
Odrzucenia na 404 lub 500 Nie Nie Tak

Zastosowanie fetch dla nowych projektów w aktualnej wersji Node, ponieważ nie dodaje żadnych zależności i jest zgodna z interfejsem API przeglądarki, który jest już znany programistom. Wybierz axios gdy automatyczne przetwarzanie JSON, przechwytywanie żądań lub odrzucanie w przypadku błędów pozwalałoby na zapisanie prawdziwego kodu. Zachowaj request tylko w starszych aplikacjach, które już od niego zależą i planują go zastąpić.

Typowe błędy serwera Node.js i jak je naprawić

Większość błędów podczas uruchamiania pierwszego serwera Node wynika z portów, ścieżek lub brakujących odpowiedzi, a nie z samego kodu serwera.

  • EADRYNAZA: Inny proces już posiada port. Uruchom netstat -ano | findstr :7000 on Windowslub lsof -i :7000 on macOS i Linux, zatrzymaj ten proces lub wybierz inny port.
  • EACCES na niskim porcie: Porty poniżej 1024 wymagają podwyższonych uprawnień. Podczas tworzenia oprogramowania należy używać portu powyżej 1024, np. 3000 lub 7000.
  • Przeglądarka zawiesza się i nigdy się nie ładuje: opiekun nigdy nie zadzwonił response.end()Połączenie pozostaje otwarte do momentu upłynięcia limitu czasu, więc każda ścieżka przez moduł obsługi musi kończyć odpowiedź.
  • Nie można znaleźć modułu 'http': Nazwa pliku jest błędnie wpisana lub skrypt działa w przeglądarce, a nie w Node. Moduły główne nie wymagają instalacji.
  • Zmiany nie są widoczne: Węzeł ładuje plik jednorazowo podczas uruchamiania. Po każdej edycji należy ponownie uruchomić proces lub uruchomić go pod kontrolą, np. node --watch server.js.

FAQ

Moduł http wystarcza dla pojedynczego punktu końcowego. Express dodaje routing, oprogramowanie pośredniczące i analizę treści, które stają się warte zależności, gdy aplikacja obsługuje kilka tras.

Wymagaj https Zamiast tego należy użyć modułu i przekazać klucz oraz certyfikat do createServer. W środowisku produkcyjnym odwrotny serwer proxy, taki jak Nginx, zazwyczaj kończy połączenie TLS i przekierowuje zwykły protokół HTTP do węzła.

Tak. AI Narzędzia niezawodnie konwertują wywołania zwrotne typu error-first na async-await. Sprawdź, czy wygenerowany kod dodaje test response.ok, ponieważ fetch rozwiązuje błąd 404, a to sprawdzenie jest często pomijane.

Asystenci AI odczytują kod błędu i bezpośrednio podają przyczynę, odróżniając konflikt portów od problemu z uprawnieniami lub błędu składni, co znacznie skraca czas zgadywania w pierwszym projekcie Node.

Obiekt żądania jest strumieniem, więc zbierz jego zdarzenia danych do bufora i przeanalizuj wynik po zdarzeniu końcowym. Express i podobne frameworki zapewniają oprogramowanie pośredniczące do analizy treści, które wykonuje ten krok za Ciebie.

Podsumuj ten post następująco: