Ceci est très intéressant! Que ce passe-t-il?Maître reçoit un objet d'erreur vide du travailleur
- processus Master est démarré
- fourches Master un nouveau processus (aussi appelé un travailleur)
- maître active également un auditeur sur lui-même, de sorte qu'il est de savoir quand un travailleur est en ligne. (Dès qu'un travailleur est en ligne, le maître lui envoie un message d'accueil)
- La personne est démarrée
- Une travailleuse enregistre une personne sur elle-même. Ainsi, lorsqu'un message est envoyé par le maître au travailleur, il est reçu par elle.
- Dès que le message d'accueil est reçu par le travailleur, il appelle une routine mais rencontre une erreur. L'utilisateur souhaite signaler l'objet d'erreur complet signalé par la routine qu'elle vient d'appeler.
- L'opérateur enveloppe l'objet d'erreur dans un objet et ajoute également de nouvelles clés et utilise
send
pour renvoyer au maître. - Maître écoute le travailleur et reçoit le message mais ne trouve pas l'objet d'erreur envoyé par le travailleur!
C'était la fin de l'histoire.
Le problème est décrit dans le dernier point. L'objet erreur n'est pas reçu par le maître. Quelle pourrait être la raison? Le travailleur a l'objet d'erreur intact juste avant de l'envoyer au maître.
Voici le code de la description ci-dessus:
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);
}
}
Si vous essayez d'exécuter le code ci-dessus, ce sera la sortie:
Master process is running
Received from worker: {"status":false,"trace":{},"message":"This will take forever to compute"}
Comme on le voit, la trace est vide !
[N'est-il pas possible de stringifier une erreur en utilisant JSON.stringify?] (Https://stackoverflow.com/questions/18391212/is-it-not-possible-to-stringify-an-error-using-json -stringifier) –
https://stackoverflow.com/questions/32941243/node-js-console-logobject-prints-empty-object –
https://stackoverflow.com/questions/17893718/what-does-enumerable-mean –