2017-09-07 1 views
0

이것은 매우 흥미 롭습니다! 무슨 일이야?작업자가 빈 오류 객체를받습니다.

  • 마스터 과정은
  • 마스터 포크에게 (또한 노동자라는) 새로운 프로세스는 근로자가 온라인 상태 일 때 알고 오도록
  • 마스터는 또한, 자체에 리스너를 활성화를 시작한다. (근로자가 온라인 상태가되면 주인은 인사 메시지를 보냅니다.)
  • 근로자가 시작되었습니다.
  • 근로자는 청취자를 등록합니다. 따라서 메시지가 주인에 의해 작업자에게 전송되면 메시지가 그 작업자에게 전송됩니다.
  • 작업자가 인사말을 받으면 즉시 루틴을 호출하지만 오류가 발생합니다. 작업자는 방금 호출 한 루틴에 의해보고 된 전체 오류 개체를보고하려고합니다.
  • 작업자는 개체에 오류 개체를 래핑하고 새로운 키를 추가하고 send을 사용하여 마스터에 다시보고합니다.
  • Master는 작업자의 말을 듣고 메시지를 수신하지만 작업자가 보낸 오류 개체를 찾지 못합니다!

이것은 이야기의 끝이었습니다.

문제는 마지막 지점에서 설명합니다. 마스터가 오류 오브젝트를 수신하지 않았습니다. 그 이유는 무엇일까요? 작업자는 오류 개체를 마스터로 보내기 전에 그대로 유지합니다. 위의 코드를 실행하려고하면이 출력 될 것입니다

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); 
    } 
} 

: 여기

위의 설명은 코드 우리가 보듯이

Master process is running 
Received from worker: {"status":false,"trace":{},"message":"This will take forever to compute"} 

, 추적이 비어 ! process.send() 메소드 API doc으로 당

+2

[JSON.stringify를 사용하여 오류를 문자열화할 수 있습니까?] (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 –

답변

1

:

이 함수 JSON.stringify을 (사용)이 내부적으로 메시지

정도, 직렬화

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

할 수있는 일 :

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