Node.js Request/Response-Parameter
Willemers Informatik-Ecke
Ein erstes Serverprogramm für HTTP Ein Webserver, der Dateien ausgibt

Auslesen des Anfrageparameters request

Der Parameter request liefert den Zugang zu den Informationen, die vom Client in seiner Anfrage mitgesandt wird.
const url = request.url;
const method = request.method;
const headers = request.headers;
Mit dem folgenden Aufruf können Header, Methode und aufgerufene URL mit einer Zuweisung ausgelesen werden:
const { headers, method, url } = request;

Auslesen der Header

Es können die Header-Bereiche des HTTP-Pakets ausgelesen werden. Eine komplette Liste der Header-Einträge erzeugt der folgende Befehl:
console.log(JSON.stringify(request.headers));
Die Ausgabe ist beispielsweise:
{"host":"localhost:8080",
 "user-agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) ... Firefox/94.0",
 "accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
 "accept-language":"de,en-US;q=0.7,en;q=0.3",
 "accept-encoding":"gzip, deflate",
 "dnt":"1",
 "connection":"keep-alive",
 "cookie":"csrftoken=evOF...357431; session_id=99999",
 "upgrade-insecure-requests":"1",
 "sec-fetch-dest":"document",
 "sec-fetch-mode":"navigate",
 "sec-fetch-site":"none",
 "sec-fetch-user":"?1",
 "cache-control":"max-age=0"
}
Um das Feld "user-agent" und damit den Browser des Aufrufers auf der Console anzuzeigen, wird die Zeichenkette als Index verwendet:
const {headers} = request; // oder: const headers = request.headers;
console.log("Aufgerufen mit dem Browser: "+headers['user-agent']);

Der Request-Body

Der Body des Request-Parameters enthält die Daten, die der Client an den Server sendet. Das tritt eigentlich vor allem bei POST-Nachrichten aus Formularen auf.

Diese werden eventuell stückweise geliefert. Darum müssen die Datenpakete so lange zusammengesetzt werden, bis mit "end" das letzte Paket signalisiert wird.

Erst dann kann der Body-Inhalt weiterverarbeitet werden.

var server = http.createServer(function(request, response) {
    // ...
    } else if (request.url==='/newuser' && request.method==='POST') {
        let postBody = "";
        // Die Daten kommen in mehreren data-Blöcken
        request.on("data", function(chunk) {
            postBody += chunk;
        });
        // Die Daten werden mit einem end-Block abgeschlossen
        request.on("end", function() {
            console.log(postBody); // Der gesamte Body wird ausgegeben
            // Auslesen der Parameter ...
            response.writeHead(200); // Antwort an Client
            response.end(msg);
        });
    }
       // ...
});

Antworten an den Client: response

Die Variable response wird an den Client als Antwort zurückgesendet.

Der Status-Code zeigt eventuelle Fehler an. Beispielsweise könnte der Server den Status-Code auf 404 setzen, wenn eine gesuchte Datei nicht vorliegt.

response.statusCode = 404;
Wird kein Status-Code angegeben, wird 200 gesandt.

Header

Auch der Server sendet Informationen über den HTTP-Header. Diese werden über die Methode setHeader übergeben.
response.setHeader('Content-Type', 'text/html');

Der Status-Code kann auch durch die Methode writeHead gesendet werden.

response.writeHead(200);
Die Statusausgabe in writeHead kann durch die Headerattribute ergänzt werden.
response.writeHead(201, {"content-type": "text/plain"});

Dateninhalte

Durch die Methode write können die Inhalte an den Client gesendet werden.

response.write("Hallo Welt");

Mit der Methode end wird das Ende der Übertragung signalisiert.

response.end(); 
Man kann auch write und end zusammenfassen, indem die Ausgabe als Parameter an end übergeben wird.
response.end("Hallo nochmal");

Beispiel

Der folgende Server setzt den Content-Type und gibt als Status 201 zurück. Als Text liefert er einfach Hallo Welt.
const http = require("http"); // Einbinden von http
  
var server = http.createServer(function (request, response) {
    const {headers, method, url} = request;
    console.log(url);
    console.log(method);
    console.log(headers['user-agent']);
    response.writeHead(201, {"content-type": "text/plain"});
    response.end("Hallo Welt"); // Browser-Inhalt
});
server.listen(8080, "localhost", function () {
    console.log("Server gestartet");
});
Zum Test wird der Befehl curl verwendet.
$ curl -v http://localhost:8080
* Rebuilt URL to: http://localhost:8080/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.58.0
> Accept: */*
> 
< HTTP/1.1 201 Created
< content-type: text/plain
< Date: Sun, 28 Nov 2021 09:21:29 GMT
< Connection: keep-alive
< Transfer-Encoding: chunked
< 
* Connection #0 to host localhost left intact
Hallo Welt

Auf dem Server gab es durch den Aufruf von console.log folgende Zeilen:

$ node server1.js 
Server gestartet
/
GET
curl/7.58.0