2017-02-22 101 views
1

我exxt这段代码下载网站,然后在下载完成后执行回调函数。Node.js没有下载完整的网站

var request = require("request"); 

var options = { 
    uri: "http://www.hellointernet.fm/podcast?format=rss", 
    headers: { 
    'User-Agent': 'request' 
    } 
}; 

request(options, function(error, response, body) { 
    console.log(body); 
}); 

但是它在执行回调时并没有下载完整的网站。我试着用其他网址,它的工作。

如何等待整个页面下载?

+0

那么,这台服务器肯定有一些东西。你的代码没有问题。如果你运行一个包嗅探器,你可以看到服务器实际上停止提前发送数据。现在的问题是为什么。 – Brad

+0

啊,这个服务器没有正确处理'connection:close'。 – Brad

+0

似乎从命令行'curl -A“请求”http://www.hellointernet.fm/podcast?format = rss' – doublesharp

回答

1

这里的问题是,你正在处理一个表现不好的服务器。你的代码很好。

在电线,您的应用程序写入此HTTP请求:

GET /podcast?format=rss HTTP/1.1 
User-Agent: request 
host: www.hellointernet.fm 
Connection: close 

然后,服务器在长度与每个请求70KB和我们期待的全部360872个字节之间的变化,地方使用的数据响应。服务器缓冲区完全发送之前,连接正在关闭。破碎的服务器,你可以做的不多。

但是,如果您改为告诉服务器您打算使用HTTP/1.1保持活动状态,它就会起作用。

GET /podcast?format=rss HTTP/1.1 
User-Agent: request 
host: www.hellointernet.fm 
Connection: keep-alive 

原因是服务器没有过早地关闭连接。基本上,你正在窃取服务器的bug。

要在代码中实现这一点,添加这个靠近顶部:

var http = require('http'); 

然后,在您的要求选择:

agent: http.Agent({keepAlive: true}) 

基本上,这告诉编译器使用一个HTTP代理请求模块(这使得在Node.js应用程序中保持活动状态)。通过代理,HTTP客户端可以发出一个保持活动状态的HTTP请求,从而解决服务器问题。

我建议联系谁运行hellointernet.fm,并告诉他们他们的服务器坏了。这可能会打破各种客户。

+0

非常感谢! –

+0

@PeterMaskulio没问题。如果你想在未来自己调试这些东西,我建议你使用Wireshark和Fiddler。我使用Fiddler的原因很多,因为它非常擅长检测HTTP协议违规,其中许多在基于浏览器的HTTP请求工具中无法检测到。 – Brad