Ecriture de middleware utilisable dans les applications Express

Présentation

Les fonctions de middleware sont des fonctions qui peuvent accĂ©der Ă  l’objet Request (req), l’objet response (res) et Ă  la fonction middleware suivant dans le cycle demande-rĂ©ponse de l’application. La fonction middleware suivant est couramment dĂ©signĂ©e par une variable nommĂ©e next.

Les fonctions middleware effectuent les tĂąches suivantes :

Si la fonction middleware en cours ne termine pas le cycle de demande-réponse, elle doit appeler la fonction next() pour transmettre le contrÎle à la fonction middleware suivant. Sinon, la demande restera bloquée.

L’exemple suivant montre les Ă©lĂ©ments d’un appel de fonction middleware:

</table> </div> Starting with Express 5, middleware functions that return a Promise will call `next(value)` when they reject or throw an error. `next` will be called with either the rejected value or the thrown Error.

Exemple

Voici un exemple d'une application Express "Hello World" simple, pour laquelle vous allez définir deux fonctions middleware : The remainder of this article will define and add three middleware functions to the application: one called `myLogger` that prints a simple log message, one called `requestTime` that displays the timestamp of the HTTP request, and one called `validateCookies` that validates incoming cookies. ```js const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hello World!') }) app.listen(3000) ```

Middleware function myLogger

Voici un exemple simple de fonction middleware appelée "myLogger". Cette fonction imprime simplement "LOGGED" lorsqu'une demande traverse l'application. La fonction middleware est affectée à une variable nommée `myLogger`. ```js const myLogger = function (req, res, next) { console.log('LOGGED') next() } ```

Notice the call above to next(). Notez l’appel ci-dessus de la fonction next(), qui appelle la fonction middleware suivant dans l’application. La fonction next() ne fait pas partie du Node.js ou de l’API Express, mais c’est le troisiĂšme argument qui est transmis Ă  la fonction middleware. La fonction next() peut porter n’importe quel nom, mais par convention elle est toujours appelĂ©e “next”. Pour Ă©viter toute confusion, il est prĂ©fĂ©rable de respecter cette convention.

Pour charger la fonction middleware, appelez `app.use()` en spécifiant la fonction middleware. Par exemple, le code suivant charge la fonction middleware `myLogger` avant la route au chemin racine (/). ```js const express = require('express') const app = express() const myLogger = function (req, res, next) { console.log('LOGGED') next() } app.use(myLogger) app.get('/', (req, res) => { res.send('Hello World!') }) app.listen(3000) ``` Chaque fois que l'application reçoit une demande, elle imprime le message "LOGGED" sur le terminal. L'ordre de chargement des middleware est important : les fonctions middleware chargées en premier sont également exécutées en premier. Si `myLogger` est chargé aprÚs la route au chemin racine, la demande ne l'atteindra jamais et l'application n'imprimera pas "LOGGED", car le gestionnaire de route du chemin racine interrompra le cycle de demande-réponse. La fonction middleware `myLogger` imprime simplement un message, puis traite la demande à la fonction middleware suivant dans la pile en appelant la fonction `next()`.

Middleware function requestTime

L'exemple suivant ajoute une propriété appelée `requestTime` à l'objet Request. Nous nommerons cette fonction middleware "requestTime". ```js const requestTime = function (req, res, next) { req.requestTime = Date.now() next() } ``` L'application utilise désormais la fonction middleware `requestTime`. De plus, la fonction callback de la route du chemin racine utilise la propriété que la fonction middleware ajoute à `req` (l'objet Request). ```js const express = require('express') const app = express() const requestTime = function (req, res, next) { req.requestTime = Date.now() next() } app.use(requestTime) app.get('/', (req, res) => { let responseText = 'Hello World!
' responseText += `Requested at: ${req.requestTime}` res.send(responseText) }) app.listen(3000) ``` Si vous effectuez une demande Ă  la racine de l'application, cette derniĂšre affiche maintenant l'horodatage de la demande dans le navigateur.

Middleware function validateCookies

Finally, we'll create a middleware function that validates incoming cookies and sends a 400 response if cookies are invalid. Here's an example function that validates cookies with an external async service. ```js async function cookieValidator (cookies) { try { await externallyValidateCookie(cookies.testCookie) } catch { throw new Error('Invalid cookies') } } ``` Here, we use the [`cookie-parser`](/resources/middleware/cookie-parser.html) middleware to parse incoming cookies off the `req` object and pass them to our `cookieValidator` function. The `validateCookies` middleware returns a Promise that upon rejection will automatically trigger our error handler. ```js const express = require('express') const cookieParser = require('cookie-parser') const cookieValidator = require('./cookieValidator') const app = express() async function validateCookies (req, res, next) { await cookieValidator(req.cookies) next() } app.use(cookieParser()) app.use(validateCookies) // error handler app.use((err, req, res, next) => { res.status(400).send(err.message) }) app.listen(3000) ```

Note how next() is called after await cookieValidator(req.cookies). This ensures that if cookieValidator resolves, the next middleware in the stack will get called. If you pass anything to the next() function (except the string 'route' or 'router'), Express regards the current request as being an error and will skip any remaining non-error handling routing and middleware functions.

Puisque vous avez accĂšs Ă  l'objet Request, Ă  l'objet Response, Ă  la fonction middleware suivant dans la pile et Ă  l'API Node.js complĂšte, le champ des possibles avec les fonctions middleware est infini. Pour plus d'informations sur les middleware Express, voir [Utilisation de middleware Express](/fr/guide/using-middleware.html).

Configurable middleware

If you need your middleware to be configurable, export a function which accepts an options object or other parameters, which, then returns the middleware implementation based on the input parameters. File: `my-middleware.js` ```js module.exports = function (options) { return function (req, res, next) { // Implement the middleware function based on the options object next() } } ``` The middleware can now be used as shown below. ```js const mw = require('./my-middleware.js') app.use(mw({ option1: '1', option2: '2' })) ``` Refer to [cookie-session](https://github.com/expressjs/cookie-session) and [compression](https://github.com/expressjs/compression) for examples of configurable middleware.
Elements of a middleware function call
Méthode HTTP à laquelle la fonction middleware s'applique.
</tbody>
Chemin (route) auquel la fonction middleware s'applique.
Fonction de middleware.
Argument de rappel à la fonction middleware, appelée "next" par convention.
Argument de réponse HTTP à la fonction middleware, appelé "res" par convention.
Argument de demande HTTP à la fonction middleware, appelé "req" par convention.
Edit this page