Middleware verwenden
Express ist ein Weiterleitungs- und Middleware-Web-Framework, das selbst nur minimale FunktionalitÀt aufweist: Eine Express-Anwendung besteht im Wesentlichen aus einer Reihe von Middlewarefunktionsaufrufen.
Middleware functions are functions that have access to the request object (req), the response object (res), and the next middleware function in the applicationâs request-response cycle. Die nĂ€chste Middlewarefunktion wird im Allgemeinen durch die Variable next bezeichnet.
Ăber Middlewarefunktionen lassen sich die folgenden Tasks ausfĂŒhren:
- AusfĂŒhren von Code
- Vornehmen von Ănderungen an der Anforderung und an Antwortobjekten
- End the request-response cycle.
- Aufrufen der nÀchsten Middlewarefunktion im Stack
Wenn ĂŒber die aktuelle Middlewarefunktion der Anforderung/Antwort-Zyklus nicht beendet werden kann, muss next() aufgerufen werden, um die Steuerung an die nĂ€chste Middlewarefunktion zu ĂŒbergeben. Andernfalls geht die Anforderung in den Status "Blockiert" ĂŒber.
Eine Express-Anwendung kann die folgenden Middlewaretypen verwenden:
- Middleware auf Anwendungsebene
- Middleware auf Routerebene
- Middleware fĂŒr die Fehlerbehandlung
- Integrierte Middleware
- Middleware anderer Anbieter
Sie können Middleware auf Anwendungsebene und Routerebene mit einem optionalen Mountpfad laden. Sie können auch eine Reihe von Middlewarefunktionen zusammen laden. Dadurch wird ein Sub-Stack des Middlewaresystems am Mountpunkt erstellt.
Middleware auf Anwendungsebene
Bind application-level middleware to an instance of the app object by using the app.use() and app.METHOD() functions, where METHOD is the HTTP method of the request that the middleware function handles (such as GET, PUT, or POST) in lowercase.
Dieses Beispiel zeigt eine Middlewarefunktion ohne Mountpfad. Die Funktion wird immer dann ausgefĂŒhrt, wenn die Anwendung eine Anforderung erhĂ€lt.
const express = require('express')
const app = express()
app.use((req, res, next) => {
console.log('Time:', Date.now())
next()
})
Dieses Beispiel zeigt eine Middlewarefunktion mit dem Mountpfad /user/:id. Die Funktion wird fĂŒr jede Art von HTTP-Anforderung auf dem Pfad /user/:id ausgefĂŒhrt.
app.use('/user/:id', (req, res, next) => {
console.log('Request Type:', req.method)
next()
})
Dieses Beispiel zeigt eine Weiterleitung und deren Handlerfunktion (Middlewaresystem). Die Funktion verarbeitet GET-Anforderungen zum Pfad /user/:id.
app.get('/user/:id', (req, res, next) => {
res.send('USER')
})
Dies ist ein Beispiel zum Laden einer Reihe von Middlewarefunktionen an einem Mountpunkt mit einem Mountpfad.
Das Beispiel veranschaulicht einen Middleware-Stack, ĂŒber den Anforderungsinformationen zu einer HTTP-Anforderung zum Pfad /user/:id ausgegeben werden.
app.use('/user/:id', (req, res, next) => {
console.log('Request URL:', req.originalUrl)
next()
}, (req, res, next) => {
console.log('Request Type:', req.method)
next()
})
Mit einem Routenhandler können Sie mehrere Weiterleitungen fĂŒr einen Pfad definieren. Im folgenden Beispiel werden zwei Weiterleitungen fĂŒr GET-Anforderungen zum Pfad /user/:id definiert. Die zweite Weiterleitung verursacht zwar keine Probleme, wird jedoch nie aufgerufen, da durch die erste Weiterleitung der Anforderung/Antwort-Zyklus beendet wird.
Dieses Beispiel zeigt einen Middleware-Sub-Stack, ĂŒber den GET-Anforderungen zum Pfad /user/:id verarbeitet werden.
app.get('/user/:id', (req, res, next) => {
console.log('ID:', req.params.id)
next()
}, (req, res, next) => {
res.send('User Info')
})
// handler for the /user/:id path, which prints the user ID
app.get('/user/:id', (req, res, next) => {
res.send(req.params.id)
})
Wenn Sie den Rest der Middlewarefunktionen eines Weiterleitungs-Middleware-Stack ĂŒberspringen wollen, rufen Sie next('route') auf, um die Steuerung an die nĂ€chste Weiterleitung zu ĂŒbergeben.
Hinweis
next('route') will work only in middleware functions that were loaded by using the app.METHOD() or router.METHOD() functions.
Dieses Beispiel zeigt einen Middleware-Sub-Stack, ĂŒber den GET-Anforderungen zum Pfad /user/:id verarbeitet werden.
app.get('/user/:id', (req, res, next) => {
// if the user ID is 0, skip to the next route
if (req.params.id === '0') next('route')
// otherwise pass the control to the next middleware function in this stack
else next()
}, (req, res, next) => {
// send a regular response
res.send('regular')
})
// handler for the /user/:id path, which sends a special response
app.get('/user/:id', (req, res, next) => {
res.send('special')
})
Middleware can also be declared in an array for reusability.
Dies ist ein Beispiel zur Verwendung der Middlewarefunktion express.static mit einem ausfĂŒhrlich dargestellten Optionsobjekt:
function logOriginalUrl (req, res, next) {
console.log('Request URL:', req.originalUrl)
next()
}
function logMethod (req, res, next) {
console.log('Request Type:', req.method)
next()
}
const logStuff = [logOriginalUrl, logMethod]
app.get('/user/:id', logStuff, (req, res, next) => {
res.send('User Info')
})
Middleware auf Routerebene
Middleware auf Routerebene funktioniert in der gleichen Weise wie Middleware auf Anwendungsebene, mit dem einzigen Unterschied, dass sie an eine Instanz von express.Router() gebunden ist.
const router = express.Router()
Laden Sie Middleware auf Routerebene ĂŒber die Funktionen router.use() und router.METHOD().
Der folgende Beispielcode repliziert das Middlewaresystem, das oben fĂŒr die Middleware auf Anwendungsebene gezeigt wird, durch Verwendung von Middleware auf Routerebene.
const express = require('express')
const app = express()
const router = express.Router()
// a middleware function with no mount path. This code is executed for every request to the router
router.use((req, res, next) => {
console.log('Time:', Date.now())
next()
})
// a middleware sub-stack shows request info for any type of HTTP request to the /user/:id path
router.use('/user/:id', (req, res, next) => {
console.log('Request URL:', req.originalUrl)
next()
}, (req, res, next) => {
console.log('Request Type:', req.method)
next()
})
// a middleware sub-stack that handles GET requests to the /user/:id path
router.get('/user/:id', (req, res, next) => {
// if the user ID is 0, skip to the next router
if (req.params.id === '0') next('route')
// otherwise pass control to the next middleware function in this stack
else next()
}, (req, res, next) => {
// render a regular page
res.render('regular')
})
// handler for the /user/:id path, which renders a special page
router.get('/user/:id', (req, res, next) => {
console.log(req.params.id)
res.render('special')
})
// mount the router on the app
app.use('/', router)
To skip the rest of the routerâs middleware functions, call next('router')
to pass control back out of the router instance.
Dieses Beispiel zeigt einen Middleware-Sub-Stack, ĂŒber den GET-Anforderungen zum Pfad /user/:id verarbeitet werden.
const express = require('express')
const app = express()
const router = express.Router()
// predicate the router with a check and bail out when needed
router.use((req, res, next) => {
if (!req.headers['x-auth']) return next('router')
next()
})
router.get('/user/:id', (req, res) => {
res.send('hello, user!')
})
// use the router and 401 anything falling through
app.use('/admin', router, (req, res) => {
res.sendStatus(401)
})
Middleware fĂŒr die Fehlerbehandlung
Middleware fĂŒr die Fehlerbehandlung benötigt immer vier Argumente. Sie mĂŒssen vier Argumente angeben, um die Erkennung als Middlewarefunktion fĂŒr die Fehlerbehandlung zu ermöglichen. Selbst wenn das Objekt next nicht verwenden mĂŒssen, mĂŒssen Sie dies angeben, um die Signatur beizubehalten. Andernfalls wird das Objekt next als regulĂ€re Middleware interpretiert, sodass keine Fehlerbehandlung möglich ist.
Middlewarefunktionen fĂŒr die Fehlerbehandlung werden in derselben Weise definiert wie andere Middlewarefunktionen, auĂer dass Fehlerbehandlungsfunktionen speziell bei Signaturen vier anstatt drei Argumente aufweisen (err, req, res, next):
app.use((err, req, res, next) => {
console.error(err.stack)
res.status(500).send('Something broke!')
})
Details zu Middleware fĂŒr die Fehlerbehandlung siehe Fehlerbehandlung.
Integrierte Middleware
Seit Version 4.x bestehen bei Express keine AbhÀngigkeiten zu Connect mehr. Mit Ausnahme von express.static befinden sich nun alle Middlewarefunktionen, die bisher in Express enthalten waren, in separaten Modulen. Sehen Sie sich hierzu auch die Liste der Middlewarefunktionen an.
Die einzige integrierte Middlewarefunktion in Express ist express.static.
- express.static serves static assets such as HTML files, images, and so on.
- express.json parses incoming requests with JSON payloads. NOTE: Available with Express 4.16.0+
- express.urlencoded parses incoming requests with URL-encoded payloads. NOTE: Available with Express 4.16.0+
Middleware anderer Anbieter
Mit Middleware anderer Anbieter können Sie Express-Anwendungen um neue FunktionalitÀt erweitern.
Installieren Sie das Modul Node.js fĂŒr die erforderliche FunktionalitĂ€t. Laden Sie das Modul dann in Ihre Anwendung auf Anwendungsebene oder auf Routerebene.
Das folgende Beispiel veranschaulicht das Installieren und Laden der Middlewarefunktion cookie-parser fĂŒr das Cookie-Parsing.
$ npm install cookie-parser
const express = require('express')
const app = express()
const cookieParser = require('cookie-parser')
// load the cookie-parsing middleware
app.use(cookieParser())
Eine nicht vollstÀndige Liste zu den Middlewarefunktionen anderer Anbieter, die im Allgemeinen mit Express verwendet werden, finden Sie unter Middleware anderer Anbieter.
Edit this page