Das ist sehr interessant! Was ist los?Master erhält ein leeres Fehlerobjekt vom Worker
- Master-Prozess gestartet
- Master-Gabeln einen neuen Prozess
- Master (auch ein Arbeiter genannt) auch aktiviert einen Zuhörer auf sich selbst, so dass es zu wissen, kommt, wenn ein Arbeiter online. (Sobald ein Mitarbeiter online ist, sendet der Master ihm eine Begrüßungsnachricht)
- Worker wird gestartet
- Worker registriert einen Listener auf sich selbst. Wenn eine Nachricht vom Master an den Mitarbeiter gesendet wird, wird sie von ihr empfangen.
- Sobald die Begrüßung vom Worker empfangen wird, ruft sie eine Routine auf, aber es tritt ein Fehler auf. Der Worker möchte das vollständige Fehlerobjekt melden, das von der gerade aufgerufenen Routine gemeldet wurde.
- Der Mitarbeiter wickelt das Fehlerobjekt in ein Objekt ein und fügt auch einige neue Schlüssel hinzu und verwendet die
send
, um dem Master Bericht zu erstatten. - Der Master hört dem Worker zu und empfängt die Nachricht, findet aber nicht das Fehlerobjekt, das vom Worker gesendet wurde!
Dies war das Ende der Geschichte.
Das Problem wird im letzten Punkt beschrieben. Das Fehlerobjekt wird vom Master nicht empfangen. Was könnte der Grund sein? Der Worker hat das Fehlerobjekt intakt, bevor es an den Master gesendet wird.
Hier ist der Code für die Beschreibung oben ist:
const cluster = require('cluster');
const Promise = require('bluebird');
if (cluster.isMaster) {
console.log(`Master process is running`);
let worker = cluster.fork(); // START A WORKER
worker.on('message', (message) => { // LISTEN TO WORKER
console.log(`Received from worker: ${message}`);
});
cluster.on('online', (worker) => { // LISTEN TO WHEN WORKER IS ONLINE
worker.send('Hello worker'); // SEND HER A MESSAGE
});
} else {
process.on('message', async (message) => { // LISTEN TO HER MASTER
try {
let response = await calculate();
process.send({
status: true,
trace: null,
message: 'ok'
});
} catch (err) {
process.send({
status: false,
trace: err, // ERR WAS HERE, BUT DOESN'T REACH MASTER!
message: err.message
});
}
});
}
function calculate() {
try {
throw new Error('This will take forever to compute');
} catch (err) {
return Promise.reject(err);
}
}
Wenn Sie den obigen Code auszuführen versuchen, dies ist der Ausgang sein wird:
Master process is running
Received from worker: {"status":false,"trace":{},"message":"This will take forever to compute"}
Wie wir sehen, ist die Spur leer !
[Ist es nicht möglich, einen Fehler mit JSON.stringify zu stringieren?] (Https://stackoverflow.com/questions/18391212/is-it-not-possible-to-stringify-an-error-using-json -stringify) –
https://stackoverflow.com/questions/32941243/node-js-console-logobject-prints-empty-object –
https://stackoverflow.com/questions/17893718/what-does-enumerable-mean –