POST-Auswertung mit Node.js
Willemers Informatik-Ecke
Ein Webserver, der Dateien ausgibt Datei-Upload

Für die Auswertung von Web-Formularen muss einerseits eine einfache HTML-Datei an den Client geliefert werden und anschließend auf die POST-Methode des Formulars reagiert werden.

Die Datei formular.htm enthält im Kern eine FORM:

<form action="/newuser" method="POST">
    <label>User: </label>
    <input type="text" name="user">
    <label>E-Mail: </label>
    <input type="text" name="email">
    <button>OK</button>
</form>
Diese Datei muss vom Server an den Client gesandt werden, sobald die URL / angesprochen wird.
const http = require("http"); // Einbinden von http
const fs = require("fs"); // Einbinden von fs

var server = http.createServer(function(request, response) {
    if (request.url === "/") { // sende die Formulardatei
        fs.readFile("formular.htm", function(error, data) {
            if (data) {
                response.setHeader('Content-Type', 'text/html');
                response.writeHead(200);
                response.end(data.toString());
            } else { // error
                response.writeHead(500);
                response.write(error.toString());
                response.end("\nDateifehler");
            }
        });
Nach dem Ausfüllen des Formulars wird der OK-Button eine POST-Anfrage mit der Action /newuser auslösen. Die muss aufgefangen und bearbeitet werden.
var server = http.createServer(function(request, response) {
    if (request.url === "/") { // sende die Formulardatei
        // ... wie oben gezeigt
    } else if (request.url==='/newuser' && request.method==='POST') {
         // werte POST mit action /newuser aus ... siehe unten
    } else { // irgendetwas ist schiefgelaufen
        response.writeHead(404);
        response.end("Nichts da");
    }
});
server.listen(8080, "localhost", function () {
    console.log("Server gestartet");
});
Wenn per POST Daten kommen, müssen diese nicht in einem Rutsch kommen. Darum werden die eingehenden Pakete nach data und nach end unterschieden. Erst beim Eintreffen des end ist alles angekommen und kann ausgewertet werden.
    } else if (request.url==='/newuser' && request.method==='POST') {
         // werte POST des Formulars mit action /newuser aus
         let postBody = "";
         request.on("data", function(chunk) {
             postBody += chunk;
         });
         request.on("end", function() {
             // postBody enthält etwas wie: user=Huhu&email=huhu%40provider.de
             // ...
         });
    } else { // irgendetwas ist schiefgelaufen

Auswerten des POST-Body

Die Variable postBody enthält nun die Zuweisungspaare, die jeweils durch Ampersands unterteilt sind. Diese lassen sich durch die Parse-Methode von querystring so zerlegen, dass sie anschließend über Assozationen zugegriffen werden können:
             const msg = "Neuer Benutzer: "+params['user']+
                     " mit Mail-Adresse: "+params['email'];
             response.writeHead(200);
             response.end(msg);
Dazu muss per require aber querystring eingebunden werden.
const qs = require("querystring");
Zusammengesetzt sieht der komplette Server so aus:
const http = require("http"); // Einbinden von http
const fs = require("fs"); // Einbinden von fs
const qs = require("querystring"); // Auswerten von Query-Strings

var server = http.createServer(function(request, response) {
    if (request.url === "/") { // sende die Formulardatei
        fs.readFile("formular.htm", function(error, data) {
            if (data) {
                response.setHeader('Content-Type', 'text/html');
                response.writeHead(200);
                response.end(data.toString());
            } else { // error
                response.writeHead(500);
                response.write(error.toString());
                response.end("\nDateifehler");
            }
        });
    } else if (request.url==='/newuser' && request.method==='POST') {
         // werte POST des Formulars mit action /newuser aus
         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); // user=Huhu&email=huhu%40provider.de
             const params = qs.parse(postBody);
             const msg = "Neuer Benutzer: "+params['user']+
                     " mit Mail-Adresse: "+params['email'];
             response.writeHead(200);
             response.end(msg);
         });
    } else { // irgendetwas ist schiefgelaufen
        response.writeHead(404);
        response.end("Nichts da");
    }
});
server.listen(8080, "localhost", function () {
    console.log("Server gestartet");
});
Wird dies über localhost:8080 aufgerufen, erscheint folgendes Formular.

Nach Klicken auf OK erscheint folgende Meldung: