我想要像每条路线的快速日志请求摘要一样有中间件 =>
[POST] / books / commentpart 200 1435.472 ms - 35
我想在每个请求结束时记录更多数据。但我不知道如何编写这样的中间件。我在所有路线之后尝试过中间件功能但是没有用。在每个路由器中,我也传递next()调用。
app.use(responseTime());
//router
app
.use(users(app, db))
.use(dataLogs(app, db))
.use(category(app, db));
//log middleware
app.use(function(req, res, next) {
var data = {};
var method = req.method;
if(method == 'GET'){
data = req.query;
} else {
data = req.body;
}
var resTime = res.getHeader('X-Response-Time');
log.debug(' [ ' + iduser + ' ] - ' + req.route.path + ' - ' + resTime + ' : ' + JSON.stringify(data));
});
module.exports = app;
答案 0 :(得分:0)
中间件只是一个执行某项操作的函数,然后使用" next()"将请求传递给下一个函数。所以,如果你真的想这样做,你需要在同一条路线上捕捉所有路线,就像这样
@inject('storeOne', 'storeTwo')
答案 1 :(得分:0)
最后它奏效了。实际上,在某些路由中,我忘了在每个路由器的末尾传递next()。
现在我使用responseTime函数做另一种方法,它可以完美地工作,而不需要为所有路由添加next()。谢谢大家!
count = 0;
$('#test').on("change", function(){
count = 0;
});
$('#test').on("keyup", function(){
if(count == 0)
{
$('#tool').tooltip("show");
count = 1;
}
});
$('#tool').tooltip({
placement: "bottom",
trigger: "focus",
title: "Click here",
});
<input type="text" id="test">
<input type="button" id="tool">
答案 2 :(得分:0)
因此,中间件在注册时(使用app.use
,app.all
等)是适用于传入请求的规则队列。请注意,此注册在服务器启动时进行,并且是服务器本身的一部分,不是请求。
一旦全部设置好并且服务器正在运行,则只有在前一个跃点已明确调用next()
的情况下,才调用第一个跃点之后的任何跃点(进入队列,也称为中间件)。换句话说,如果将app.use((req, res, next) => {});
放在所有中间件的开头,则服务器将完全不执行任何操作! -此中间件只是吞下所有传入请求,而不会调用next()
。
现在的问题是,如何注册一个中间件:
满足第二个要求并不容易。因为如上所述,此规则队列中的最后一跳仅在所有先前的路由都已妥善地依次调用next()
时运行。有时由于种种原因而不会发生这种情况,包括只是忘记打电话给next()
!而且很难强迫人们这样做。
我需要在粗体上方的评论中提及@robertklep所说的内容。它正在on-finished
上使用res
! https://github.com/jshttp/on-finished
示例:
// have this before all the other middlewares
app.use((req, res) => {
console.log("I'll be the first line executed, almost ever!");
onFinished(res, (err) => {
console.log("and I'll be the last one, knowing response"
+ " code which is already sent is: " + res.statusCode);
});
};
这是什么,实际上是在响应完成时进行监听(您也可以使用on-headers)。因此,这是在快递上完成工作的一个全新维度,与现有的中间件队列机制垂直。请小心并享受! ;)