升级到Express 4并删除app.router后,我很难在路由执行后让中间件执行。
e.g。以下代码正确响应" hello",但从不调用已配置的中间件
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 );
答案 0 :(得分:38)
正确答案是使用res.on("finish", cb)
回调。
即:
express.use(function(req, res, next) {
console.log("before");
res.on("finish", function() {
console.log("after");
});
next();
});
答案 1 :(得分:22)
关于Express 4,""""你的第二个例子中的函数永远不会被调用,因为中间函数从不调用next()。
如果你想要"之后"函数被调用,然后你需要添加并调用中间函数的下一个回调,如下所示:
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(),您就不会想要更新响应标头或内容。但您可以执行其他任务,如数据库更新或日志记录。
请注意,express会查看中间件函数中的参数数量,并执行不同的逻辑。以express error handlers为例,其中定义了4个参数。
表达错误处理程序签名:app.use(function(err, req, res, next) {});
在中间件链的最后一个项目上调用next是可选的,但如果你改变了一些东西,这可能是一个好主意。
答案 2 :(得分:3)
您是否检查过next()之后调用console.log?
express.use( function( req, res, next ) {
next();
console.log( "world" );
});
express.get( "/", function( req, res ) {
res.send( "hello" );
});
答案 3 :(得分:0)
订单很重要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" );
});
答案 4 :(得分:0)
您可以在其他js文件中使用Middle ware函数,并且可以使用require函数。因此它将在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
注意:在logger.js中,您可以使用req.on(“ end”,callback)代替使用res.on(“ finish”,callback)