2017-09-07 5 views
0

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 !

+2

[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) ​​ –

+0

https://stackoverflow.com/questions/32941243/node-js-console-logobject-prints-empty-object –

+0

https://stackoverflow.com/questions/17893718/what-does-enumerable-mean –

Répondre

1

Comme par API doc, pour la méthode de process.send():

Cette fonction utilise JSON.stringify() en interne pour sérialisation du message

Ainsi,

const err = new Error('Message'); 
console.log(JSON.stringify(err)); // => {} 

Ce que vous voulez peut-être faire est:

process.send({ 
    status: false, 
    trace: err.stack, 
    message: err.message 
});