为什么http.get在NodeJS中花费这么长时间?

时间:2020-07-18 16:34:41

标签: node.js http http-headers

使用NodeJS和 http.get ,我试图查看网站是否使用重定向。我尝试了一些效果很好的网址。但是,当我在washingtonpost.com上运行代码时,花费了超过5秒钟的时间。在我的浏览器中,网站正常运行。可能是什么问题?

console.time("Done. Script executed in");
const http = require("http");

function checkRedirectHttp(input){
    return new Promise((resolve) => {
        http.get(input, {method: 'HEAD'}, (res) => { resolve([res.headers.location, res.statusCode]) })
            .on('error', (e) => { throw {Error: `Cannot reach website ${input}`} });
    }); 
};

checkRedirectHttp("http://www.washingtonpost.com/").then(result => {
    console.log(result);
    console.timeEnd("Done. Script executed in");
})

输出:

[
  'http://www.washingtonpost.com/gdpr-consent/?next_url=https%3a%2f%2fwww.washingtonpost.com%2f',
  302
]
Done. Script executed in: 8.101s

1 个答案:

答案 0 :(得分:1)

我运行了您的代码,对其进行了一些增强,然后慢慢添加回当我转到浏览器中相同链接时从浏览器发送的实际标头。当我将请求更改为“ GET”(不再是“ HEAD”)并从浏览器添加以下标头时:

            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36",
            "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
            "accept-encoding": "gzip, deflate, br",
            "accept-language": "en-US,en;q=0.9",
            "cookie": "a very long cookie here"

然后,响应从9秒变为71ms。

因此,显然服务器不喜欢HEAD请求,也不喜欢它期望丢失的大量头文件。可能是它检测到这不是一个真正的浏览器,或者只是分析了8秒钟,或者只是故意延迟了对“假客户端”的响应。

此外,如果您使用http://www.washingtonpost.com URL而不是https://www.washingtonpost.com,那么它每次都会重定向到https。因此,您最好以URL的https://形式开始。

相关问题