web-dev-qa-db-fra.com

Node Middleware Express 4 après les routes

Suite à la mise à niveau vers Express 4 et à la suppression de app.router, j'ai du mal à exécuter le middleware après l'exécution des routes.

par exemple. le code suivant répond correctement par "bonjour", mais n'appelle jamais le middleware configuré

var express = require( "express" )();

express.get( "/", function( req, res ) {

    res.send( "hello" );

} );
express.use( function( req, res, next ) {

    console.log( "world" );
    next();

} );

express.listen( 8888 );

CLARIFICATION:

le code suivant affiche "avant" sur la console, mais pas "après":

var express = require( "express" )();

express.use( function( req, res, next ) {

    console.log( "before" );
    next();

} );
express.get( "/", function( req, res ) {

    res.send( "hello" );

} );
express.use( function( req, res, next ) {

    console.log( "after" );
    next();

} );

express.listen( 8888 );
29
goofballLogic

En ce qui concerne Express 4, la fonction "after" de votre deuxième exemple n'est jamais appelée car la fonction intermédiaire n'appelle jamais next ().

Si vous souhaitez que la fonction "après" soit appelée, vous devez ajouter et appeler le prochain rappel à partir de votre fonction intermédiaire comme ceci:

var express = require( "express" )();

express.use( function( req, res, next ) {

  console.log( "before" );
  next();

} );
express.get( "/", function( req, res, next ) {

  res.send( "hello" );
  next();      // <=== call next for following middleware 

} );
express.use( function( req, res, next ) {

  console.log( "after" );
  next();

} );

express.listen( 8888 );

res.send() écrit les en-têtes et la réponse au client.

Attention, une fois que res.send () aura été appelé, vous ne voudrez plus mettre à jour vos en-têtes ou contenus de réponse. Mais vous pouvez effectuer d'autres tâches comme les mises à jour de la base de données ou la journalisation.

Notez qu'express examine le nombre d'arguments dans la fonction middleware et fait une logique différente. Prenez gestionnaires d'erreur express par exemple, qui ont 4 paramètres définis.

exprimer la signature du gestionnaire d'erreurs: app.use(function(err, req, res, next) {});

L'appel suivant sur le tout dernier élément de votre chaîne de middleware est facultatif, mais probablement une bonne idée au cas où vous changeriez les choses.

24
Joseph Snow

La bonne réponse consiste à utiliser la fonction de rappel res.on("finish", cb).

c'est à dire.:

express.use(function(req, res, next) {
    console.log("before");

    res.on("finish", function() {
        console.log("after");
    });

    next();
});
46
Test

Avez-vous vérifié la mise de votre console.log après le prochain appel ()?

express.use( function( req, res, next ) {
  next();
  console.log( "world" );
});
express.get( "/", function( req, res ) {
  res.send( "hello" );
});
4
marcosnils

L'ordre est important http://expressjs.com/4x/api.html#app.use

express.use( function( req, res, next ) {
  console.log( "world" );
  next();
});
express.get( "/", function( req, res ) {
  res.send( "hello" );
});
0
vinayr

vous pouvez utiliser la fonction Middleware dans différents fichiers js et vous pouvez utiliser la fonction require. afin qu'il soit appelé avant et après la requête http.

    index.js:     
        const logger = require("./logger");    
           const express = require("express");    
           var app = express();    
           app.listen("3000",()=>console.log("listening on 3000..."))    
        app.use(logger("AppServer"));    
        //get expression    
        app.get("/", function(req,res){    
           console.log("res not received");    
            res.send("Hello World");    
           console.log("res received");    
        })   

    logger.js   

    module.exports = (applicationName) =>{
        return function log(req,res,next){
       console.log(applicationName+" started "+os.hostname);
        res.on("finish",()=>{
            console.log(applicationName+" completed "+os.hostname);
        })
        next();
        }};

output:   
AppServer started hostname-PC   
res not received   
res received   
AppServer completed hostname-PC 

Remarque: dans logger.js au lieu d'utiliser res.on ("finish", callback), vous pouvez utiliser req.on ("end", callback)

0
Loganathan .R