如何访问发送到Expressjs应用程序客户端的响应代码

时间:2016-07-29 11:01:51

标签: node.js express

我想保存服务器提供的4XX和5XX错误。我采用的方法是创建一个快速中间件来获取statusCode响应

const fooMiddleware = (req, res, next) => {
  req.stats.totalRequestsServed += 1;

  // I want to access the status code sent to the client here
  console.log('status code', res.statusCode);
  next(null);
};

我正在使用上面的代码,但我总是收到200状态代码,即使我在我的路线上硬编码res.status(401).end()

3 个答案:

答案 0 :(得分:1)

您的答案可以找到here

app.use(function (req, res, next) {
    function afterResponse() {
        res.removeListener('finish', afterResponse);
        res.removeListener('close', afterResponse);

        // do smth after res.send
        console.log(res.status);
    }

    res.on('finish', afterResponse);
    res.on('close', afterResponse);

    // do smth before request eventually calling `next()`
    next();
});
Imho,钩子不是透明的。它需要一些特殊的"特殊的"案例。
错误处理程序更适合记录4xx和5xx错误。

app.get('/smth', function(req, res, next){
   if (!smth-check)
      return next(new HttpError(401, 'Error-text')); // it's custom error class
   ...
})

app.use(function(err, req, res, next)) {
   if (err instance of HttpError)
       console.log(err.status);
   ...
});

关于custom error HttpError您可以阅读 here

答案 1 :(得分:0)

我找到了一个名为on-finished的软件包来管理这个软件包,同时添加了一个监听器。可以这样使用:

const onFinished = require('on-finished');

const middleware = (req, res, next) => {

  onFinished(res, (err, res) => {
    // do smth after res.send
  });

  // do smth before request eventually calling `next()`
  next(null);
};

答案 2 :(得分:0)

您的逻辑是正确的,您只需在获取状态之前调用next ,以便其他中间件/您的路由可以设置状态代码:

const fooMiddleware = (req, res, next) => {
  req.stats.totalRequestsServed += 1;
  next();
  console.log('status code', res.statusCode);
};