nodejs express 没有中间件监听res.json返回给前端前的中间件
现有一个程序已经有接口使用,需要在每个接口上增加接口响应时间(或日志增加)。
每个控制器中都有这样的返回(如下图):
原则上res.json就是返回给前端了。就是想问问有没有中间件或事件监听res.json返回的数据。是不是只有改造每个接口在返回前进行耗时的处理再res.json。
另:请问大家的返回类都是怎样封装的,是不是每个接口都next到同一个中间件返回?
回答
通过阅读包 morgan
的源码,可以看到主要依赖的两个包实现了它的日志功能。
第一个 on-finished
, 用于给 res
注册回调,当响应完成后触发;
第二个 on-headers
, 用于给 res
注册回调,当响应开始时触发。
根据你的要求我写了一个示例,供参考:
// demo.jsconst 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.jsapp.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