Articles

Middleware gebruiken

Posted on

Express is een routing en middleware web framework dat minimale eigen functionaliteit heeft: Een Express-applicatie is in wezen een reeks aanroepen van middleware-functies.

Middleware-functies zijn functies die toegang hebben tot het request-object (req), het response-object (res), en de volgende middleware-functie in de request-response-cyclus van de applicatie. De volgende middleware-functie wordt gewoonlijk aangeduid met een variabele met de naam next.

Middleware-functies kunnen de volgende taken uitvoeren:

  • Uitvoeren van willekeurige code.
  • Wijzigingen aanbrengen in het request- en het response-object.
  • De request-response-cyclus beëindigen.
  • De volgende middleware-functie in de stack oproepen.

Als de huidige middleware-functie de request-response-cyclus niet beëindigt, moet hij next() oproepen om de controle door te geven aan de volgende middleware-functie. Anders blijft het verzoek hangen.

Een Express-applicatie kan de volgende typen middleware gebruiken:

  • Application-level middleware
  • Router-level middleware
  • Error-handling middleware
  • Built-in middleware
  • Third-party middleware

Je kunt application-level en router-level middleware laden met een optioneel mount-pad.U kunt ook een reeks van middleware-functies samen laden, waardoor een sub-stack van het middleware-systeem op een mount-punt wordt gecreëerd.

Mediaware op applicatieniveau

Bind middleware op applicatieniveau aan een instantie van het app-object door gebruik te maken van de app.use() en app.METHOD() functies, waarbij METHOD de HTTP-methode is van het verzoek dat de middleware-functie afhandelt (zoals GET, PUT, of POST) in kleine letters.

Dit voorbeeld toont een middleware functie zonder mount-pad. De functie wordt elke keer uitgevoerd als de app een verzoek ontvangt.

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

Dit voorbeeld toont een middleware functie die op het /user/:id pad is gemonteerd. De functie wordt uitgevoerd voor elk type HTTP verzoek op het /user/:id pad.

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

Dit voorbeeld toont een route en zijn handler functie (middleware systeem). De functie handelt GET verzoeken af naar het /user/:id pad.

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

Hier een voorbeeld van het laden van een serie middleware functies op een mount punt, met een mount pad.Het illustreert een middleware sub-stack die verzoek info afdrukt voor elk type HTTP verzoek naar het /user/:id pad.

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 handlers stellen u in staat om meerdere routes voor een pad te definiëren. Het onderstaande voorbeeld definieert twee routes voor GET verzoeken naar het /user/:id pad. De tweede route zal geen problemen veroorzaken, maar zal nooit aangeroepen worden omdat de eerste route de request-response cyclus beëindigt.

Dit voorbeeld toont een middleware sub-stack die GET verzoeken afhandelt naar het /user/:id pad.

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)})

Om de rest van de middleware functies van een router middleware stack over te slaan, roep next('route') op om de controle door te geven aan de volgende route.OPMERKING: next('route') werkt alleen in middleware-functies die zijn geladen door gebruik te maken van de app.METHOD() of router.METHOD() functies.

Dit voorbeeld toont een middleware sub-stack die GET verzoeken naar het /user/:id pad afhandelt.

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 kan ook in een array worden gedeclareerd voor herbruikbaarheid.

Dit voorbeeld toont een array met een middleware-substack die GET-verzoeken naar het /user/:id pad afhandelt

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')})

Router-level middleware

Router-level middleware werkt op dezelfde manier als application-level middleware, behalve dat het gebonden is aan een instantie van express.Router().

var router = express.Router()

Laad middleware op router-niveau met behulp van de router.use() en router.METHOD() functies.

De volgende voorbeeldcode repliceert het middleware-systeem dat hierboven wordt getoond voor middleware op applicatieniveau, door middleware op router-niveau te gebruiken:

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)

Om de rest van de middleware-functies van de router over te slaan, roept u next('router') op om de controle weer uit de router-instantie door te geven.

Dit voorbeeld toont een middleware-substack die GET-verzoeken naar het /user/:id-pad afhandelt.

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)})

Error-handling middleware

Error-handling middleware neemt altijd vier argumenten in. U moet vier argumenten opgeven om de functie te identificeren als een middleware-functie voor foutafhandeling. Zelfs als u het object next niet hoeft te gebruiken, moet u het specificeren om de handtekening te behouden. Anders zal het next object worden geïnterpreteerd als gewone middleware en zal het fouten niet afhandelen.

Definieer foutafhandelende middleware-functies op dezelfde manier als andere middleware-functies, behalve met vier argumenten in plaats van drie, specifiek met de signatuur (err, req, res, next)):

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

Voor details over foutafhandelende middleware, zie: Foutafhandeling.

Ingebouwde middleware

Met ingang van versie 4.x is Express niet langer afhankelijk van Connect. De middlewarefuncties die voorheen met Express werden meegeleverd, staan nu in aparte modules; zie de lijst met middlewarefuncties.

Express heeft de volgende ingebouwde middlewarefuncties:

  • express.static serveert statische assets zoals HTML-bestanden, afbeeldingen, enzovoort.
  • express.json parsseert inkomende verzoeken met JSON payloads. OPMERKING: beschikbaar met Express 4.16.0+
  • express.urlencoded verwerkt inkomende verzoeken met URL-gecodeerde payloads. OPMERKING: Beschikbaar met Express 4.16.0+

Middelware van derden

Gebruik middleware van derden om functionaliteit aan Express apps toe te voegen.

Installeer de Node.js module voor de benodigde functionaliteit, laad deze dan in je app op het applicatie niveau of op het router niveau.

Het volgende voorbeeld illustreert het installeren en laden van de cookie-parsing middleware functie 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())

Voor een gedeeltelijke lijst van third-party middleware functies die veel met Express worden gebruikt, zie: middleware van derden.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *