我想在express.js中创建一个中间件函数。它可以监控每个请求和响应。我创建了一个中间件,但它只能监控请求,而不是响应。
initialize
答案 0 :(得分:4)
您应该知道res
中的function(req, res, next)
是类http.ServerResponse
的实例。因此,可以在finish
事件中收听,请参阅链接:https://nodejs.org/api/stream.html#stream_event_finish
app.use(function (req, res, next) {
function afterResponse() {
res.removeListener('finish', afterRequest);
res.removeListener('close', afterRequest);
// action after response
}
res.on('finish', afterResponse);
res.on('close', afterResponse);
// action before request
// eventually calling `next()`
});
app.use(app.router);
app.use()
和中间件可用于“之前”,close
和finish
事件的组合可用于“之后”。
答案 1 :(得分:2)
为此你可以编写两个中间件
1)在所有请求端点之前。
//middleware
function middlewareFunEarlier(req,res,next) {
console.log(req.body , req.params , req.query);
next();
}
app.use(middlewareFunEarlier);
app.get('/', function(req, res, next){
//do something
res.end();
});
2)所有终点之后。你必须在所有端点使用next()
app.get('/', function(req, res, next){
//do something
next();
});
app.use(middlewareFunLater);
//middlware
function middlewareFunLater(req, res, next){
console.log(res);
res.end();
}
可以使用现有工具。
答案 2 :(得分:0)
好的,首先,您只看到请求的原因是因为中间件的工作原理。一切按特定顺序运行一次,并且只运行一次。当您的中间件运行时,很可能在创建响应之前。为了获得响应,您必须在控制器进行渲染或类似操作时使代码运行。
其次,看起来基本的日志记录就像你需要的一样。(天气就是图书馆或只是控制台记录的东西。)