Serie: Einführung in den MEAN Stack
- Teil 1: Definition des MEAN Stacks
- Teil 2: Setup des MEAN Stacks
- Teil 3: Node.js
- Teil 4: npm
- Teil 5: Connect
- Teil 6: Express
- Teil 7: MongoDB
- Teil 8: Mongoose
- Teil 9: REST
- Teil 10: Baucis
- Teil 11: Bower
- Teil 12: AngularJS
- Teil 13: Restangular
Heute stelle ich euch das Framework Express vor, welches das am meisten beobachtete Modul bei npm ist. Außerdem erkläre ich euch das Konzept einer Route.
Express setzt auf Connect auf und wird ebenfalls von TJ Holowaychuk entwickelt. Es erweitert Connect um zusätzliche Middleware und eine API für Routing. Der Begriff Routing steht in diesem Fall für die Zuweisung von URLs (und HTTP Methoden) zu einer Middleware. So können verschiedene Bereiche einer Webseite unterschiedliche Middleware verwenden. Wenn ein bestimmter Bereich einer Webseite bspw. Passwort geschützt sein soll, kann explizit nur für diesen Bereich eine entsprechende Authentifizierungsmiddleware verwendet werden.
Die vorigen Beispiele des HTTP- und Dateiservers werden nun mit Express zusammengefasst. In einen neuen Projektordner müsst ihr zunächst Express installieren:
$ npm install express
Zum Zeitpunkt des Schreibens ist die aktuellste Version von Express 3.4.0. Nachfolgend der Code für den Server in einer neuen Datei server.js
:
var express = require('express');
express()
.get('/', function(req, res){
res.send('Hello World');
})
.use(express.static(__dirname))
.listen(1337, '127.0.0.1');
Der Servercode ist fast identisch zu dem Beispiel mit Connect. Express übernimmt jede Middleware von Connect, sodass express.static
anstatt connect.static
verwendet werden kann. Neu ist folgender Abschnitt:
.get('/', function(req, res){
res.send('Hello World');
})
Dieser Abschnitt erinnert etwas an das erste Codebeispiel mit dem http
Modul. Nur die Funktion get
ist neu. Sie ähnelt use
, nimmt aber neben der Middleware als zweiten Parameter eine Route als ersten Parameter entgegen. In diesem Fall ist die Route die URL der Wurzel: /
. Die Route könnte jedoch auch jeder beliebige andern String als URL oder ein regulärer Ausdruck sein. Das get
steht für die entsprechende HTTP-Methode, sodass diese Route und diese Middleware nur bei einer GET
-Anfrage für die URL /
durchgeführt werden. Analog gibt es für jede HTTP-Methode eine entsprechende Funktion von Express, um spezifische Routes und Middleware für diese festzulegen: express.post
, express.delete
, etc.
Gibt man nun http://127.0.0.1:1337/ in den Browser ein, so erhält man nicht mehr die Fehlermeldung „Cannot GET /“, sondern ein „Hello World“. (Anmerkung: Wenn ihr über den Browser eine URL aufruft, wird standardmäßig immer eine GET
-Anfrage durchgeführt.) Über http://127.0.0.1:1337/server.js erhält man abermals die Datei server.js
.
Was ist aber, wenn bereits eine Route für die URL http://127.0.0.1:1337/server.js existiert? Das können wir durch ein leicht verändertes Beispiel einfach testen:
var express = require('express');
express()
.get('/', function(req, res){
res.send('Hello World');
})
.get('/server.js', function(req, res){
res.send('This should be the server.js!');
})
.use(express.static(__dirname))
.listen(1337, '127.0.0.1');
Ruft man nun http://127.0.0.1:1337/server.js auf, so erhält man die Meldung „This should be the server.js!“ anstatt den Inhalt der Datei server.js
. Das liegt an der Reihenfolge in der die Middleware festgelegt wurde! Unsere eigene Middleware für die Route /server.js
wurde vor dem statischen Dateiserver definiert und wird deswegen als erstes ausgeführt. Es hängt anschließend von der Middleware ab, ob nachfolgende Middleware noch aufgerufen wird oder nicht. In diesem Fall beenden wir mit der Methode res.send
in unserer eigenen Middleware das Aufrufen von weiterer Middleware. Auf diese Weise könnte man bspw. eine Authentifizierungsmiddleware programmieren, welche nicht-authentifizierte Nutzer blockieren und authentifizierte Nutzer zum statischen Dateiserver durchlassen soll.
Ein Beispiel für eine reale und komplexe Webseite, die auf Express basiert, ist übrigens MySpace.
Diese Grundlagen genügen für die ersten Gehversuche in Node. Im nächsten Artikel erkläre ich euch erst einmal MongoDB.