node.js - app - node js express tutorial
Node Express 4 middleware después de rutas. (5)
Tras la actualización a Express 4 y la eliminación de app.router, estoy luchando para que el middleware se ejecute después de que se ejecuten las rutas.
por ejemplo, el siguiente código responde correctamente con "hola", pero nunca llama al middleware configurado
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 );
ACLARACIÓN:
El siguiente código muestra "antes" en la consola, pero no "despué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 );
¿Has verificado poner tu console.log después de la siguiente () llamada?
express.use( function( req, res, next ) {
next();
console.log( "world" );
});
express.get( "/", function( req, res ) {
res.send( "hello" );
});
Con respecto a Express 4, la función "después" de su segundo ejemplo nunca recibe una llamada porque la función del medio nunca llama a next ().
Si desea que se llame a la función "después", entonces necesita agregar y llamar a la siguiente devolución de llamada desde su función intermedia como esta:
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()
escribe los encabezados y la respuesta de nuevo al cliente.
Tenga en cuenta que una vez que se haya llamado a res.send (), no querrá actualizar sus encabezados o contenidos de respuesta. Pero puedes hacer otras tareas como actualizaciones de base de datos o registro.
Tenga en cuenta que Express examina el número de argumentos en la función de middleware y realiza una lógica diferente. Tomemos por ejemplo los manejadores de errores rápidos , que tienen 4 parámetros definidos.
expresa la firma del controlador de errores: app.use(function(err, req, res, next) {});
Llamar al siguiente en el último elemento de su cadena de middleware es opcional, pero probablemente sea una buena idea en caso de que alguna vez cambie las cosas.
El pedido es importante 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" );
});
La respuesta correcta es usar la devolución de llamada res.on("finish", cb)
.
es decir:
express.use(function(req, res, next) {
console.log("before");
res.on("finish", function() {
console.log("after");
});
next();
});
Si puedes trabajar con otro framework, te sugiero que uses ZinkyJS , tiene una forma integrada de hacerlo. Compruebe aquí: ZinkyJS DESPUÉS DE LOS HOOKS