2017-09-07 3 views
0

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 !

+2

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

+0

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

+0

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

Antwort

1

Per API doc, für die process.send() -Methode:

Diese Funktion verwendet JSON.stringify() intern die Nachricht serialisiert

So

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

Was Sie vielleicht tun möchten, ist:

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