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

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

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

回答

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

以上是 nodejs express 没有中间件监听res.json返回给前端前的中间件 的全部内容, 来源链接: utcz.com/a/32674.html

回到顶部