2013-08-07 7 views
7

Utilizzando la nodejs request libreria: https://github.com/mikeal/requestnodejs biblioteca richiesta, ottenere il tempo di risposta

var request = require('request'); 
request('http://example.com', function (error, response, body) { 
    ... 
}) 

E 'possibile ottenere il tempo di risposta sul richiamata? Il documento menziona response.statusCode. guardando il codice sorgente della libreria vedo anche response.headers e response.href non documentati, ma non vedo responseTime o simili.

oppure esiste una libreria alternativa a request che fornisce il tempo di risposta?

ps: so che potrei fare qualcosa di simile, ma non è una soluzione, visto che sto facendo molte richieste asincrone e non posso controllare quando ogni richiesta verrà avviata.

var request = require('request'); 
var start = new Date(); 
request('http://example.com', function (error, response, body) { 
    ... 
    var responseTime = new Date() - start; 
}) 

risposta

10

La biblioteca richiesta può fare tempistica per voi (docs):

request.get({ 
    url : 'http://example.com', 
    time : true 
},function(err, response){ 
    console.log('Request time in ms', response.elapsedTime); 
}); 

Come suggerisce la questione, si potrebbe ottenere i problemi con l'approccio di avviare un timer, chiamando request, quindi arrestare il timer nella richiamata:

var start = new Date(); 
request.get('http://example.com', function(err, response){ 
    // NOT GOOD 
    console.log('Request time plus 5 seconds', new Date() - start); 
}); 
require('sleep').sleep(5); // time-consuming synchronous action 
6

Qualcosa di simile

var timedReq = function(url, next) { 
    var start = new Date(); 
    request(url, function(err, res, body) { 
    res.responseTime = new Date() - start; 
    next(err, res, body); 
    }); 
}; 

lo farà per voi. Questo sembra abbastanza piccolo che probabilmente è più facile che trovare una nuova libreria.

+1

Consiglierei di utilizzare http://nodejs.org/api/process.html#process_process_hrtime anziché Data. Lo uso per http://arrowbreaker.com/demos/sup e fornisce risultati piuttosto accurati. – Pickels

+0

@Pickels non ne aveva sentito parlare. Non voglio introdurre le complicazioni nell'affrontare quell'array '[secondi, ns]' nel mio esempio, ma sembra una buona idea. –

+5

Non è complicato affatto! 'var start = process.hrtime();' e 'res.responseTime = parseInt (process.hrtime (start) [1]/10000000, 10);' Okay, ho mentito. – Pickels

2

Invece di utilizzare Date(), è anche possibile utilizzare process.hrtime. Ho una libreria specifica per questo tipo di casi che usa hrtime. Il nome della libreria è exectimer.

Si può usare in questo modo:

var timedReq = function(url, next) { 
    var tick = new t.Tick("responseTime"); 
    tick.start(); 
    request(url, function(err, res, body) { 
    tick.stop(); 
    next(err, res, body); 
    }); 
}; 

// 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 
Problemi correlati