2017-08-30 5 views
0

JSONファイルから読み込まれるサーバーJSONオブジェクトのリストがあります。NodeJS Closure - オブジェクトの配列をループし、各オブジェクトのデータでサーバーにpingを実行

私は各サーバーオブジェクトをループし、オブジェクトから値を取り出し、文字列と連結してURLを作成します。次に、URLを使ってリクエストを出して、サーバーが起動しているかどうかを確認します。取得リクエストの結果は、各サーバーオブジェクトのステータスを設定する必要があります。

問題は、各ループでサーバーオブジェクトの値が未定義として表示されていることです。私はどこで問題を解決するかわからない。

var servers = require('./data/servers.json'); 
var ping = require('http'); 

var newServers = statusChecker(servers); 

function statusChecker(servers) { 
var i; 
for(i=0;i<servers.length;i++) { 
    servers[i]['status'] = function(j) { 
     return function() { 
       var proto = 'http://' 
       var server = servers[i].servername; 
       var healthEndPoint = '/health-end-point'; 
       var url = proto+server+healthEndPoint; 
        //This logs the url with the server part undefined 
        console.log(url); 
        ping.get(url, function(res){ 
         console.log(res); 
         return true; 
        }).on('error', function(e){ 
         return false; 
        });    
     }() 
    }(i); 
} 
return servers; 
} 

答えて

2

あなたは、同期ループ内で非同期コードping.getを挿入しようとしているので、ステータスはundefinedです。あなたのしたいが、約Promise.all()Promisesasync/await


ここで見てみ

つもりがpingここ

function asynchronousPing(oneServer) { 
    return new Promise((resolve, reject) => { 
     const proto = 'http://' 
     const server = oneServer.servername; 
     const healthEndPoint = '/health-end-point'; 
     const url = proto + server + healthEndPoint; 

     ping.get(url, function (res) { 
     resolve(true); 
     }).on('error', function (e) { 
     resolve(false); 
     }); 
    }); 
    } 

は、あなたがそれを呼び出す方法ですになります関数の例です

Promise.all(servers.map(x => asynchronousPing(x))) 
    .then((allStatus) => { 
     console.log(allStatus); 
    }) 
    .catch((err) => { 
     console.log(err); 
    }); 
+0

ありがとうございました。このコードを実行するとエラーが発生する:UnhandledPromiseRejectionWarning:未処理の約束拒否(拒否ID:3):エラー:ドメイン名を特定できないサーバー名をハードコードすると、約束のリストが返されます。これを解決するには? – emerfan

+0

はい、 'promise.all'に' .catch() 'を追加する必要があります。私は自分の答えを編集します –

関連する問題