Opprett HTTP-webserver i Node.js med Code Eksempel

โšก Smart oppsummering

Node.js bygger en fungerende webserver pรฅ noen fรฅ linjer ved hjelp av den innebygde http-modulen. Serveren lytter pรฅ en valgt port og svarer pรฅ hver forespรธrsel med en statuskode og brรธdtekst, mens separat kode henter data fra andre nettsteder.

  • ๐Ÿ–ฅ๏ธ Serveroppretting: http.createServer registrerer et tilbakeringingssignal som kjรธrer รฉn gang per innkommende forespรธrsel og mottar forespรธrsels- og svarobjekter.
  • ๐Ÿ”ข Status og overskrifter: writeHead sender statuskoden og Content-Type fรธr noe brรธdtekstinnhold skrives.
  • ๐Ÿ”Œ Portbinding: server.listen kobler applikasjonen til en port, og et hvilket som helst ledig portnummer kan velges.
  • ๐Ÿ“ฅ Utgรฅende forespรธrsler: Henting av data fra et annet nettsted krever en HTTP-klient, og Node leverer nรฅ en global hentefunksjon.
  • โš ๏ธ Utdatert klient: Forespรธrselsmodulen ble avviklet i februar 2020 og skal ikke brukes i ny kode.
  • ๐Ÿ› ๏ธ Oppstartsfeil: En EADDRINUSE-feil betyr at den valgte porten allerede holdes av en annen prosess.

Opprett HTTP Web Server i Node.js

Ocuco node.js Rammeverket brukes hovedsakelig til รฅ lage serverbaserte applikasjoner. Det kan enkelt brukes til รฅ bygge webservere som leverer innhold til brukere.

Flere moduler hรฅndterer serverrelaterte forespรธrsler, den innebygde http modulens fremste blant dem. Vi skal se pรฅ hvordan man lager en grunnleggende webserverapplikasjon ved hjelp av Node.js, og deretter hvordan man ber om data fra et annet nettsted.

Node som en webserver som bruker HTTP

La oss se pรฅ et eksempel pรฅ hvordan du oppretter og kjรธrer et fรธrste Node.js-program.

Applikasjonen oppretter en enkel servermodul som lytter pรฅ port 7000. Nรฅr en forespรธrsel sendes gjennom nettleseren pรฅ den porten, sender serveren en Hallo verden svar til klienten.

Node som en webserver som bruker HTTP

Code Forklaring

  1. Ocuco require funksjonen leser en JavaScript filen, kjรธrer den og returnerer exports-objektet. Her laster den inn http modulen slik at funksjonaliteten er tilgjengelig i applikasjonen.
  2. En serverapplikasjon opprettes fra en enkel funksjon. Funksjonen kjรธrer hver gang en forespรธrsel nรฅr serveren.
  3. Nรฅr en forespรธrsel mottas, sendes svaret med statusen 200Dette er standard statuskode i en HTTP-header for et vellykket svar.
  4. Selve svarsdelen er strengen Hallo verden.
  5. server.listen fรฅr applikasjonen til รฅ lytte etter klientforespรธrsler pรฅ port 7000. Enhver tilgjengelig port kan brukes.

Hvis kommandoen kjรธres uten problemer, vises fรธlgende utdata i nettleseren.

Produksjon

Node webserver utdata

Fra utdataene:

  • Surfer til den lokale verten URL pรฅ port 7000 vises strengen Hallo verden pรฅ siden.
  • Fordi koden spesifiserer port 7000, er utdataene bare synlige nรฅr man blar til den porten.

Her er koden for referanse:

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);

Hรฅndtering av GET-forespรธrsler i Node.js

Det er enkelt รฅ sende en GET-forespรธrsel for รฅ hente data fra et annet nettsted i Node.js. Historisk sett krevde dette request modul, installert fra kommandolinjen:

npm install request

Den kommandoen ber Node-pakkebehandleren om รฅ laste ned den nรธdvendige modulen og installere den. Nรฅr installasjonen er fullfรธrt, viser kommandolinjen navnet pรฅ den installerte modulen og versjonen i formen <name>@<version>.

utdata for npm-installasjonsforespรธrsel

I รธyeblikksbildet ovenfor, request modulen og versjonsnummeret ble lastet ned og installert.

ร… lage en GET-forespรธrsel i Node.js

Code Forklaring

  1. Ocuco request Modulen som ble installert i forrige trinn, inneholder funksjonene som trengs for รฅ sende GET-forespรธrsler til nettsteder.
  2. En GET-forespรธrsel sendes til et nettsted, og et tilbakekalling kjรธres nรฅr et svar kommer inn. Tilbakekallingen mottar tre parametere:
    1. Feil โ€” registrerer eventuelle feil som oppsto under forespรธrselen.
    2. Respons โ€” bรฆrer HTTP-overskriftene som returneres med svaret.
    3. Body โ€” inneholder hele innholdet i svaret.
  3. Innholdet som er mottatt i body Parameteren skrives til konsollen.

Her er koden for referanse:

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);
});

โš ๏ธ Varsel om avskrivning: de request modulen var fullstendig avviklet i februar 2020 og mottar ingen ytterligere oppdateringer. Den installeres og kjรธrer fortsatt, sรฅ eksemplet ovenfor er fortsatt gyldig for eksisterende prosjekter, men npm install request skriver nรฅ ut en advarsel om avskrivning. Ny kode bรธr bruke den innebygde fetch funksjonen som vises i neste avsnitt.

Slik lager du HTTP-forespรธrsler med Native Fetch i Node.js

Node har inkludert en global fetch funksjon siden versjon 18, som samsvarer med API-et nettlesere allerede tilbyr. Ingen pakkeinstallasjon er nรธdvendig, og funksjonen returnerer et lรธfte, slik at den fungerer direkte med 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();

Tre forskjeller fra tilbakeringingsstilen er verdt รฅ merke seg. For det fรธrste, fetch avviser bare ved feil pรฅ nettverksnivรฅ; en HTTP 404 eller 500 lรธses fortsatt uten problemer, og det er derfor response.ok sjekk finnes, og hvorfor det รฅ utelate den er den vanligste feilen nรฅr man flytter fra requestFor det andre leveres ikke kroppen med responsen โ€“ den mรฅ leses eksplisitt med response.text() for ren tekst eller response.json() for JSON, og hver av disse returnerer et eget lรธfte. For det tredje, fordi hele kallet er lรธftebasert, returnerer en enkelt try/catch dekker bรฅde forespรธrselen og brรธdteksten, og erstatter error-first callback-parameteren fullstendig.

For skript som mรฅ kjรธre pรฅ Node 16 eller tidligere, installer node-fetch or axios i stedet, siden begge eksponerer et sammenlignbart lรธftebasert grensesnitt og bare krever en endring av importlinjen nรฅr kjรธretiden er oppgradert.

forespรธrsel vs. hent vs. axios: Hvilken skal brukes

Tre HTTP-klienter dukker opp pรฅ tvers av mesteparten av Node-materialet, og bare รฉn av dem er en fornuftig standard for nytt arbeid. De varierer i vedlikeholdsstatus, om en avhengighet i det hele tatt er nรธdvendig, og hvordan hver enkelt signaliserer en feilstatus, sรฅ tabellen nedenfor setter dem side om side.

Aspekt anmode hente (innebygd) Axios
status Utdatert siden 2020 Opprettholdt i kjernen Aktivt vedlikeholdt
Installasjon npm-pakke Ingen pรฅ node 18+ npm-pakke
Stil Feil โ€“ fรธrste tilbakeringing Promise Promise
JSON-parsing Manuell, eller et json-alternativ Manuell via response.json() Automatisk
Avviser pรฅ 404 eller 500 Nei Nei Ja

Bruk fetch for nye prosjekter pรฅ en gjeldende Node-versjon, siden den ikke legger til noen avhengighet og samsvarer med nettleser-API-et som utviklere allerede kjenner til. Velg axios nรฅr automatisk JSON-hรฅndtering, forespรธrselsavskjรฆrere eller avvisning ved feilstatuser ville lagret ekte kode. Behold request bare i eldre applikasjoner som allerede er avhengige av den, og som planlegger รฅ erstatte den.

Vanlige Node.js-serverfeil og hvordan du fikser dem

De fleste feilene nรฅr man starter en fรธrste Node-server kommer fra porter, stier eller manglende svar, snarere enn fra selve serverkoden.

  • BRUKSANVISNING: en annen prosess holder allerede porten. Kjรธr netstat -ano | findstr :7000 on Windowseller lsof -i :7000 on macOS og Linux, og stopp deretter den prosessen eller velg en annen port.
  • EACCES pรฅ lav havn: Porter under 1024 trenger forhรธyede rettigheter. Bruk en port over 1024 under utvikling, for eksempel 3000 eller 7000.
  • Nettleseren henger seg og lastes aldri: behandleren ringte aldri response.end()Forbindelsen forblir รฅpen til den fรฅr tidsavbrudd, sรฅ hver bane gjennom behandleren mรฅ avslutte svaret.
  • Finner ikke modulen 'http': Filnavnet var feilstavet, eller skriptet kjรธrer i en nettleser i stedet for Node. Kjernemoduler trenger ingen installasjon.
  • Endringer vises ikke: Noden laster inn filen รฉn gang ved oppstart. Start prosessen pรฅ nytt etter hver redigering, eller kjรธr den under en overvรฅker som f.eks. node --watch server.js.

Spรธrsmรฅl og svar

http-modulen er tilstrekkelig for et enkelt endepunkt. Express legger til ruting, mellomvare og kroppsparsing, som blir verdt avhengigheten nรฅr en applikasjon betjener flere ruter.

Krev at https modulen i stedet og send en nรธkkel og et sertifikat til createServer. I produksjon avslutter en omvendt proxy som Nginx vanligvis TLS og videresender ren HTTP til Node.

Ja. AI Verktรธy konverterer tilbakekallinger med feil fรธrst til async await pรฅ en pรฅlitelig mรฅte. Sjekk at den genererte koden legger til en response.ok-test, fordi fetch lรธser seg pรฅ 404 og den sjekken ofte utelates.

AI-assistenter leser feilkoden og navngir รฅrsaken direkte, og skiller dermed en portkonflikt fra et tillatelsesproblem eller en syntaksfeil, noe som forkorter gjettingen pรฅ et fรธrste Node-prosjekt betraktelig.

Forespรธrselsobjektet er en strรธm, sรฅ samle inn datahendelsene i en buffer og analyser resultatet pรฅ slutthendelsen. Express og lignende rammeverk tilbyr mellomvare for kroppsparsing som utfรธrer dette trinnet for deg.

Oppsummer dette innlegget med: