某天,河蟹君遇到一个需求,统计express服务器得api相应时间。基本思路是:当请求过来得时候,记录一下当前时间t1,然后api响应结束时间是t2, 响应时间 = t2 - t1
嗯,实现思路很清晰,另外,最好利用express的中间件机制来实现,这样才能够做到,足够的通用性,监听所有api的响应情况。
那么问题来了,需要知道中间件是从将请求处理,从一个中间件的数据流到另外一个中间件知道数据输出,我们虽然能够轻松地记录到t1,但是t2 却因为这种模型而变得获取困难,难道我们需要再每次响应的时候,特意记录一下t2,想想都觉得是一个非常庞大的工程。
如果你也遇到这种问题,河蟹君,确实有个办法解决
exports.responseTime = function () {
return function (req, res, next) {
req._startTime = new Date() // 获取时间 t1
var calResponseTime = function () {
var now = new Date(); //获取时间 t2
var deltaTime = now - req._startTime;
console.log(deltaTime);
}
res.once('finish', calResponseTime);
res.once('close', calResponseTime);
return next();
}
}
使用中间件
app.use(responseTime())
express 里面拥有一个事件机制,通过监听 finish
和 close
事件,可以知道请求到底什么时候结束,监听这个事件,并在事件处理的过程当中,获取t2 ,计算出响应时间,这里值得注意的是,监听的方法是once,即监听一次后,并自动解除监听,如果用了on 方法,每次请求都会产生一次监听,请求多了,内存会泄漏,这里需要十分注意。
网友评论