2013-08-30 11 views
15

में समय अनुरोध मेरे नोड ऐप में आने वाले सभी अनुरोधों का सबसे अच्छा तरीका क्या होगा? असल में मैं अनुरोध की शुरुआत में वर्तमान टाइमस्टैंप प्राप्त करना चाहता हूं और फिर अनुरोध के बहुत अंत में, अंतर प्राप्त करें और इसे लॉग करें। नोडजेएस और एक्सप्रेस में ऐसा करने के सर्वोत्तम तरीके पर सिफारिशें?नोडजेएस/एक्सप्रेस

मेरा ऐप कैसा दिखता है इसका एक नमूना है (हालांकि इससे कहीं अधिक जटिल)।

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 और कुछ अन्य एंडपॉइंट जो मैं जोड़ सकता हूं।

उत्तर

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() पर कॉल करें।

या हो सकता है यह (अनुक्रिया काल मध्यस्थ के रूप एक ही बात है, लेकिन एक शीर्ष लेख निर्धारित नहीं करता है):

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

यह एकमात्र ऐसा उत्तर है जो एक्सप्रेस में मिडलवेयर के मूलभूत सिद्धांतों को समझ गया है। +1 –

+0

यह सही है। धीमी मार्गों की रिपोर्ट करने के लिए मैंने इसे रोलबार के साथ जोड़ा – 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 यह केवल तभी काम करता है जब मेरे पास केवल एक हैंडलर था? मेरे पास दर्जनों हैंडलर और एंडपॉइंट्स हैं। – tbeauvais

+0

@tbeauvais: आप प्रतिक्रिया के लिए "टाइमस्टार्ट" संलग्न कर सकते हैं, मेरा अद्यतन उत्तर देखें। – maerics

+0

मैंने अपना प्रश्न एक नमूना के साथ अपडेट किया जो मेरा ऐप दिखता है। हो सकता है कि मुझे कुछ याद आ रहा है लेकिन मुझे अभी भी यह नहीं दिख रहा है कि यह एकाधिक अंतराल के लिए कैसे काम करेगा (मेरे अलावा प्रत्येक हैंडलर को कोड के उस बिट को जोड़कर जिसे मैं टालने की कोशिश कर रहा हूं)। – tbeauvais

9

आप इस के लिए निर्मित console.time और console.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

कूल, क्या यह रूट सभी मार्गों के लिए नोड मिडलवेयर के रूप में है? – 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

मुझे लगता है कि अभिव्यक्ति के लिए प्रतिक्रिया-समय मध्यवर्ती, पहला जवाब पर ट्रेवर डिक्सन द्वारा वर्णित एक है। यदि आपको अपनी प्रतिक्रिया पर एक्स-रेस्पॉन्स-टाइम हेडर सेट करने की आवश्यकता नहीं है, तो अब आपको प्रतिक्रिया समय प्राप्त करने के लिए कॉलबैक सेट करने की अनुमति मिलती है।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 :)