Wechsel zu Express 4
Ăberblick
Express 4 bietet grundlegende VerÀnderungen im Vergleich zu Express 3. Das bedeutet, dass eine Express 3-Anwendung nicht funktioniert, wenn Sie die Express-Version in ihren AbhÀngigkeiten aktualisieren.
In diesem Beitrag werden folgende Themen behandelt:
- Ănderungen in Express 4
- Beispiel fĂŒr die Migration einer Express 3-Anwendung auf Express 4
- Upgrade auf den Express 4 App Generator
Ănderungen in Express 4
In Express 4 wurden einige signifikante Ănderungen vorgenommen:
- Changes to Express core and middleware system. The dependencies on Connect and built-in middleware were removed, so you must add middleware yourself.
- Ănderungen am Weiterleitungssystem (Routingsystem).
- Weitere Ănderungen.
Siehe hierzu auch:
Ănderungen am Express-Core- und Middlewaresystem
In Express 4 bestehen keine AbhÀngigkeiten mehr zu Connect. Alle integrierten Middlewarefunktionen werden aus dem Core entfernt. Ausgenommen hiervon ist die Funktion express.static. Das bedeutet, dass Express nun ein unabhÀngiges Routing- und Middleware-Web-Framework ist und Express-Versionierung und -Releases von Middleware-Updates nicht betroffen sind.
Ohne integrierte Middleware mĂŒssen Sie explizit alle Middlewarefunktionen hinzufĂŒgen, die fĂŒr die AusfĂŒhrung Ihrer Anwendung erforderlich sind. Befolgen Sie einfach diese Schritte:
- Installieren des Moduls:
npm install --save <modulname> - Anfordern des Moduls in Ihrer Anwendung:
require('modulname') - Verwendung des Moduls gemÀà Dokumentation:
app.use( ... )
In der folgenden Tabelle sind Express 3-Middlewarefunktionen und deren Entsprechungen in Express 4 aufgelistet.
| Express 3 | Express 4 |
|---|---|
express.bodyParser |
body-parser + multer |
express.compress |
compression |
express.cookieSession |
cookie-session |
express.cookieParser |
cookie-parser |
express.logger |
morgan |
express.session |
express-session |
express.favicon |
serve-favicon |
express.responseTime |
response-time |
express.errorHandler |
errorhandler |
express.methodOverride |
method-override |
express.timeout |
connect-timeout |
express.vhost |
vhost |
express.csrf |
csurf |
express.directory |
serve-index |
express.static |
serve-static |
Hier finden Sie die komplette Liste der Express 4-Middleware.
In den meisten FÀllen können Sie einfach nur die Middleware der alten Version 3 durch deren Entsprechung in Express 4 ersetzen. Details hierzu finden Sie in der modulspezifischen Dokumentation in GitHub.
app.use akzeptiert Parameter.
In Version 4 können Sie ĂŒber einen Variablenparameter den Pfad definieren, in den Middlewarefunktionen geladen werden. Dann können Sie den Wert des Parameters aus dem Routenhandler laden. Beispiel:
app.use('/book/:id', (req, res, next) => {
console.log('ID:', req.params.id)
next()
})
Das Routingsystem
Anwendungen laden nun implizit Routing-Middleware. Sie mĂŒssen sich also keine Gedanken mehr ĂŒber die Reihenfolge machen, in der die Middleware in Bezug auf die router-Middleware geladen wird.
Das Routingsystem verfĂŒgt jedoch ĂŒber zwei neue Funktionen, die beim Organisieren Ihrer Weiterleitungen helfen:
- Die neue Methode
app.route()zum Erstellen verkettbarer Routenhandler fĂŒr einen Weiterleitungspfad - Die neue Klasse
express.Routerzum Erstellen modular einbindbarer Routenhandler
Die Methode app.route()
Die neue Methode app.route() hilft beim Erstellen verkettbarer Routenhandler fĂŒr einen Weiterleitungspfad. Da der Pfad an einer einzelnen Position angegeben wird, ist das Erstellen modularer Weiterleitungen hilfreich, da Redundanzen und Schreibfehler reduziert werden. Weitere Informationen zu Weiterleitungen finden Sie in der Dokumentation zu Router().
Dies ist ein Beispiel fĂŒr verkettete Routenhandler, die mit der Funktion app.route() definiert werden.
app.route('/book')
.get((req, res) => {
res.send('Get a random book')
})
.post((req, res) => {
res.send('Add a book')
})
.put((req, res) => {
res.send('Update the book')
})
Die Klasse express.Router
Eine weitere Funktion, die beim Organisieren von Weiterleitungen hilft, ist die neue Klasse express.Router. Ăber diese Klasse können Sie modular einbindbare Routenhandler erstellen. Eine Router-Instanz ist ein vollstĂ€ndiges Middleware- und Routingsystem. Aus diesem Grund wird diese Instanz oft auch als "Mini-App" bezeichnet.
Im folgenden Beispiel wird ein Router als Modul erstellt, Middleware in das Modul geladen, es werden Weiterleitungen definiert und das Modul letztendlich in einen Pfad in der Hauptanwendung eingebunden.
Beispiel: Erstellen Sie eine Routerdatei namens birds.js mit dem folgenden Inhalt im Anwendungsverzeichnis:
var express = require('express')
var router = express.Router()
// middleware specific to this router
router.use((req, res, next) => {
console.log('Time: ', Date.now())
next()
})
// define the home page route
router.get('/', (req, res) => {
res.send('Birds home page')
})
// define the about route
router.get('/about', (req, res) => {
res.send('About birds')
})
module.exports = router
Laden Sie dann das Routermodul in die Anwendung:
var birds = require('./birds')
// ...
app.use('/birds', birds)
Die Anwendung kann nun Anforderungen an die Pfade /birds und /birds/about bearbeiten und ruft die Middleware timeLog auf, die speziell fĂŒr diese Weiterleitung bestimmt ist.
Weitere Ănderungen
In der folgenden Tabelle sind andere kleinere, aber trotzdem wichtige Ănderungen in Express 4 aufgefĂŒhrt:
| Objekt | Beschreibung |
|---|---|
| Node.js | Express 4 erfordert Node.js 0.10.x oder höher und unterstĂŒtzt nicht mehr Node.js 0.8.x. |
|
|
Das Modul |
|
|
Die Funktion |
|
|
Die Anwendungseigenschaft |
|
|
Verwenden Sie |
|
|
Löst keine relativen URLs mehr auf. |
|
|
War bisher ein Array, ist nun ein Objekt. |
|
|
War bisher eine Funktion, ist nun ein Objekt. |
|
|
GeÀndert in |
|
|
Nun verfĂŒgbar als |
|
|
Entfernt. |
|
|
Entfernt. |
|
|
Die FunktionalitÀt ist nun auf die Einstellung des Basis-Cookiewerts begrenzt. Verwenden Sie |
Beispiel fĂŒr eine Anwendungsmigration
Dies ist ein Beispiel fĂŒr die Migration einer Express 3-Anwendung auf Express 4.
Die dabei interessanten Dateien sind app.js und package.json.
Anwendung der Version 3
app.js
Es wird eine Express v.3-Anwendung mit der folgenden Datei app.js angenommen:
var express = require('express')
var routes = require('./routes')
var user = require('./routes/user')
var http = require('http')
var path = require('path')
var app = express()
// all environments
app.set('port', process.env.PORT || 3000)
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'pug')
app.use(express.favicon())
app.use(express.logger('dev'))
app.use(express.methodOverride())
app.use(express.session({ secret: 'your secret here' }))
app.use(express.bodyParser())
app.use(app.router)
app.use(express.static(path.join(__dirname, 'public')))
// development only
if (app.get('env') === 'development') {
app.use(express.errorHandler())
}
app.get('/', routes.index)
app.get('/users', user.list)
http.createServer(app).listen(app.get('port'), () => {
console.log('Express server listening on port ' + app.get('port'))
})
package.json
Die zugehörige package.json-Datei der Version 3 sieht in etwa wie folgt aus:
{"name":"application-name","version":"0.0.1","private":true,"scripts":{"start":"node app.js"},"dependencies":{"express":"3.12.0","pug":"*"}}Prozess
Beginnen Sie den Migrationsprozess mit der Installation der erforderlichen Middleware fĂŒr die Express 4-Anwendung und der Aktualisierung von Express und Pug auf die aktuellen Versionen. Verwenden Sie hierzu den folgenden Befehl:
$ npm install serve-favicon morgan method-override express-session body-parser multer errorhandler express@latest pug@latest --save
Nehmen Sie an app.js die folgenden Ănderungen vor:
-
Die integrierten Express-Middlewarefunktionen
express.favicon,express.logger,express.methodOverride,express.session,express.bodyParserundexpress.errorHandlersind im Objektexpressnicht mehr verfĂŒgbar. Sie mĂŒssen deren Alternativen manuell installieren und in die Anwendung laden. -
Sie mĂŒssen die Funktion
app.routernicht mehr laden. Sie ist kein gĂŒltiges Express 4-Anwendungsobjekt. Entfernen Sie also den Codeapp.use(app.router);. -
Stellen Sie sicher, dass die Middlewarefunktionen in der richtigen Reihenfolge geladen werden â laden Sie
errorHandlernach dem Laden der Anwendungsweiterleitungen.
Anwendung der Version 4
package.json
Durch AusfĂŒhrung des Befehls npm wird package.json wie folgt aktualisiert:
{"name":"application-name","version":"0.0.1","private":true,"scripts":{"start":"node app.js"},"dependencies":{"body-parser":"^1.5.2","errorhandler":"^1.1.1","express":"^4.8.0","express-session":"^1.7.2","pug":"^2.0.0","method-override":"^2.1.2","morgan":"^1.2.2","multer":"^0.1.3","serve-favicon":"^2.0.1"}}app.js
Entfernen Sie dann ungĂŒltigen Code, laden Sie die erforderliche Middleware und nehmen Sie andere Ănderungen nach Bedarf vor. Die Datei app.js sieht dann wie folgt aus:
var http = require('http')
var express = require('express')
var routes = require('./routes')
var user = require('./routes/user')
var path = require('path')
var favicon = require('serve-favicon')
var logger = require('morgan')
var methodOverride = require('method-override')
var session = require('express-session')
var bodyParser = require('body-parser')
var multer = require('multer')
var errorHandler = require('errorhandler')
var app = express()
// all environments
app.set('port', process.env.PORT || 3000)
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'pug')
app.use(favicon(path.join(__dirname, '/public/favicon.ico')))
app.use(logger('dev'))
app.use(methodOverride())
app.use(session({
resave: true,
saveUninitialized: true,
secret: 'uwotm8'
}))
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
app.use(multer())
app.use(express.static(path.join(__dirname, 'public')))
app.get('/', routes.index)
app.get('/users', user.list)
// error handling middleware should be loaded after the loading the routes
if (app.get('env') === 'development') {
app.use(errorHandler())
}
var server = http.createServer(app)
server.listen(app.get('port'), () => {
console.log('Express server listening on port ' + app.get('port'))
})
Wenn Sie nicht direkt mit dem Modul http arbeiten mĂŒssen (socket.io/SPDY/HTTPS), ist das Laden des Moduls nicht erforderlich. Die Anwendung kann dann einfach wie folgt gestartet werden:
app.listen(app.get('port'), () => {
console.log('Express server listening on port ' + app.get('port'))
})
Anwendung ausfĂŒhren
Der Migrationsprozess ist abgeschlossen und die Anwendung ist nun eine Express 4-Anwendung. Zum BestÀtigen starten Sie die Anwendung mit dem folgenden Befehl:
$ node .
Laden Sie http://localhost:3000 und sehen Sie, wie die Homepage von Express 4 wiedergegeben wird.
Upgrade auf den Express 4 App Generator
Das Befehlszeilentool zum Generieren einer Express-Anwendung ist nach wie vor express. FĂŒr ein Upgrade auf die neue Version mĂŒssen Sie jedoch den Express 3 App Generator deinstallieren und dann den neuen Generator express-generator installieren.
Installation
Wenn der Express 3 App Generator bereits auf Ihrem System installiert ist, mĂŒssen Sie diesen deinstallieren:
$ npm uninstall -g express
AbhĂ€ngig davon, wie Ihre Datei- und Verzeichnissberechtigungen konfiguriert sind, mĂŒssen Sie diesen Befehl möglicherweise mit sudo ausfĂŒhren.
Installieren Sie nun den neuen Generator:
$ npm install -g express-generator
AbhĂ€ngig davon, wie Ihre Datei- und Verzeichnissberechtigungen konfiguriert sind, mĂŒssen Sie diesen Befehl möglicherweise mit sudo ausfĂŒhren.
Nun wird der Befehl express auf Ihrem System auf den Express 4 App Generator aktualisiert.
Ănderungen am App Generator
Befehlsoptionen und -nutzung bleiben gröĂtenteils unverĂ€ndert. Es gelten jedoch folgende Ausnahmen:
- Option
--sessionswurde entfernt. - Option
--jshtmlwurde entfernt. - Option
--hoganwurde hinzugefĂŒgt, um Hogan.js zu unterstĂŒtzen.
Beispiel
FĂŒhren Sie den folgenden Befehl aus, um eine Express 4-Anwendung zu erstellen:
$ express app4
Wenn Sie sich den Inhalt der Datei app4/app.js ansehen, werden Sie feststellen, dass alle Middlewarefunktionen (auĂer express.static), die fĂŒr die Anwendung erforderlich sind, als unabhĂ€ngige Module geladen werden und die Middleware router nicht mehr explizit in die Anwendung geladen wird.
Sie werden auch feststellen, dass die Datei app.js nun ein Node.js-Modul ist â im Gegensatz zur eigenstĂ€ndigen Anwendung, die vom bisherigen Generator generiert wurde.
Starten Sie nach der Installation der AbhÀngigkeiten die Anwendung mit dem folgenden Befehl:
$ npm start
Wenn Sie sich das npm-Startscript in der Datei package.json nĂ€her ansehen, werden Sie feststellen, dass der eigentliche Befehl, der die Anwendung startet, node ./bin/www heiĂt. Dieser Befehl lautete in Express 3 node app.js.
Da die Datei app.js, die vom Express 4 Generator erstellt wurde, nun ein Node.js-Modul ist, kann dieses nicht mehr wie bisher unabhĂ€ngig als Anwendung gestartet werden (es sei denn, Sie Ă€ndern den Code). Das Modul muss in eine Node.js-Datei geladen und ĂŒber die Node.js-Datei gestartet werden. Die Node.js-Datei ist in diesem Fall ./bin/www.
Weder das Verzeichnis bin noch die erweiterungslose Datei www ist fĂŒr das Erstellen einer Express-Anwendung oder das Starten der Anwendung zwingend erforderlich. Dies sind lediglich VorschlĂ€ge des Generators. Sie können diese also je nach Ihren Anforderungen Ă€ndern.
Um das Verzeichnis www zu löschen und alles im "Express 3-Stil" zu belassen, löschen Sie die Zeile mit dem Eintrag module.exports = app; am Ende der Datei app.js. FĂŒgen Sie dann stattdessen den folgenden Code an derselben Position ein:
app.set('port', process.env.PORT || 3000)
var server = app.listen(app.get('port'), () => {
debug('Express server listening on port ' + server.address().port)
})
Stellen Sie sicher, dass Sie das Modul debug am Anfang der Datei app.js laden. Verwenden Sie dazu den folgenden Code:
var debug = require('debug')('app4')
Ăndern Sie als NĂ€chstes "start": "node ./bin/www" in der Datei package.json in "start": "node app.js".
Sie haben nun die FunktionalitĂ€t von ./bin/www wieder in app.js verschoben. Diese Ănderung wird nicht empfohlen. Die Ăbung hat Ihnen jedoch geholfen, zu verstehen, wie die Datei ./bin/www funktioniert und warum die Datei app.js nicht mehr automatisch gestartet wird.