2017-02-22 97 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