首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点JS请求库elapsedTime值

节点JS请求库elapsedTime值
EN

Stack Overflow用户
提问于 2017-02-01 04:44:52
回答 2查看 1.5K关注 0票数 1

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

我已经阅读了nodejs request library, get the response time上的线程,可以看到请求库应该能够返回请求的“已用时间”。

我以以下方式使用它:

代码语言:javascript
复制
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)

Chrome Profiling example

在我看来,这实际上并不是对请求的完全开始和结束进行计时,而是对其他事情进行“计时”。这可能是服务器开始流式传输页面后下载页面所花费的时间。

如果是这种情况,我如何才能获得此请求所用的实际开始到结束时间?我需要的时间是从发出请求到接收整个正文和标头。

我像这样运行请求,其中listofURLs是要请求的urls数组:

代码语言:javascript
复制
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);
});
}
EN

回答 2

Stack Overflow用户

发布于 2017-02-01 05:02:06

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

node的request模块不是一个完整的浏览器,它是一个简单的HTTP请求,所以当你请求www.stackoverflow.com时,它只会加载页面返回的基本HTML,而不会加载JS文件、CSS文件、图片等。

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

看看下面的stackoverflow的网络配置文件-渲染在大约1.6秒完成,但基本的HTML页面(上栏)大约0.5秒就完成了加载。因此,如果你使用request来获取网页,它实际上只加载超文本标记语言,意思是--“上面的栏”。

票数 0
EN

Stack Overflow用户

发布于 2017-02-01 05:30:14

自己计时就行了:

代码语言:javascript
复制
var start = Date.now()
request.get({
  url : 'http://example.com'
}, function (err, response) {
  console.log('Request time in ms', Date.now() - start);
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41967158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档