2017-03-03 61 views
1

匹配的網址異步請求的針的NodeJS處理陣列目標:用的StatusCode

鑑於URL的數組,我需要發送一個請求,並取回的StatusCode爲每一個。最後,我需要將statusCode與一個對象數組中的請求URL進行匹配,然後將其返回到頁面。

像這樣:

checkList: [ 
    { 
     name: "Google", 
     url: "https://www.google.com" 
    }, 
    { 
     name: "Microsoft", 
     url: "https://www.microsoft.com" 
    }, 
    { 
     name: "Github", 
     url: "https://www.github.com" 
    } 
    ] 

對於列表中的每個URL,我需要簡單地使一個HTTP請求並返回一個狀態代碼(例如:200),並匹配以請求路徑。所以最終的輸出應該是這樣的......

results: [ 
    { 
     name: "Google", 
     url: "https://www.google.com", 
     status: 200 
    }, 
    { 
     name: "Microsoft", 
     url: "https://www.microsoft.com", 
     status: 200 
    }, 
    { 
     name: "Github", 
     url: "https://www.github.com", 
     status: 200 
    } 
    ] 

我目前使用BluebirdJSNeedle處理異步調用獲得響應代碼。

問題是我看不到一種方法來匹配請求URL和響應。由於每個結果都會在不同的時間返回(如預期的那樣),並且Needle響應中不包含請求URL,所以我不能說類似......「https://google.com響應爲200」。我只能得到一個響應代碼列表。

我對高級JS比較新,所以也許有一種方法可以覆蓋回調/承諾,它允許我通過整個過程傳遞請求URL,但我不知道如何。

這是我目前使用的基於演示/段我發現其他地方的代碼的要點... https://gist.github.com/sgelliott/13840b6f2f9d2ab481fcded6dc4a9188

代碼還包括如下內聯...

var needle = require('needle'); 
var Promise = require("bluebird"); 
Promise.promisifyAll(needle); 

var allPaths = ["https://google.com", "https://microsoft.com", "https://github.com"]; 
var current = Promise.resolve(); 

Promise.map(allPaths, function(path) { 
    current = current.then(function() { 
     console.log("path: " + path); // path shows up here correctly - it's available 
     return needle.getAsync(path, options); 
    }); 
    return current; 
}).map(function(resp, body) { 
    return { 
     path: "path goes here", 
     status: resp.statusCode 
    }; 
}).then(function(results) { 
    console.log("results: " + JSON.stringify(results)); // this outputs 'resulst' : [{"path":"path goes here","status":200},{"path":"path goes here","status":302},{"path":"path goes here","status":200}] 
    return renderResults(results); //this simply sets 'statusResults' to 'results' for the next res.send to use - will refine once I solve the path matching issue 
}).then(function() { 
    console.log('All Needle requests are processed!'); 
    res.send(statusResults); // 
}).catch(function(e) { 
    console.log(e); 
}); 

如果這是其他事情的重複,我表示歉意。經過大量研究後,我無法找到它。如果解決方案是使用Needle以外的東西,那很好。我寧願堅持使用藍鳥。先謝謝你!

+0

爲什麼不把代碼放在問題本身,而不是外部鏈接將過時,然後這個問題是沒有用的未來的讀者? –

+0

在第20行...你在哪裏說'我無法訪問原始請求URL /路徑以匹配'...結果[n]不會是'allPaths [n]的結果' –

+0

@JaromandaX我從未打算摧毀Gist,但我已經調整了帖子以將其包含在內。至於你的問題......這是一個很好的問題。我假設,由於異步調用可能會在給定網絡流量的不同時間返回值,因此不能保證結果數組的順序與原始請求URL集的順序相同。你知道這樣的事情是否有保證嗎?看起來有更合適的方法來做到這一點。 – sgelliott

回答

0

我已經解決了這個問題,我希望這個解決方案適用於其他人。下面是的工作使用.bind

module.exports.gethealth = function (req, res) { 
    var statusResults = []; 
    var resultCount = 0; 
    var allPaths = []; 
    for (var item in config.checkList) { 
    allPaths[item] = config.checkList[item].url; 
    } 

    var options = {connection: 'keep-alive'}; 

    Promise.map(allPaths, function (path) { 
    console.log("path: " + path); 

    return needle.getAsync(path, options) 
     .bind(this, path) 
     .then(function (resp, body) { 
     statusResults[resultCount] = {path:path, status:resp.statusCode}; 
     resultCount++; 
     }); 
    }).then(function() { 
    res.send(statusResults); 
    }); 

}; 

讓我知道如果您有任何後續問題,更新的代碼。

相關問題