Node.js Express
Willemers Informatik-Ecke
POST-Formular und Auswertung Server-Sent-Events: Der Server ruft den Client

Express ist ein externes Modul für Node.js. Es dient in erster Linie zum sogenannten Routing.

Installation

Wenn Express im Server verwendet werden soll, muss es installiert werden. Das funktioniert einmal über den Befehl npm. Das muss dann bei jedem Projekt erneut durchgeführt werden.
npm install express

Routing

Anfragen über HTTP tragen üblicherweise die URL und damit den Pfad innerhalb des Server-Dateisystems mit sich und den HTTP-Befehl.

const http = require("http"); // Einbinden von http
// ...
var server = http.createServer(function(request, response) {
    if (request.url==='/newuser' && request.method==='POST') {
        // ...
    }
});

In einem HTTP-Server folgen daraufhin typischerweise eine Kaskade von Fallunterscheidungen nach Pfaden und Befehlen. Auf diese Weise bläht die Callback-Funktion von createServer immer mehr auf.

Express legt eine Abstraktionsschicht über Node.js. Das Listing oben würde die Callback-Funktion in eigene Funktionen von express zerschlagen.

const express = require("express");
// ...
var app = express();

app.post("/newuser", function(request, response) {
   // ...
});

app.listen(8080);
Statt eine große Funktion, in denen eine Fallunterscheidung nach URL und Methode durchgeführt wird, werden einzelne Methoden der Express-Instanz für die Methoden (get, post, ...) angelegt. Der Parameter ist der Pfad der URL. Die Funktion wird als asynchroner Callback mit den Parametern request und response aufgerufen.

Für den Pfad können auch Wildcards verwendet werden.

Statische Dateien

In vielen Fällen sollen statische Dateien einfach ausgeliefert werden. Der Server soll alle Dateien, die unter einem bestimmten Verzeichnis liegen - hier beispielsweise static - einfach ausliefern, ähnlich wie das ein normaler Webserver tut.
app.get("/static/*", function(request, response) {
    fs.readFile("static/"+request.params[0], 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");
        }
    });
});
Dazu wird als Pfad static verwendet. Der Stern sorgt dafür, dass alle Dateinamen unterhalb des Ordners durchgereicht werden. Innerhalb der Funktion kann der Dateiname über request.params[0] ausgelesen werden.

Wird hier localhost:8080/static/info.htm in der Adresszeile des Browsers eingetragen, wird im Serververzeichnis static nach dieser Datei gesucht. Sie wird mit fs.readFile ausgeliefert. Falls sie nicht gefunden werden sollte, wird die Funktion den Fehlerstatus 500 zurückliefern.

Verteilung auf Module

Sollen bestimmte Bereiche auf andere Quellcode-Dateien verteilt werden, wird die Methode use verwendet.
const kunden = require("./kunden"); // kunden.js wird eingebunden
app.use("/kunde", kunden);          // Verzeichnis /kunde leitet nach kunden.js
Der Aufruf von require wird die Datei kunden.js im gleichen Verzeichnis einbinden. Die Methode use sorgt dafür, dass Anfragen an localhost:8080/kunde an diese ausgelagerte Programmdatei weitergereicht wird.

Die Datei kunden.js muss ihrerseits express einbinden. Hier arbeitet es die GET-Anfragen auf / ab, die sich allerdings auf das virtuelle Unterverzeichnis /kunde bezieht, das oben festgelegt wurde.

const express = require("express");
const router  = express.Router();

router.get("/", function(request, response) {
    response.end("Hier sind die Kunden");
});

module.exports = router;