2017-08-30 1 views
0

Ich habe eine Liste der Server JSON-Objekte, die aus einer JSON-Datei gelesen werden.NodeJS Closure - Schleife durch Array von Objekten und ping einen Server mit Daten aus jedem Objekt

Ich bin durch jedes Server-Objekt durchlaufen, einen Wert aus dem Objekt und verkettet es mit einer Zeichenfolge, um eine URL zu erstellen. Dann mache ich eine Get-Anfrage mit der URL, um zu überprüfen, ob der Server läuft. Das Ergebnis der get-Anforderung sollte den Status jedes Serverobjekts festlegen.

Das Problem ist, dass bei jeder Schleife der Wert im Server-Objekt als undefiniert angezeigt wird. Ich kann nicht herausfinden, wo das Problem mit meiner Schließung es ist.

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; 
} 

Antwort

2

Der Status ist undefined weil Sie asynchronen Code ping.get innerhalb einer synchronen Schleife einzufügen versuchen.

Sie wollen einen Blick über Promise.all(), Promises, async/await


Hier ein Beispiel für die Funktion, die im Begriff, die 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); 
     }); 
    }); 
    } 

Hier macht ist, ist, wie Sie es nennen

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

Vielen Dank für Ihre Hilfe. Der Fehler, den ich bekomme, wenn ich diesen Code ausführe ist UnhandledPromiseRejectionWarning: Unhandled Versprechen Ablehnung (Ablehnung ID: 3): Fehler: Kann nicht den Domain-Namen bestimmen um das zu lösen? – emerfan

+0

Ja, Sie müssen eine '.catch()' zum 'promise.all' hinzufügen Ich werde meine Antwort bearbeiten –

Verwandte Themen