我目前正在使用node.js
和express.js
开发API服务器。我想知道每个api响应多长时间的信息。为此,我使用response-time来获取时间。
app.use(responseTime(function(req, res, time) {
var log = {
"date" : new Date(),
"os" : req.headers['user-agent'],
"requestUrl" : req.originalUrl,
"ipAddress" : req.ip,
"requestMethod" : req.method,
"statusCode" : res.statusCode,
"statusMessage" : "",
"timeTaken" : Math.floor(time),
"data" : JSON.stringify(req.body)
};
// save log data
}));
对于每个API响应,我都使用json方法来表示错误,即res.status(400).json({message: 'Something'})
。
如何在responseTime
函数中检索json错误消息?
答案 0 :(得分:2)
不幸的是,我认为这个中间件不可能。 response-time
中间件在发送标头(using onHeaders
)之前停止计时,我认为这是在响应对象上设置正文之前。我甚至不确定身体是否被设置在响应对象上。
你可以尝试使用像mung这样的东西,结合`response-time?
答案 1 :(得分:1)
您无法访问的原因是因为响应主体永远不会在响应对象上设置。相反,它直接流式传输到客户端。因此,您必须手动将响应主体收集到响应对象中。
最简单的解决方案是始终将正文(在您的情况下为错误json)传递到响应对象内的自定义字段。例如,在您的路线中,添加如下内容:
app.use(responseTime(function(req, res, time) {
var log = {
"date" : new Date(),
"os" : req.headers['user-agent'],
"requestUrl" : req.originalUrl,
"ipAddress" : req.ip,
"requestMethod" : req.method,
"statusCode" : res.statusCode,
"statusMessage" : "",
"timeTaken" : Math.floor(time),
"data" : JSON.stringify(req.body)
};
// acces your custom field
console.log(res.myCustomField);
}));
然后在你的中间件中访问它:
hash("abc") returns SC0wA //just an example value, not a real hash key
hash("bac") returns SC0wA
...
hash("cba") returns SC0wA
或者,如果你大胆,猴子修补json()方法这样做。 example here