2013-08-30 11 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

または次のようなことをしてください:

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

Wouldn私はハンドラを1つだけ持っていれば動作しますか?私にはハンドラとエンドポイントが数多くあります。 – tbeauvais

+0

@tbeauvais: "timeStart"を応答自体に付けることができます。私の更新された答えを見てください。 – maerics

+0

私の質問が、私のアプリの見た目のサンプルで更新されました。たぶん私は何かが欠けているかもしれませんが、私はこれが複数のエンドポイントでどのように機能するかはまだ分かりません(私が避けようとしているすべてのハンドラにそのコードを追加しているのを除いて)。 – tbeauvais

9

あなたは組み込みのconsole.timeconsole.timeEnd機能、このために使用することができます。コンソールへ

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

出力を:http://www.senchalabs.org/connect/responseTime.html

app.use(express.responseTime()); 

:これはトリックを行う可能性があります

handler name: 62ms 
+1

クールな、これはすべてのルートのためのノードミドルウェアとしてwrappableですか? – 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

私はExpress用の応答時間ミドルウェアは、最初の答えでTrevor Dixonが言及したものだと思います。応答時にX-Response-Timeヘッダーを設定する必要がない場合に備え、コールバックを設定して応答時間を取得できるようになりました。https://github.com/expressjs/response-time#responsetimefn

+0

答えを補完するときは、新しい答えを作成する代わりにコメントするだけです –

0

あなたのミドルウェアにモジュールmorganを追加し、this-

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 :)

関連する問題