2013-10-24 39 views
1

假設我有一個URL數組,並且我想確保每個URL都能正常工作,我創建了下面的代碼。但是隻有陣列中的最後一個URL正在測試。我怎樣才能確保每個url返回一個200響應代碼?要清楚這些都是我正在測試的所有遠程地址,並且它們指向體積適中的PDF。使用Node.js測試URL

根據@ lukas.pukenis的回覆進行更新。結果是相似的,實際上只檢查了幾個文件。

function check(l) { 
    console.log(l); 

    http.get(l, function(res) { 
     if (res.statusCode != 200) { 
      console.log(res.statusCode + ' on '+l); 
     } else { 
      console.log('success on ' + l); 
     } 
    }); 
} 

for (link in fileLinks) { 
    check(fileLinks[link]); 
} 

該代碼輸出:

http://somesite.com/somefile1.pdf 
http://somesite.com/somefile2.pdf 
http://somesite.com/somefile3.pdf 
... 
all the rest of them 
... 
http://somesite.com/somefile99.pdf 
success on http://somesite.com/somefile1.pdf 
success on http://somesite.com/somefile2.pdf 
404 on http://somesite.com/somefile5.pdf 
success on http://somesite.com/somefile7.pdf 
+1

如果'fileLinks'是Array,嘗試使用'.forEach(函數(項目){})'函數代替'for',其通過用於循環javascript對象中的各種鍵。它不是用於數組。 – Jondlm

回答

1

這是因爲你的循環與var l = fileLinks[link];

所以升具有數組的最後一個值的一個值每次重寫升變量。 爲了保存唯一的l值,你需要將它存儲在某個地方。更好 - 功能。像這樣:

function check(l) { 
    var req = http.get(l, function(res) { 
    if (res.statusCode != 200) { 
     console.log(res.statusCode + ' on '+l); 
    } else { 
     console.log('success on ' + l); 
    } 
    } 

    req.on('close', function() { 
    console.log('Request done'); 
    }); 

for (link in fileLinks) { 
    var l = fileLinks[link]; 
    check(l); 
} 

有一個函數在這裏沒有什麼魔力。它只是爲每個函數調用保留內存中的本地值,因此每次需要時l都是唯一的。

+0

謝謝盧卡斯。這有助於但仍未解決問題。我更新了問題以反映您的建議編輯。 – jjr2527

+0

你確定你的數組被正確迭代了嗎? for .. in ..循環用於對象迭代。請顯示你的數據集或只是它的一個結構:) –

+0

這只是一個字符串數組。我認爲它正在循環,因爲.get調用之前的日誌條目仍在寫入每條記錄。我猜測.get調用正在後臺執行,nodemon在關閉應用程序之前並未等待執行完成。 – jjr2527

1

for表達式不應與數組一起使用。這樣的事情更換for循環:

fileLinks.forEach(function(item){ 
    check(item); 
}); 

做這件事時多次傳出請求,則可能需要增加maxSockets到的東西比5,the default更大,否則你可能會得到意外的行爲。之後你require('http')做到這一點:

http.globalAgent.maxSockets = 150; 

此外,當你堅持你的console.log回調函數外,它不會在同一時間響應來自服務器後面顯示。無論如何,這是多餘的。下面是一個完整工作示例:

var http = require('http'); 
var url = require('url'); 

function check(l) { 
    var u = url.parse(l); 

    var opts = { 
    host: u.host, 
    path: u.path, 
    agent: false // prevents pooling behavior 
    }; 

    http.get(opts, function(res) { 
     if (res.statusCode != 200) { 
      console.log(res.statusCode + ' on '+l); 
     } else { 
      console.log('success on ' + l); 
     } 
    }); 
} 

fileLinks = ['http://www.google.com','http://www.google.com']; 

fileLinks.forEach(function(item){ 
    check(item); 
}); 
+0

你的例子和Lukas一樣。 maxSockets設置有幫助,但在所有請求完成之前應用程序仍然關閉。在你的例子中,150個被處理,然後另外12個,然後應用程序關閉。 – jjr2527

+0

嘗試將'agent'設置爲'false'以禁用池化行爲。 – Jondlm

+0

錯誤,我錯了那個錯誤的選項。我剛剛編輯了我的答案。試試看。 – Jondlm