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

发布于 2022-09-12 03:42:01 字数 266 浏览 15 评论 0

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

看透却不说透 2022-09-19 03:42:01

通过阅读包 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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文