nodejs express 没有中间件监听res.json返回给前端前的中间件

现有一个程序已经有接口使用,需要在每个接口上增加接口响应时间(或日志增加)。
每个控制器中都有这样的返回(如下图):
image.png

原则上res.json就是返回给前端了。就是想问问有没有中间件或事件监听res.json返回的数据。是不是只有改造每个接口在返回前进行耗时的处理再res.json。
另:请问大家的返回类都是怎样封装的,是不是每个接口都next到同一个中间件返回?

阅读 3.6k
1 个回答

通过阅读包 morgan 的源码,可以看到主要依赖的两个包实现了它的日志功能。
第一个 on-finished, 用于给 res 注册回调,当响应完成后触发;
第二个 on-headers, 用于给 res 注册回调,当响应开始时触发。

根据你的要求我写了一个示例,供参考:

// demo.js
const onFinished = require('on-finished');
const onHeaders = require('on-headers');

/**
 * 记录起始时间
 */
function recordStartTime () {
  this._startAt = process.hrtime();
  this._startTime = new Date();
}
/**
 * 中间件
 */
const middleware = (req, res, next) => {
  recordStartTime.call(req);
  onHeaders(res, recordStartTime);
  const _json = res.json;
  let _body = null;
  res.json = function (body) {
    _body = body;
    _json.apply(res, arguments);
  };
  onFinished(res, () => {
    // 响应耗时
    const ms = (res._startAt[0] - req._startAt[0]) * 1e3 + 
      (res._startAt[1] - req._startAt[1]) * 1e-6;
    // 打印日志
    console.log(`响应体:${JSON.stringify(_body)},请求时间:${req._startTime}, 响应耗时:${ms.toFixed(3)}ms`);
  });
  next();
}

module.exports = { middleware }
// app.js
app.use(require('./demo').middleware);

app.get('/hello', (req, res) => {
 res.json({hello: 'world'});
});

访问 /hello 得如下日志结果:

响应体:{"hello":"world"},请求时间:Wed Jul 15 2020 11:53:12 GMT+0800 (GMT+08:00), 响应耗时:5.366ms
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题