我正在尝试使用Morgan来记录我的API服务器的请求。我的路线是这样的;
app.use logger('dev')
app.use '/api/collab/dataobjects/:do', if config.disable_auth then authMid.noAuthCheck else authMid.authCheck
app.use '/api/collab/dataobjects/:do', queryRouter(config.testing)
app.use '/api/collab/dataobjects/:do', queryRouter()
app.use (req, res, next) ->
console.warn "Test"
err = new Error('Not Found')
err.status = 404
next err
app.use (err, req, res, next) ->
res.status(err.status || 500)
console.warn err
res.send {
message: err.message
error: err
}
摩根大多是按预期工作的,但是在一些路线上会提供一些胡说八道;
post/api/collect/dataObjects/1/更新 - ms--
检查了一些时间后,很明显,摩根在实际返回之前正在记录这些回复。为了解决此问题,我在API路由后移动了app.use logger('dev')
线,但是在捕获路线的错误之前。放置在那里,摩根将显示状态代码和长期请求的大小,但现在,根据所有请求,它并没有显示所花费的时间;
get/api/collect/dataObjects/1 200- MS -4119
为什么摩根无法显示响应时间,我该如何修复?
我刚刚注意到这个问题已经2岁了,但是我已经完成了腿部工作,所以无论如何我都会发布答复。
我自己已经看到了类似的问题,所以我花了一点时间挖掘来弄清楚这一点。我不确定我能完全回答您的问题吗?
启动计时器:
Morgan 在调用中间件操作器方法(带有(req, res, next)
签名的一个)时,在这种情况下:
app.use logger('dev')
app.use '/api/foo/:bar', handler
报告的时间应包括处理/api/foo/:bar
的时间,但是这种情况:
app.use '/api/foo/:bar', handler
app.use logger('dev')
它应该不是包括处理/api/foo/:bar
的时间,因为计时器在handler
方法运行后开始。
停止计时器:
摩根不会停止计时器在格式化要编写的日志线之前。
除非另有配置(例如,使用immediate
选项),Morgan才能将响应完全处理到日志上,直到完全处理响应,然后使用固定的模块在完成Express请求处理完成时将其称为靠背。
报告-
而不是响应时间
我认为有几种情况会导致摩根写-
而不是响应时间:
基于源代码,看起来Morgan将在"启动计时器"时找不到设置的临时变量时,将
-
写入日志,因此编写-
以表明该值更多或少" null"。摩根还将
-
写入日志,如果请求"从不"完成处理 - 即,如果请求在未完成有效响应的情况下定时出现。(在这种情况下,我猜-
或多或少表示"无穷大")。Morgan 可能在值为0时还要编写
<。-
,这可能解释了为什么您在实际路线下方移动app.use(logger)
代码后一直在看到-
。另外,由于摩根在您的第二种情况下调用onFinished
的时间可能已经处理了响应,因此可能立即(可能是在临时启动时间变量编写之前)立即进行的回调射击,从而导致#1。
那么,为什么摩根有时会在您的原始设置中写-
?
我认为最有可能的情况是,您的"长期运行"请求是根据基础架构或另一部分的一部分进行计时。例如,位于ExpressJS应用程序前面的服务(Nginx或最终用户的Web浏览器)最终将放弃等待响应关闭连接的连接。
我需要在完成的代码库中进行挖掘(或者有人向我解释一下:)),以了解摩根在这种情况下会从中恢复过的东西,以及它将对这些信息做些什么,但是我认为响应超时与您共享的信息一致。