Express vs. Koa: JavaScript-Webframeworks im Vergleich

Seite 2: req und res

Inhaltsverzeichnis

A propos Konfiguration: Die Einstellung "json spaces" ist im Modus "development" standardmäßig nicht mehr aktiv. Das bedeutet, dass Express JSON-Ausgaben nicht mehr formatiert an den Webbrowser sendet, sondern in kompakter Form. Die Formatierung lässt sich jedoch leicht wiederherstellen:

if (app.get('env') === 'development') {
app.set('json spaces', 2);
}

Ähnlich wie mit der Funktion app.configure() verhält es sich mit dem Objekt app.router, mit dem man den Zeitpunkt des Ausführens von Routen im Verhältnis zu Middleware-Modulen festlegen konnte. So war es beispielsweise möglich, Routen vor dem Ausliefern statischer Dateien auszuführen:

app.use(app.router);
app.use(express.static(...));

app.get('/', ...);

Auch das Objekt app.router ist gänzlich entfallen. Express 4 sieht vor, dass Routen wie Middleware-Module behandelt werden und dementsprechend im Quellcode vor diesen zu definieren sind, wenn sie vor ihnen ausgeführt werden sollen:

app.get('/', ...);

app.use(express.static(...));

Das spart nicht nur eine Zeile Code, sondern ermöglicht vor allem eine weitaus genauere Kontrolle darüber, welcher Code wann ausgeführt wird. In Express 4 ist es erstmals möglich, einige Routen vor und andere erst nach einem Middleware-Modul auszuführen, indem man die Definitionen der einzelnen Routen entsprechend um den Aufruf von app.use() anordnet.

Entfallen ist in Express 4 außerdem die Funktion express.createServer(). Um eine Express einsetzende Webanwendung zu starten, verbleiben daher zwei Möglichkeiten: Einerseits lässt sich die Funktion app.listen() unter Angabe einer Portnummer und optional eines Hostnamens aufrufen. Sie ist identisch zu der in Node.js integrierten Funktion http.Server#listen() und verhält sich daher so wie sie.

Andererseits lässt sich das app-Objekt als Funktion an den Aufruf der createServer-Funktion des http- beziehungsweise https-Moduls übergeben, sodass man eine Webanwendung gleichzeitig über HTTP und HTTPS bereitstellen kann. Diese Methode ist flexibler und daher in der Praxis häufig vorzuziehen:

var http = require('http'),
https = require('https');

var express = require('express');

var app = express();

// ...

http.createServer(app).listen(80);
https.createServer(app).listen({ ... }, 443);

Entfallen sind außerdem auch einige Erweiterungen des res-Objekts, die in Express 4 daher nicht mehr zu Verfügung stehen. Sie umfassen unter anderem die Eigenschaft res.charset und das header-Ereignis des res-Objekts.

Ähnlich verhält es sich mit der Eigenschaft res.headerSent, die Express allerdings nicht ersatzlos gestrichen hat: An ihre Stelle tritt die von Node.js serienmäßig bereitgestellte Eigenschaft res.headersSent.

Die Funktion res.location(), die den Location-Header zuweist, verhält sich in Express 4 in Bezug auf relative URLs wie die Funktion res.redirect(): Beide lösen relative Adressen nicht selbst auf, sondern überlassen dies dem Webbrowser. Es gilt also, darauf zu achten, von vornherein eine absolute URL bereitzustellen.

Die übrigen Änderungen an den Objekten req und res betreffen lediglich Typänderungen von Eigenschaften:

  • Die Eigenschaft res.locals ist in Express 4 ein Objekt statt wie bisher eine Funktion. Das bedeutet, dass man Werte, die Express der auszugebenden View zur VerfĂĽgung stellen soll, direkt zuweisen kann.
  • req.params ist nun ebenfalls ein Objekt statt wie zuvor ein Array.
  • Die Funktion req.is(), die den Content-Type der eingehenden Anfrage ermittelt, greift intern nun auf das ausgelagerte Modul type-is zurĂĽck.
  • Die Funktion req.accepted() heiĂźt in Express 4 req.accepts() und greift intern ebenfalls auf ein ausgelagertes Modul zu, in diesem Fall auf accepts. Zusätzlich stehen die Funktionen req.acceptsCharsets(), req.acceptsEncodings() und req.acceptsLanguages() zur VerfĂĽgung.