2016-04-14 13 views
0

Ich habe eine Anforderung, dass ich meine Aufgabe nach dem Starten eines HTTP-Servers ausführen möchte.Wie überprüft man, ob der untergeordnete Knotenprozess vollständig ausgeführt wird und auf Anfragen wartet

Aber ich kann nicht überprüfen, ob der Server gebootet wird.

Stattdessen habe ich eine setTimeout-Funktion verwendet, um davon auszugehen, dass der Server mit 2 Sekunden Intervall gestartet wird.

Könnte mir jemand, der eine bessere Lösung kennt, helfen?

Vielen Dank!

Mein Code ist wie folgt:

// main.js 
function exec(command) { 

    var defer = q.defer(); 
    var child = childProcess.exec(command, function (err, stdout, stderr) { 
     if (err) { 
      return defer.reject(err); 
     } 
    }); 

    child.stdout.pipe(process.stdout); 

    // TODO: find another graceful way to check child process ends 
    setTimeout(function() { 
     defer.resolve(); 
    }, 2000); 

    return defer.promise; 

} 

exec('"' + process.execPath + '" app.js') 
    .then(function() { 
     // my task here; 
     console.log('my task') 
    }); 

// app.js 
var http = require('http'), 
    server; 

server = http.createServer(function (req, res) { 
    // serve html; 
    res.end('hello world'); 
}); 

server.listen(9999); 

// run 
$> node main.js 

Antwort

0

Eine gute Lösung auf den Webserver zu verbinden, um zu versuchen wäre, bis er antwortet. Da Sie Q verwenden, können Sie sich den Code von this answer ansehen, mit dem Sie einen Vorgang wiederholen können, bis er erfolgreich ist.

function retry(operation, delay) { 
    return operation().catch(function(reason) { 
     // Note: I replaced delay * 2 by delay, it will be better in your case 
     return Q.delay(delay).then(retry.bind(null, operation, delay)); 
    }); 
} 

Dann könnte man so etwas tun

startMyWebServer() 
.then (function() { 
    return retry(connectToWebServer, 500).timeout(10000); 
}) 
.then(function() { 
    console.log("Webserver ready") 
}) 
.catch(function (err) { 
    console.log("Unable to contact webserver") 
}); 

Der Aufruf von retry wird versuchen auf den Webserver zu verbinden, wenn die vorherige Verbindung fehlgeschlagen ist, mit einer Verzögerung von 500ms. Wenn es nach 10s nicht gelang, wird das Versprechen abgelehnt.

Die connectToWebServer Funktion sollte eine Funktion sein, die auf den Webserver zu verbinden versucht und gibt ein Versprechen, das heißt so etwas wie

function connectToWebServer() { 
    var d = q.defer(); 
    request('http://your-ip:your-port', function (err, res) { 
     if (err || res.statusCode != 200) { 
      return d.reject("Error : "+(err || "status code "+res.statusCode)); 
     } 
     d.resolve(); 
    } 
    return d.promise; 
} 
+0

THX ... Es wäre besser, wenn child_process relevantes Ereignis zur Verfügung gestellt zu erfassen –