Kodokon kodokon.com

Dein erster nativer HTTP-Server

Du erstellst mit dem Modul http von Node einen Webserver, beantwortest Anfragen und lieferst JSON zurück.

10 Min. · 3 Fragen

Diese Lektion in Kodokon öffnen

Ein Webserver ist ein Programm, das ununterbrochen läuft und auf Anfragen wartet: Aufforderungen, die ein Client sendet (ein Browser, eine Mobil-App und so weiter). Auf jede Anfrage gibt er eine Antwort zurück. Dieser Dialog folgt dem Protokoll HTTP, der gemeinsamen Sprache des Webs. Node bringt ein einsatzbereites Modul http mit: nichts zu installieren. Ein letzter Begriff: der Port, eine Zahl, die ein bestimmtes Programm auf einem Rechner identifiziert, wie eine Wohnungsnummer in einem Haus. Wir verwenden den Port 3000; localhost bezeichnet schlicht deinen eigenen Rechner.

JAVASCRIPT
import http from "node:http";

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader("Content-Type", "text/plain");
  res.end("Hello from my server!");
});

server.listen(3000, () => {
  console.log("Server at http://localhost:3000");
});
Speichere diesen Code in server.js und führe dann node server.js aus.

Sehen wir es uns im Detail an. http.createServer bekommt eine Funktion, die bei jeder Anfrage aufgerufen wird, mit zwei Parametern: req (die eingehende Anfrage) und res (die entstehende Antwort). res.statusCode = 200 setzt den Statuscode - 200 bedeutet "alles in Ordnung". res.setHeader fügt einen Header hinzu, also eine Metainformation über die Antwort: hier ihr Format, reiner Text. res.end sendet die Antwort und schließt sie ab. Und schließlich lässt server.listen(3000) den Server auf Port 3000 lauschen. Öffne http://localhost:3000 in deinem Browser: Dein Text erscheint. Beachte, dass das Programm die Kontrolle nicht zurückgibt: Es wartet auf Anfragen. Beende es mit Strg+C.

Moderne Server liefern selten reinen Text: Sie stellen APIs bereit, die in JSON antworten, jenem Textformat, das du schon kennst und das jede Sprache versteht. Zwei Anpassungen: Der Header Content-Type wird zu application/json und das JavaScript-Objekt wird mit JSON.stringify in Text umgewandelt. Nutzen wir die Gelegenheit, je nach req.url unterschiedlich zu reagieren, also je nach dem vom Client angefragten Pfad: Das ist die Grundlage des Routings.

JAVASCRIPT
import http from "node:http";

const server = http.createServer((req, res) => {
  res.setHeader("Content-Type", "application/json");

  if (req.url === "/api/message") {
    const body = { message: "Hello!", ok: true };
    res.statusCode = 200;
    res.end(JSON.stringify(body));
    return;
  }

  res.statusCode = 404;
  res.end(JSON.stringify({ error: "Not found" }));
});

server.listen(3000, () => {
  console.log("http://localhost:3000/api/message");
});
Eine bekannte Route antwortet mit 200 und einem JSON-Objekt; jeder andere Pfad bekommt einen 404.

Der Statuscode 404 bedeutet "nicht gefunden": Der angefragte Pfad passt zu keiner bekannten Route. Beachte das return nach der ersten Antwort: Es verhindert, dass der Code weiterläuft und eine zweite Antwort sendet, was einen Fehler auslösen würde. Zum Testen öffnest du die Adresse im Browser oder nutzt curl, ein Kommandozeilen-Werkzeug, das HTTP-Anfragen sendet und die Antwort im Terminal anzeigt.

BASH
curl http://localhost:3000/api/message
In einem zweiten Terminal, während der Server läuft: Die JSON-Antwort erscheint.

Wissenscheck

Stelle sicher, dass du die wichtigsten Punkte dieser Lektion behalten hast.

  1. Was macht server.listen(3000)?
    • Es lässt den Server auf Port 3000 auf Anfragen lauschen
    • Es sendet eine Anfrage an Port 3000
    • Es begrenzt den Server auf 3000 gleichzeitige Anfragen
    • Es öffnet den Browser auf localhost:3000
  2. Welchen Header sendest du, um anzuzeigen, dass die Antwort JSON ist?
    • Accept: application/json
    • Content-Type: application/json
    • Format: json
  3. Warum schickst du das Objekt vor res.end durch JSON.stringify?
    • Um die Antwort zu komprimieren und Zeit zu sparen
    • Um zu prüfen, dass das Objekt keinen Fehler enthält
    • Weil eine HTTP-Antwort Text transportiert, kein JavaScript-Objekt