2013-08-07 41 views
7

Sử dụng nodejs request thư viện: https://github.com/mikeal/requestnodejs thư viện yêu cầu, có thời gian phản ứng

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

Có thể để có được thời gian phản ứng trên gọi lại? Tài liệu đề cập đến response.statusCode. nhìn vào mã nguồn thư viện tôi cũng thấy response.headers không phản hồi và response.href, nhưng tôi không thấy responseTime hoặc tương tự.

hoặc, có thư viện thay thế nào cho request cung cấp thời gian phản hồi không?

ps: Tôi biết tôi có thể làm một cái gì đó như thế này, nhưng đó không phải là một giải pháp, vì tôi đang thực hiện nhiều yêu cầu không đồng bộ và tôi không thể kiểm soát khi mỗi yêu cầu sẽ được bắt đầu.

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

Trả lời

10

Thư viện yêu cầu có thể làm thời gian cho bạn (docs):

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

Như câu hỏi ngụ ý, bạn có thể nhận được các vấn đề với cách tiếp cận của bắt đầu hẹn giờ, gọi số request rồi dừng hẹn giờ trong cuộc gọi lại:

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

Something như

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

sẽ làm điều đó cho bạn. Điều này có vẻ đủ nhỏ để có thể dễ dàng hơn việc tìm một thư viện mới.

+1

Tôi khuyên bạn nên sử dụng http://nodejs.org/api/process.html#process_process_hrtime thay vì Ngày. Tôi sử dụng nó cho http://arrowbreaker.com/demos/sup và nó cho kết quả khá chính xác. – Pickels

+0

@Pickels Đã không nghe nói về điều đó. Tôi không muốn giới thiệu các biến chứng của việc xử lý mảng '[giây, ns]' đó cho ví dụ của tôi, nhưng điều đó dường như là một ý tưởng hay. –

+5

Không phức tạp chút nào! 'var start = process.hrtime();' và 'res.responseTime = parseInt (process.hrtime (start) [1]/10000000, 10);' Được rồi, tôi đã nói dối. – Pickels

2

Thay vì sử dụng Date(), bạn cũng có thể sử dụng process.hrtime. Tôi có một thư viện đặc biệt cho các loại trường hợp sử dụng giờ. Tên thư viện là exectimer.

Bạn có thể sử dụng nó như thế này:

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 
Các vấn đề liên quan