2017-02-27 2 views
1

Ich habe einen NodeJS Kind Prozess für Nachrichten mit process.on('message', callback) hören aber der Prozess wird sofort beendet. Aus meiner Lektüre sollte das nicht geschehen, da ich einen Rückruf auf die Ereignisschleife habe, warum also NodeJS beendet?NodeJS beendet vorzeitig

Der folgende Beispielcode sollte in der Lage sein, als eigenständiger NodeJS-Prozess zu laufen und nicht zu beenden, richtig?

Knoten Version: 7.3.0

Beispielcode:

function handle(msg) { 
    //do work here 
} 

process.on('message', (msg) => { 
    handle(msg); 
} 
+0

Können Sie uns ein wenig mehr Informationen geben - wie wird dieser Code ausgeführt? Und wenn Sie exit sagen, wird das Programm selbst beendet? Ist das ein eigenständiges Skript oder ein Server? Wenn Sie die Dokumentation für das Ereignis "message" überprüfen würden - https://nodejs.org/api/process.html#process_event_message - würden Sie bemerken, dass es nur ausgelöst wird, wenn der Node-Prozess über IPC erzeugt wird. – GPX

+0

Das Beispiel ist es ziemlich .. Ich spawn das Skript oben mit Kind process.fork und der Kind-Prozess beendet nur nach dem Ausführen des Skripts, aber ich will es am Leben bleiben hören Nachrichten für einige Arbeit in der separaten erzeugten Prozess anstatt jedes Mal einen neuen Prozess hervorzubringen, wenn ich die Arbeit brauche – weagle08

Antwort

1

Hier ist ein Beispielprogramm, das Ihr Problem emuliert.

master.js

const cp = require('child_process'); 
const child = cp.spawn('node', ['./child.js'], {stdio: ['ipc']}) 
child.stdout.on('data', data => console.log(data.toString())) 
child.send('immediate execute MESSAGE 1') 
setTimeout(() => { 
    child.send('late execute MESSAGE 2 after 4 seconds') 
}, 4000) 

child.js

function handle(msg) { 
    console.log('Handling message -> ', msg); 
} 

process.on('message', (msg) => { 
    handle(msg); 
}); 

process.on('exit',() => { 
    process.disconnect(); 
}); 

Die wichtigsten Dinge zu beachten sind -

  1. child_process.spawn - Spawn einen Puffer zurückgibt, und Sie können die stdout str anhören sobald der Kindprozess beginnt.
  2. {stdio: ['ipc']} - Mit dieser Option können Sie einen IPC-Kanal mit dem erzeugten Child-Prozess öffnen. Wenn Sie das Kind trennen möchten, verwenden Sie einfach child.disconnect().
Verwandte Themen