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

Node.js 从同一节点应用程序检索res.json()数据,node.js,express,response-time,Node.js,Express,Response Time,我目前正在使用node.js和express.js开发API服务器。我想知道关于每个api响应需要多长时间的信息。为此,我习惯于花时间 app.use(responseTime(function(req, res, time) { var log = { "date" : new Date(), "os" : req.headers['user-agent'], "requestUrl" : req.originalUrl,

我目前正在使用
node.js
express.js
开发API服务器。我想知道关于每个api响应需要多长时间的信息。为此,我习惯于花时间

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错误消息?

不幸的是,我认为这不可能在这个中间件中实现。
响应时间
中间件在发送头()之前停止计时,我相信这是在响应对象上设置主体之前。我甚至不确定身体是否被设置在响应对象上


您可以尝试使用类似这样的东西,并结合“响应时间”

不幸的是,我认为这个中间件不可能做到这一点。
响应时间
中间件在发送头()之前停止计时,我相信这是在响应对象上设置主体之前。我甚至不确定身体是否被设置在响应对象上


您可以尝试使用类似的东西,并结合使用“响应时间”

无法这样访问的原因是,响应主体从未设置在响应对象上。而是直接流式传输到客户端。因此,您必须手动将响应主体收集到响应对象中

最简单的解决方案是始终将主体(本例中为错误json)传递到响应对象内的自定义字段中。例如,在路线中,添加如下内容:

get('/myErrorRoute', function(req, res, next) {
  var errJson = {message: 'Something'};
  res.myCustomField = errJson;
  res.status(400).json(errJson);
});
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);
}));
然后在中间件中访问它,如下所示:

get('/myErrorRoute', function(req, res, next) {
  var errJson = {message: 'Something'};
  res.myCustomField = errJson;
  res.status(400).json(errJson);
});
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);
}));
或者,如果您有胆量的话,可以通过使用json()方法进行修补。
您不能这样访问的原因是,响应主体从未在响应对象上设置。而是直接流式传输到客户端。因此,您必须手动将响应主体收集到响应对象中

最简单的解决方案是始终将主体(本例中为错误json)传递到响应对象内的自定义字段中。例如,在路线中,添加如下内容:

get('/myErrorRoute', function(req, res, next) {
  var errJson = {message: 'Something'};
  res.myCustomField = errJson;
  res.status(400).json(errJson);
});
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);
}));
然后在中间件中访问它,如下所示:

get('/myErrorRoute', function(req, res, next) {
  var errJson = {message: 'Something'};
  res.myCustomField = errJson;
  res.status(400).json(errJson);
});
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);
}));
或者,如果您有胆量的话,可以通过使用json()方法进行修补。