| 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: