2013-08-30 47 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 :)