2013-08-30 44 views
15

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

下面是我的应用程序样本的示例(尽管比这更复杂)。

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..."); 

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

回答

42

这可能做的伎俩: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'事件,取决于您要测量的内容。

+1

谢谢。正是我在找什么。 – tbeauvais

+1

这是唯一能够理解express中间件基础的答案。 +1 –

+0

这是完美的。我将它与Rollbar结合以报告缓慢路线 – developius

0

刚刚获取当前时间(以毫秒为单位)(例如,通过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#valueOf()返回它们以毫秒为单位的时间。

+0

止跌那只有当我只有一个处理程序时才有效?我有几十个处理程序和端点。 – tbeauvais

+0

@tbeauvais:您可以将“timeStart”附加到回复本身,请参阅我的更新回答。 – maerics

+0

我用我的应用程序外观样本更新了我的问题。也许我错过了一些东西,但我仍然没有看到这对多个端点是如何工作的(除了我为每个处理器添加一点代码以外,我试图避免)。 – tbeauvais

9

您可以使用内置的console.timeconsole.timeEnd功能如下:

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

输出到控制台:

handler name: 62ms 
+1

很酷,这是否可以作为所有路由的节点中间件进行包装? – 7zark7

+0

这如何应用到节点/快速应用程序?这是为了包装所有请求? – tbeauvais

+0

一般不能使用,不。 – JohnnyHK

2

或者,如果你愿意,你可以使用process.hrtime()或使用一个模块我已经使用hrtime但给你很多像平均值,中位数,总时间额外的信息等模块称为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 

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

0

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

+0

补充答案时,您可以对其进行评论而不是创建新答案 –

0

您可以添加到您的中间件模块morgan和使用它像这 -

const morgan = require('morgan') 
... 
... 
const app = express() 
app.use(morgan('dev')) 

然后日志将是这样的:

// :method :url :status :response-time ms - :res[content-length] 
GET /myroute 200 339.051 ms - 242 

检查morgan :)