节点JS请求库elapsedTime值

时间:2017-01-31 20:44:52

标签: javascript node.js

我是Node的新手,并且在让Request库返回准确的响应时间方面遇到了一些困难。

我已经阅读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中的时间示例(尽管服务器处于负载状态,因此为10秒)

Chrome Profiling example

在我看来,这并不是实际完成请求的完整开始计时,而是“计时”其他内容。可能是服务器开始流式传输后下载页面所需的时间。

如果是这种情况,我怎样才能获得此请求的实际开始时间?我需要的时间是从请求到接收整个正文和标题。

我正在运行这样的请求,listofURLs是要请求的网址数组:

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);
});
}

2 个答案:

答案 0 :(得分:0)

你错过了一个关键点 - 渲染需要5秒钟,而不仅仅是下载页面。

节点的package.json模块不是一个完整的浏览器,它是一个简单的HTTP请求,所以当您例如请求request时,它只会加载页面返回的基本HTML,它会不加载JS文件,CSS文件,图像等。

另一方面,浏览器将在加载页面的基本HTML之后加载所有这些内容(某些部分将在页面加载完毕之前加载,并与页面一起加载)。

看一下stackoverflow下面的网络分析 - 渲染在~1.6秒完成,但基本的HTML页面(上面的条)已经完成加载大约0.5秒。因此,如果您使用www.stackoverflow.com来获取网页,它实际上只会加载HTML,这意味着 - “上方栏”。

enter image description here

答案 1 :(得分:0)

请自己动手:

var start = Date.now()
request.get({
  url : 'http://example.com'
}, function (err, response) {
  console.log('Request time in ms', Date.now() - start);
});