Articles

Verwenden von Middleware

Posted on

Express ist ein Routing- und Middleware-Web-Framework, das nur über eine minimale eigene Funktionalität verfügt: Eine Express-Anwendung besteht im Wesentlichen aus einer Reihe von Middleware-Funktionsaufrufen.

Middleware-Funktionen sind Funktionen, die Zugriff auf das Request-Objekt (req), das Response-Objekt (res) und die nächste Middleware-Funktion im Request-Response-Zyklus der Anwendung haben. Die nächste Middleware-Funktion wird üblicherweise durch eine Variable mit dem Namen next bezeichnet.

Middleware-Funktionen können folgende Aufgaben ausführen:

  • Beliebigen Code ausführen.
  • Änderungen an den Request- und Response-Objekten vornehmen.
  • Den Request-Response-Zyklus beenden.
  • Die nächste Middleware-Funktion im Stack aufrufen.

Wenn die aktuelle Middleware-Funktion den Request-Response-Zyklus nicht beendet, muss sie next() aufrufen, um die Kontrolle an die nächste Middleware-Funktion zu übergeben. Andernfalls wird die Anfrage hängen gelassen.

Eine Express-Anwendung kann die folgenden Middleware-Typen verwenden:

  • Middleware auf Anwendungsebene
  • Middleware auf Router-Ebene
  • Middleware zur Fehlerbehandlung
  • Eingebaute Middleware
  • Middleware von Drittanbietern

Sie können Middleware auf Anwendungs- und Router-Ebene mit einem optionalen Mount-Pfad laden.Sie können auch eine Reihe von Middleware-Funktionen zusammen laden, was einen Unterstapel des Middleware-Systems an einem Einhängepunkt erzeugt.

Middleware auf Anwendungsebene

Binden Sie Middleware auf Anwendungsebene an eine Instanz des App-Objekts, indem Sie die Funktionen app.use() und app.METHOD() verwenden, wobei METHOD die HTTP-Methode der Anfrage ist, die die Middleware-Funktion behandelt (z. B. GET, PUT oder POST) in Kleinbuchstaben.

Dieses Beispiel zeigt eine Middleware-Funktion ohne Mount-Pfad. Die Funktion wird jedes Mal ausgeführt, wenn die App eine Anfrage erhält.

var express = require('express')var app = express()app.use(function (req, res, next) { console.log('Time:', Date.now()) next()})

Dieses Beispiel zeigt eine Middleware-Funktion, die auf dem /user/:id-Pfad eingebunden ist. Die Funktion wird für jede Art vonHTTP -Anfrage auf dem /user/:id Pfad ausgeführt.

app.use('/user/:id', function (req, res, next) { console.log('Request Type:', req.method) next()})

Dieses Beispiel zeigt eine Route und ihre Handler-Funktion (Middleware-System). Die Funktion behandelt GET-Anfragen an den /user/:id Pfad.

app.get('/user/:id', function (req, res, next) { res.send('USER')})

Hier ist ein Beispiel für das Laden einer Reihe von Middleware-Funktionen an einem Einhängepunkt, mit einem Einhängepfad.Es veranschaulicht einen Middleware-Sub-Stack, der Anforderungsinformationen für jede Art von HTTP-Anforderung an den /user/:id Pfad ausgibt.

app.use('/user/:id', function (req, res, next) { console.log('Request URL:', req.originalUrl) next()}, function (req, res, next) { console.log('Request Type:', req.method) next()})

Route-Handler ermöglichen es Ihnen, mehrere Routen für einen Pfad zu definieren. Das folgende Beispiel definiert zwei Routen für GET-Anfragen an den /user/:id Pfad. Die zweite Route verursacht keine Probleme, wird aber nie aufgerufen, da die erste Route den Anfrage-Antwort-Zyklus beendet.

Dieses Beispiel zeigt einen Middleware-Substack, der GET-Anfragen an den /user/:id-Pfad behandelt.

app.get('/user/:id', function (req, res, next) { console.log('ID:', req.params.id) next()}, function (req, res, next) { res.send('User Info')})// handler for the /user/:id path, which prints the user IDapp.get('/user/:id', function (req, res, next) { res.send(req.params.id)})

Um den Rest der Middleware-Funktionen von einem Router-Middleware-Stack zu überspringen, rufen Sie next('route') auf, um die Kontrolle an den nächsten Pfad zu übergeben.HINWEIS: next('route') funktioniert nur in Middleware-Funktionen, die mit Hilfe der Funktionen app.METHOD() oder router.METHOD() geladen wurden.

Dieses Beispiel zeigt einen Middleware-Sub-Stack, der GET-Anfragen an den /user/:id-Pfad bearbeitet.

app.get('/user/:id', function (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()}, function (req, res, next) { // send a regular response res.send('regular')})// handler for the /user/:id path, which sends a special responseapp.get('/user/:id', function (req, res, next) { res.send('special')})

Middleware kann auch in einem Array deklariert werden, um sie wiederverwenden zu können.

Dieses Beispiel zeigt ein Array mit einem Middleware-Sub-Stack, der GET-Anfragen an den /user/:id Pfad behandelt

function logOriginalUrl (req, res, next) { console.log('Request URL:', req.originalUrl) next()}function logMethod (req, res, next) { console.log('Request Type:', req.method) next()}var logStuff = app.get('/user/:id', logStuff, function (req, res, next) { res.send('User Info')})

Middleware auf Router-Ebene

Middleware auf Router-Ebene funktioniert auf die gleiche Weise wie Middleware auf Anwendungsebene, außer dass sie an eine Instanz von express.Router() gebunden ist.

var router = express.Router()

Laden Sie Middleware auf Router-Ebene mit Hilfe der Funktionen router.use() und router.METHOD().

Der folgende Beispielcode repliziert das oben gezeigte Middleware-System für Middleware auf Anwendungsebene, indem er Middleware auf Router-Ebene verwendet:

var express = require('express')var app = express()var router = express.Router()// a middleware function with no mount path. This code is executed for every request to the routerrouter.use(function (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 pathrouter.use('/user/:id', function (req, res, next) { console.log('Request URL:', req.originalUrl) next()}, function (req, res, next) { console.log('Request Type:', req.method) next()})// a middleware sub-stack that handles GET requests to the /user/:id pathrouter.get('/user/:id', function (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()}, function (req, res, next) { // render a regular page res.render('regular')})// handler for the /user/:id path, which renders a special pagerouter.get('/user/:id', function (req, res, next) { console.log(req.params.id) res.render('special')})// mount the router on the appapp.use('/', router)

Um den Rest der Middleware-Funktionen des Routers zu überspringen, rufen Sie next('router')auf, um die Kontrolle zurück aus der Router-Instanz zu übergeben.

Dieses Beispiel zeigt einen Middleware-Sub-Stack, der GET-Anfragen an den /user/:id Pfad behandelt.

var express = require('express')var app = express()var router = express.Router()// predicate the router with a check and bail out when neededrouter.use(function (req, res, next) { if (!req.headers) return next('router') next()})router.get('/user/:id', function (req, res) { res.send('hello, user!')})// use the router and 401 anything falling throughapp.use('/admin', router, function (req, res) { res.sendStatus(401)})

Fehlerbehandlungs-Middleware

Fehlerbehandlungs-Middleware benötigt immer vier Argumente. Sie müssen vier Argumente bereitstellen, um sie als fehlerbehandelnde Middleware-Funktion zu identifizieren. Auch wenn Sie das next-Objekt nicht verwenden müssen, müssen Sie es angeben, um die Signatur zu erhalten. Andernfalls wird das next-Objekt als reguläre Middleware interpretiert und kann keine Fehler behandeln.

Definieren Sie Middleware-Funktionen zur Fehlerbehandlung auf die gleiche Weise wie andere Middleware-Funktionen, nur mit vier statt drei Argumenten, und zwar mit der Signatur (err, req, res, next)):

app.use(function (err, req, res, next) { console.error(err.stack) res.status(500).send('Something broke!')})

Für Details zur Fehlerbehandlung von Middleware siehe: Fehlerbehandlung.

Eingebaute Middleware

Beginnend mit Version 4.x ist Express nicht mehr von Connect abhängig. Die Middleware-Funktionen, die früher in Express enthalten waren, befinden sich jetzt in separaten Modulen; siehe die Liste der Middleware-Funktionen.

Express verfügt über die folgenden eingebauten Middleware-Funktionen:

  • express.static bedient statische Assets wie HTML-Dateien, Bilder usw.
  • express.json parst eingehende Anfragen mit JSON-Nutzdaten. HINWEIS: Verfügbar mit Express 4.16.0+
  • express.urlencoded parst eingehende Anfragen mit URL-kodierten Nutzdaten. HINWEIS: Verfügbar mit Express 4.16.0+

Middleware von Drittanbietern

Verwenden Sie Middleware von Drittanbietern, um Express-Apps Funktionalität hinzuzufügen.

Installieren Sie das Node.js-Modul für die benötigte Funktionalität und laden Sie es dann in Ihre App auf der Anwendungsebene oder auf der Routerebene.

Das folgende Beispiel zeigt die Installation und das Laden der Cookie-Parsing-Middleware-Funktion cookie-parser.

$ npm install cookie-parser
var express = require('express')var app = express()var cookieParser = require('cookie-parser')// load the cookie-parsing middlewareapp.use(cookieParser())

Für eine Teilliste von Middleware-Funktionen von Drittanbietern, die häufig mit Express verwendet werden, siehe: Drittanbieter-Middleware.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.