Articles

Utilisation de l’intergiciel

Posted on

Express est un cadre web de routage et d’intergiciel qui possède une fonctionnalité propre minimale : Une application Express est essentiellement une série d’appels de fonctions middleware.

Les fonctions middleware sont des fonctions qui ont accès à l’objet requête (req), à l’objet réponse (res) et à la fonction middleware suivante dans le cycle requête-réponse de l’application. La fonction middleware suivante est communément désignée par une variable nommée next.

Les fonctions middleware peuvent effectuer les tâches suivantes :

  • Exécuter n’importe quel code.
  • Affectuer des modifications à la demande et aux objets de réponse.
  • Faire cesser le cycle demande-réponse.
  • Appeler la fonction middleware suivante dans la pile.

Si la fonction middleware actuelle ne fait pas cesser le cycle demande-réponse, elle doit appeler next() pour passer le contrôle à la fonction middleware suivante. Sinon, la requête sera laissée en suspens.

Une application Express peut utiliser les types d’intergiciels suivants :

  • Homogiciel de niveau application
  • Homogiciel de niveau routeur
  • Homogiciel de gestion des erreurs
  • Homogiciel intégré
  • Homogiciel tiers

Vous pouvez charger un intergiciel de niveau application et de niveau routeur avec un chemin de montage facultatif.Vous pouvez également charger une série de fonctions d’intergiciel ensemble, ce qui crée une sous-pile du système d’intergiciel à un point de montage.

Milieu de niveau application

Lier un milieu de niveau application à une instance de l’objet app en utilisant les fonctions app.use() et app.METHOD(), où METHOD est la méthode HTTP de la requête que la fonction d’intergiciel traite (comme GET, PUT ou POST) en minuscules.

Cet exemple montre une fonction middleware sans chemin de montage. La fonction est exécutée chaque fois que l’application reçoit une requête.

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

Cet exemple montre une fonction d’intergiciel montée sur le chemin /user/:id. La fonction est exécutée pour tout type de requêteHTTP sur le /user/:id chemin.

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

Cet exemple montre une route et sa fonction de gestion (système middleware). La fonction gère les requêtes GET vers le /user/:id chemin.

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

Voici un exemple de chargement d’une série de fonctions middleware à un point de montage, avec un chemin de montage.Il illustre une sous-pile d’intergiciel qui imprime des informations de requête pour tout type de requête HTTP vers le /user/:id chemin.

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

Les gestionnaires de route vous permettent de définir plusieurs routes pour un chemin. L’exemple ci-dessous définit deux routes pour les requêtes GET vers le chemin /user/:id. La deuxième route ne posera aucun problème, mais elle ne sera jamais appelée car la première route met fin au cycle demande-réponse.

Cet exemple montre une sous-pile middleware qui gère les demandes GET vers le chemin /user/:id.

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

Pour sauter le reste des fonctions middleware d’une pile middleware de routeur, appelez next('route') pour passer le contrôle au chemin suivant.REMARQUE : next('route') ne fonctionnera que dans les fonctions middleware qui ont été chargées à l’aide des fonctions app.METHOD() ou router.METHOD().

Cet exemple montre une sous-pile d’intergiciel qui gère les demandes GET vers le /user/:id chemin.

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

L’intergiciel peut également être déclaré dans un tableau pour être réutilisable.

Cet exemple montre un tableau avec une sous-pile d’intergiciel qui gère les requêtes GET vers le /user/:id path

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

Ingénierie de niveau routeur

L’intergiciel de niveau routeur fonctionne de la même manière que l’intergiciel de niveau application, sauf qu’il est lié à une instance de express.Router().

var router = express.Router()

Chargez un intergiciel de niveau routeur en utilisant les fonctions router.use() et router.METHOD().

L’exemple de code suivant reproduit le système d’intergiciel présenté ci-dessus pour l’intergiciel de niveau application, en utilisant l’intergiciel de niveau routeur :

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)

Pour sauter le reste des fonctions d’intergiciel du routeur, appelez next('router')pour repasser le contrôle hors de l’instance du routeur.

Cet exemple montre une sous-pile d’intergiciel qui gère les requêtes GET vers le /user/:id chemin.

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 prend toujours quatre arguments. Vous devez fournir quatre arguments pour l’identifier comme une fonction de middleware de gestion des erreurs. Même si vous n’avez pas besoin d’utiliser l’objet next, vous devez le spécifier pour maintenir la signature. Sinon, l’objet next sera interprété comme un middleware ordinaire et ne parviendra pas à gérer les erreurs.

Définissez les fonctions middleware de gestion des erreurs de la même manière que les autres fonctions middleware, sauf avec quatre arguments au lieu de trois, spécifiquement avec la signature (err, req, res, next)):

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

Pour plus de détails sur les middleware de gestion des erreurs, voir : Gestion des erreurs.

Les intergiciels intégrés

À partir de la version 4.x, Express ne dépend plus de Connect. Les fonctions d’intergiciel qui étaient auparavant incluses avec Express sont maintenant dans des modules séparés ; voir la liste des fonctions d’intergiciel.

Express a les fonctions d’intergiciel intégrées suivantes :

  • express.static sert les actifs statiques tels que les fichiers HTML, les images, etc.
  • express.json analyse les requêtes entrantes avec des charges utiles JSON. NOTE : Disponible avec Express 4.16.0+
  • express.urlencoded analyse les requêtes entrantes avec des charges utiles codées en URL. NOTE : Disponible avec Express 4.16.0+

Milieu tiers

Utiliser un milieu tiers pour ajouter des fonctionnalités aux apps Express.

Installer le module Node.js pour la fonctionnalité requise, puis le charger dans votre app au niveau de l’application ou au niveau du routeur.

L’exemple suivant illustre l’installation et le chargement de la fonction d’intergiciel d’analyse des cookies 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())

Pour une liste partielle des fonctions d’intergiciel tiers couramment utilisées avec Express, voir : Les intergiciels tiers.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *