Node Express 4路由后的中间件

在升级到Express 4以及删除app.router之后,我很难在路由执行后让中间件执行。

例如下面的代码正确地回应“你好”,但从不调用configuration的中间件

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

澄清:

以下代码在控制台上显示“之前”,但不显示“之后”:

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

关于Express 4,第二个例子中的“after”函数永远不会被调用,因为中间函数永远不会调用next()。

如果你想要“后”函数被调用,那么你需要添加并从你的中间函数调用下一个callback,如下所示:

 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()将头文件和响应写回客户端。

注意,一旦res.send()被调用,你将不想更新你的响应头或内容。 但是您可以执行其他任务,如数据库更新或日志logging。

请注意,express会查看中间件函数中的参数个数,并执行不同的逻辑。 以明确的error handling程序为例,其中定义了4个参数。

expressionerror handling程序签名: app.use(function(err, req, res, next) {});

接下来调用中间件链中的最后一项是可选的,但是如果你改变了一些东西,可能是一个好主意。

正确的答案是使用res.on('finish', cb)callback。

即:

 express.use(function(req, res, next) { console.log("before"); res.on('finish', function() { console.log("after); }); next(); }); 

你有没有检查把你的console.log后()调用?

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

顺序很重要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" ); });