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 );
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.
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();
});
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" );
});
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" );
});
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)