NodeJS / Express中的时间请求

将所有请求join我的节点应用程序的最佳方式是什么? 基本上我想在请求的最开始得到当前的时间戳,然后再在请求的最后得到差异并logging下来。 有关在NodeJS和Express中执行此操作的最佳方法的build议?

下面是我的应用程序的样子(尽pipe比这更复杂)。

var express = require('express'), http = require('http'), app = express(); app.get('/', function (req, res, next) { res.send(200, 'hi'); }); app.get('/about', function(req, res, next) { res.send(200, 'something else'); }); var server = http.createServer(app); server.listen(9000); console.log("Express server listening..."); 

我想要所有的请求。 所以我想要时间和/about我可能添加的任何其他端点。

这可能会诀窍: http : //www.senchalabs.org/connect/responseTime.html

 app.use(express.responseTime()); 

或者做这样的事情:

 app.use(function(req, res, next) { req.start = Date.now(); next(); }); app.get(...); app.get(...); app.use(function(req, res) { var time = Date.now() - req.start; }); 

这就要求你所有的路由在next()调用。

或者,也许这(与responseTime中间件相同,但不设置标题):

 app.use(function(req, res, next) { var start = Date.now(); res.on('header', function() { var duration = Date.now() - start; // log duration }); next(); }); 

而不是在发送标题时触发res上的'header'事件,而是根据要测量的内容来监听'finish'事件。

你可以使用内build的console.timeconsole.timeEnd函数来实现这个function:

 console.time('handler name'); ... handle the request console.timeEnd('handler name'); 

输出到控制台:

 handler name: 62ms 

或者如果你想要一个更大的时间分辨率,你可以使用process.hrtime()或者使用一个我使用hrtime构build的模块,但是会给你很多额外的信息,比如平均值,中位值,总时间等等,这个模块叫exectimer 。 这是一个例子:

 var t = require("exectimer"); app.use(function(req, res, next) { var tick = new t.Tick("responseTime"); tick.start(); res.on('header', function() { tick.stop(); }); next(); }); // when ready check the results with this: var responseTime = t.timers.responseTime; console.log(responseTime.min()); // minimal response time console.log(responseTime.max()); // minimal response time console.log(responseTime.mean()); // mean response time console.log(responseTime.median()); // median response time 

这是非常准确的,并有一个毫微秒的分辨率,没有额外的依赖。

只需获取当前时间(以毫秒为单位)(例如,通过new Date() ),当您第一次获取请求的句柄,然后是完成响应的时间,并以毫秒为单位的经过时间。

 http.createServer(function(req, res) { res.timeStart = new Date(); // ... res.end(...); var timeStop = new Date(); console.log('Elapsed ' + (timeStop-req.timeStart) + 'ms'); }); 

请注意,您可以减去date,因为Date#valueOf()以毫秒为单位返回它们的时间。

我想快速响应时间中间件是Trevor Dixon在第一个答案中提到的。 现在,您可以设置callback来获取响应时间,以防您在响应中不需要设置X-Response-Time标题。 https://github.com/expressjs/response-time#responsetimefn