通过express统计你的请求响应时间

某天,河蟹君遇到一个需求,统计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 里面拥有一个事件机制,通过监听 finishclose 事件,可以知道请求到底什么时候结束,监听这个事件,并在事件处理的过程当中,获取t2 ,计算出响应时间,这里值得注意的是,监听的方法是once,即监听一次后,并自动解除监听,如果用了on 方法,每次请求都会产生一次监听,请求多了,内存会泄漏,这里需要十分注意。

你可能感兴趣的:(通过express统计你的请求响应时间)