다음 코드는 도메인을 실행하고 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);
}
나는 또한 GitHub의 Node.js 저장소에 문제를 만들었습니다. https://github.com/joyent/node/issues/8378 – Torben