Een HTTP-webserver maken in Node.js met Code Voorbeeld

โšก Slimme samenvatting

Met Node.js bouw je in een paar regels een werkende webserver met behulp van de ingebouwde http-module. De server luistert op een gekozen poort en beantwoordt elk verzoek met een statuscode en een body, terwijl aparte code gegevens ophaalt van andere websites.

  • โ€‹ Server aanmaken: http.createServer registreert een callback die eenmaal per inkomend verzoek wordt uitgevoerd en verzoek- en antwoordobjecten ontvangt.
  • ๐Ÿ”ข Status en kopteksten: writeHead verzendt de statuscode en het Content-Type voordat er inhoud naar de body wordt geschreven.
  • ???? Poortbinding: `server.listen` koppelt de applicatie aan een poort, en elk vrij poortnummer kan worden gekozen.
  • ๐Ÿ“ฅ Uitgaande verzoeken: Om gegevens van een andere site op te halen, heb je een HTTP-client nodig, en Node biedt nu een algemene fetch-functie.
  • โš ๏ธ Verouderde client: De request-module is in februari 2020 afgekeurd en mag niet meer in nieuwe code worden gebruikt.
  • ๏ธ Opstartfouten: Een EADDRINUSE-fout betekent dat de gekozen poort al door een ander proces in gebruik is.

Maak een HTTP-webserver in Node.js

De Node.js Het framework wordt voornamelijk gebruikt voor het ontwikkelen van servergebaseerde applicaties. Het kan eenvoudig worden gebruikt om webservers te bouwen die content aan gebruikers leveren.

Verschillende modules verwerken servergerelateerde verzoeken, waaronder de ingebouwde http De belangrijkste module is Node.js. We gaan bekijken hoe je een eenvoudige webserverapplicatie maakt met Node.js, en vervolgens hoe je gegevens van een andere site opvraagt.

Knooppunt als een webserver die HTTP gebruikt

Laten we eens kijken naar een voorbeeld van hoe je een eerste Node.js-applicatie kunt maken en uitvoeren.

De applicatie creรซert een eenvoudige servermodule die luistert op poort 7000. Wanneer er via de browser een verzoek op die poort binnenkomt, stuurt de server een antwoord. Hallo Wereld antwoord aan de klant.

Knooppunt als een webserver die HTTP gebruikt

Code Uitleg

  1. De require functie leest een JavaScript Het bestand wordt geopend, uitgevoerd en het exportobject wordt geretourneerd. Hier wordt het bestand geladen. http module zodat de functionaliteit ervan beschikbaar is in de applicatie.
  2. Een serverapplicatie wordt gemaakt op basis van een eenvoudige functie. Deze functie wordt uitgevoerd telkens wanneer een verzoek de server bereikt.
  3. Wanneer een verzoek wordt ontvangen, wordt het antwoord verzonden met een status van 200Dit is de standaardstatuscode in een HTTP-header voor een succesvolle reactie.
  4. De responsbody zelf is de tekenreeks. Hallo Wereld.
  5. server.listen Hiermee zorgt u ervoor dat de applicatie luistert naar clientverzoeken op poort 7000. Elke beschikbare poort kan worden gebruikt.

Als de opdracht succesvol wordt uitgevoerd, verschijnt de volgende uitvoer in de browser.

uitgang

Node webserver-uitvoer

Uit de uitvoer:

  • Navigeren naar de lokale host URL Op poort 7000 wordt de tekenreeks weergegeven. Hallo Wereld op de pagina.
  • Omdat de code poort 7000 specificeert, is de uitvoer alleen zichtbaar wanneer naar die poort wordt overgeschakeld.

Hier is de code ter referentie:

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

GET-verzoeken afhandelen in Node.js

Het is in Node.js heel eenvoudig om een โ€‹โ€‹GET-verzoek te doen om gegevens van een andere site op te halen. Vroeger was hiervoor echter een ander verzoek nodig. request module, geรฏnstalleerd via de commandoregel:

npm install request

Met dat commando vraagt โ€‹โ€‹u de Node-pakketbeheerder om de benodigde module te downloaden en te installeren. Als de installatie is geslaagd, wordt de naam en versie van de geรฏnstalleerde module in de commandoregel weergegeven in de volgende vorm: <name>@<version>.

uitvoer van het npm install-verzoek

In de bovenstaande afbeelding is te zien dat... request De module en het bijbehorende versienummer zijn gedownload en geรฏnstalleerd.

Een GET-verzoek uitvoeren in Node.js

Code Uitleg

  1. De request De module die in de vorige stap is geรฏnstalleerd, biedt de functies die nodig zijn om GET-verzoeken naar websites te verzenden.
  2. Er wordt een GET-verzoek naar een website gestuurd en een callback-functie wordt uitgevoerd zodra er een reactie binnenkomt. De callback-functie ontvangt drie parameters:
    1. Fout โ€” registreert alle fouten die optreden tijdens het uitvoeren van het verzoek.
    2. antwoord โ€” bevat de HTTP-headers die met het antwoord worden teruggestuurd.
    3. Lichaam โ€” bevat de volledige inhoud van het antwoord.
  3. De inhoud die is ontvangen in de body De parameter wordt naar de console geschreven.

Hier is de code ter referentie:

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

โš ๏ธ Melding over afschaffing: the request module was volledig afgeschaft in februari 2020. en ontvangt geen verdere updates meer. Het wordt nog steeds geรฏnstalleerd en uitgevoerd, dus het bovenstaande voorbeeld blijft geldig voor bestaande projecten, maar npm install request geeft nu een waarschuwing voor verouderde functionaliteit weer. Nieuwe code moet de ingebouwde functie gebruiken. fetch De functie wordt in de volgende sectie getoond.

Hoe maak je HTTP-verzoeken met native fetch in Node.js?

Node heeft een globale functie toegevoegd. fetch Deze functie is beschikbaar sinds versie 18 en sluit aan op de API die browsers al bieden. Er is geen pakketinstallatie nodig en de functie retourneert een promise, waardoor deze direct werkt met... 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();

Drie verschillen met de callback-stijl zijn het vermelden waard. Ten eerste, fetch De verbinding wordt alleen geweigerd bij een fout op netwerkniveau; een HTTP 404 of 500 wordt nog steeds succesvol opgelost, vandaar dat... response.ok De controle bestaat en waarom het weglaten ervan de meest voorkomende fout is bij het overstappen van requestTen tweede wordt de inhoud niet met het antwoord meegeleverd; deze moet expliciet worden gelezen. response.text() voor platte tekst of response.json() voor JSON, en elk daarvan retourneert een eigen belofte. Ten derde, omdat de hele aanroep op beloftes is gebaseerd, een enkele try/catch Dit dekt zowel het verzoek als de gelezen body, en vervangt de error-first callback-parameter volledig.

Voor scripts die op Node 16 of ouder moeten draaien, installeer je het volgende: node-fetch or axios In plaats daarvan bieden beide een vergelijkbare, op beloftes gebaseerde interface en vereisen ze slechts een wijziging in de importregel zodra de runtime is geรผpgraded.

request vs fetch vs axios: welke te gebruiken?

Drie HTTP-clients komen in de meeste Node.js-documentatie voor, maar slechts รฉรฉn ervan is een verstandige standaardkeuze voor nieuw werk. Ze verschillen in onderhoudsstatus, in de vraag of er รผberhaupt een afhankelijkheid nodig is, en in de manier waarop ze een foutstatus aangeven. Daarom worden ze in de onderstaande tabel naast elkaar weergegeven.

Aspect te vragen ophalen (ingebouwd) Axios
Status Niet meer in gebruik sinds 2020. Onderhouden in de kern Actief onderhouden
Montage npm-pakket Geen op Node 18+ npm-pakket
Style Callback die eerst een fout veroorzaakt Belofte Belofte
JSON-parsing Handmatig, of een JSON-optie Handmatig via response.json() Automatisch
Afwijzingen op 404 of 500 Nee Nee Ja

Gebruik fetch voor nieuwe projecten op een huidige Node-versie, omdat het geen afhankelijkheden toevoegt en overeenkomt met de browser-API die ontwikkelaars al kennen. Kies axios Wanneer automatische JSON-verwerking, request-interceptors of het afwijzen van fouten daadwerkelijke code zouden besparen. Behoud request Alleen binnen bestaande applicaties die er al van afhankelijk zijn en die ze willen vervangen.

Veelvoorkomende Node.js-serverfouten en hoe je ze kunt oplossen

De meeste problemen bij het opstarten van een eerste Node-server worden veroorzaakt door poorten, paden of een ontbrekende reactie, in plaats van door de servercode zelf.

  • EADDRINUSE: Een ander proces bezet de poort al. Uitvoeren netstat -ano | findstr :7000 on Windowsof lsof -i :7000 on macOS En als je Linux gebruikt, stop dan dat proces of kies een andere poort.
  • EACCES op een lage poort: Poorten lager dan 1024 vereisen verhoogde privileges. Gebruik tijdens de ontwikkeling een poort hoger dan 1024, zoals 3000 of 7000.
  • De browser loopt vast en laadt nooit: De coรถrdinator heeft nooit gebeld. response.end()De verbinding blijft open totdat de time-out optreedt, dus elk pad via de handler moet het antwoord beรซindigen.
  • Kan de module 'http' niet vinden: De bestandsnaam is verkeerd gespeld, of het script wordt uitgevoerd in een browser in plaats van Node. Kernmodules hoeven niet te worden geรฏnstalleerd.
  • Er worden geen wijzigingen weergegeven: Node laadt het bestand eenmaal bij het opstarten. Herstart het proces na elke bewerking, of laat het draaien onder een watcher zoals... node --watch server.js.

Veelgestelde vragen

De http-module is voldoende voor รฉรฉn enkel eindpunt. Express voegt routing, middleware en het parsen van de body toe, wat de afhankelijkheid waard wordt zodra een applicatie meerdere routes bedient.

Vereisen de https Gebruik in plaats daarvan de module en geef een sleutel en certificaat door aan createServer. In een productieomgeving beรซindigt een reverse proxy zoals Nginx normaal gesproken TLS en stuurt het gewone HTTP door naar Node.

Ja. AI De tools zetten callbacks die eerst een fout afhandelen betrouwbaar om in async await. Controleer of de gegenereerde code een `response.ok`-test toevoegt, omdat `fetch` bij een 404-fout wordt opgelost en die controle vaak wordt weggelaten.

AI-assistenten lezen de foutcode en benoemen direct de oorzaak, waardoor een poortconflict wordt onderscheiden van een permissieprobleem of een syntaxfout. Dit vermindert het giswerk bij een eerste Node-project aanzienlijk.

Het request-object is een stream, dus verzamel de data-events in een buffer en parseer het resultaat bij de eindgebeurtenis. Express en vergelijkbare frameworks bieden middleware voor het parsen van de body, waarmee deze stap voor u wordt uitgevoerd.

Vat dit bericht samen met: