我是Node的新手,在让请求库返回准确的响应时间方面遇到了一些困难。
我已经阅读了nodejs request library, get the response time上的线程,可以看到请求库应该能够返回请求的“已用时间”。
我以以下方式使用它:
request.get({
url : 'http://example.com',
time : true
},function(err, response){
console.log('Request time in ms', response.elapsedTime);
});response.elapsedTime结果在500-800ms的范围内,但是我可以看到请求实际上花费了接近5000ms的时间。
我在一个未缓存的nginx页面上测试了这一点,当通过浏览器(Chrome)进行性能分析时,它大约需要5秒来呈现页面。
下面是Chrome中计时的一个例子(尽管服务器负载很大,所以是10s)
在我看来,这实际上并不是对请求的完全开始和结束进行计时,而是对其他事情进行“计时”。这可能是服务器开始流式传输页面后下载页面所花费的时间。
如果是这种情况,我如何才能获得此请求所用的实际开始到结束时间?我需要的时间是从发出请求到接收整个正文和标头。
我像这样运行请求,其中listofURLs是要请求的urls数组:
for (var i = 0; i < listofURLs.length; i++) {
collectSingleURL(listofURLs[i].url.toString(),
function (rData) {
console.log(rData['url']+" - "+rData['responseTime']);
});
}
function collectSingleURL(urlToCall, cb) {
var https = require('https');
var http = require('http');
https.globalAgent.maxSockets = 5;
http.globalAgent.maxSockets = 5;
var request = require('request');
var start = Date.now();
// Make the request
request.get({
"url": urlToCall,
"time": true,
headers: {"Connection": "keep-alive"}
}, function (error, response, body) {
//Check for error
if (error) {
var result = {
"errorDetected": "Yes",
"errorMsg": error,
"url": urlToCall,
"timeDate": response.headers['date']
};
//callback(error);
console.log('Error in collectSingleURL:', error);
}
// All Good - pass the relevant data back to the callback
var result = {
"url": urlToCall,
"timeDate": response.headers['date'],
"responseCode": response.statusCode,
"responseMessage": response.statusMessage,
"cacheStatus": response.headers['x-magento-cache-debug'],
"fullHeaders": response.headers,
"bodyHTML": body,
"responseTime" : Date.now() - start
};
cb(result);
//console.log (cb);
});
}发布于 2017-02-01 05:02:06
你遗漏了一个关键点--渲染需要5秒,而不仅仅是下载页面。
node的request模块不是一个完整的浏览器,它是一个简单的HTTP请求,所以当你请求www.stackoverflow.com时,它只会加载页面返回的基本HTML,而不会加载JS文件、CSS文件、图片等。
另一方面,浏览器将在加载页面的基本HTML之后加载所有这些内容(一些部分将在页面加载完成之前与页面一起加载)。
看看下面的stackoverflow的网络配置文件-渲染在大约1.6秒完成,但基本的HTML页面(上栏)大约0.5秒就完成了加载。因此,如果你使用request来获取网页,它实际上只加载超文本标记语言,意思是--“上面的栏”。

发布于 2017-02-01 05:30:14
自己计时就行了:
var start = Date.now()
request.get({
url : 'http://example.com'
}, function (err, response) {
console.log('Request time in ms', Date.now() - start);
});https://stackoverflow.com/questions/41967158
复制相似问题