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