2014-09-16 2 views
0

다음 코드는 도메인을 실행하고 http 요청을 만듭니다. 요청은 알 수없는 호스트에 연결하려고 시도합니다. 알 수없는 호스트는 요청의 오류 이벤트를 내 보냅니다. 요청 오류 처리기는 오류를 던져 도메인 오류 처리기로 전달합니다. 나의 이해에서Node.js 도메인에서 여러 오류 이벤트 호출

는 요청 오류 이벤트가 ECONNREFUSED와 한 번을 방출되어야하지만 대신은 두 번을 방출 것 : 첫째 ECONNREFUSED와 다음 ECONNRESET와.

그러나 도메인을 사용하지 않으면 코드가 예상대로 작동합니다 (단 하나의 오류). 도메인을 사용할 때도 오류는 발생하지 않습니다. 또한 http 요청 대신 일반 EventEmitter 객체를 사용할 때도 작동합니다.

아무도 나 에게이 동작을 설명하고 도메인 내에서 오류 처리를 해결하는 방법을 말해 줄래?

// The problem only occurs inside a domain 
var dom = require("domain").create(); 
dom.addListener("error", onDomError); 
dom.run(run); 

// // If we don't use a domain everything works 
// run(); 

function run() { 
    console.log("run"); 

    // The following code should throw _one_ error, but throws two instead 
    var req = require("http").request({ 
     'hostname': "localhost", 
     'port': 1337, 
     'method': "GET", 
     'path': "/error" 
    }); 
    req.addListener('error', onError); 

    // // This code works as excpected 
    // var EventEmitter = require('events').EventEmitter; 
    // var emitter = new EventEmitter(); 
    // emitter.addListener("error", onError); 
    // emitter.emit("error", "some error"); 

    // Throwing the error seems to cause the error 
    function onError(error) { 
     console.log("onError"); 
     throw error; 
    } 

    // If we don't throw the error everthing works 
    // function onError(error) { 
    // console.log("onError"); 
    // console.log(error) 
    // } 
} 

function onDomError(error) { 
    console.log("onDomError"); 
    console.log(error); 
} 
+0

나는 또한 GitHub의 Node.js 저장소에 문제를 만들었습니다. https://github.com/joyent/node/issues/8378 – Torben

답변

0

두 가지 질문에서 언급 한 문제를 일으키는 : 개체가 이미 도메인에 의해 관리되는 경우 onError 처리기를 추가 할 필요가 없습니다

  1. .
  2. Node.js는 도메인 스택에 활성 도메인의 참조를 추가 할 수 있습니다.

이것은 간단한 코딩 오류입니다. Node.js 도메인은 도메인 내에서 생성 된 객체의 모든 오류 이벤트를 암시 적으로 처리합니다. onDomError을 호출하는 또 다른 오류 이벤트 처리기를 추가하면 onDomError이 두 번 호출됩니다. 도메인에서 직접 한 번, 추가 이벤트 처리기에서 한 번.

2. 이것은 Node.js의 버그 일 수 있습니다. http.createRequest()을 통해 요청을 만들면 활성 도메인에 대한 하나 또는 두 개의 추가 참조가 도메인 스택에 추가됩니다. 이로 인해 onDomError이 여러 번 호출됩니다. 먼저 스택의 최상위 도메인에서 발생한 오류가 스택의 다음 도메인으로 전달되어 onDomError을 다시 호출하는 등 ... 설명하기가 어렵습니다.) 자세한 내용은 GitHub의 Node issue #8429Node issue #8429을 참조하십시오. 세부.