从同一节点应用程序中检索res.json()数据

时间:2016-06-16 03:57:57

标签: node.js express response-time

我目前正在使用node.jsexpress.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错误消息?

2 个答案:

答案 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