tutorial node app node.js express middleware express-4

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