2013-11-14 5 views
4

node.js에 express와 통합 된 swagger와 아래 정의 된 리소스를 사용하는 API가 있습니다. swagger의 기본 오류 처리기가 (! req.params.id)에 대한 검사에서 발생하는 swagger 오류를 포착합니다. mongoDB delete 콜백에서 콜백으로 던져진 에러는 잡히지 않아, 아래 에러가 나옵니다. 이 오류는 콜백 함수의 범위/순서와 관련이있는 것처럼 보입니다. node.js를 처음 접하는 누군가는 비동기를 유지하면서 올바르게 수행하는 방법에 대한 조언을 얻기를 바랍니다. 비동기 콜백 내에서 발생node.js : 오류가 발생하여 잡히지 않았습니다.

events.js:74 throw TypeError('Uncaught, unspecified "error" event.'); ^TypeError: Uncaught, unspecified "error" event.

exports.remove = { 
    'spec' : { 
     "collapsed...for...brevity..." : "...", 
     "params" : [ { 
     "paramType" : "path", 
     "name" : "id", 
     "collapsed...for...brevity..." : "...", 
     }], 
     "errorResponses" : [ swe.notFound('id'), swe.invalid('id') ], 
     "nickname" : "remove" 
    }, 
    'action' : function(req, res) { 

     if (!req.params.id) { 
     throw swe.invalid('id'); // THIS ERROR IS CAUGHT 
     } 

     req.coll.remove({_id : req.coll.id(req.params.id)}, function(e, result) { 
     if (e) { 
      throw swe.invalid('collection'); // THIS ERROR IS NOT CAUGHT 
     } 

     res.send({msg : 'success'}); 
     }); 
    } 
    }; 
+0

을 적발하지 무엇을 의미합니까, 그것은 일부 사용자 지정 오류 처리기에 의해 체포하지 않거나 않습니다 콘솔에 오류가 발생하지 않습니까? – adeneo

+0

비동기 처리기에서 throw 된 예외를 쉽게 catch 할 수 없습니다. 예외를 던지게하는 문제를 수정하면 어떨까요? – Pointy

답변

3

규칙 1. 콜백을 던지지 마십시오. 더 던지지 마세요. 프로세스를 중단시키려는 경우에만 throw하십시오. 발신자에게 오류를 전달해야 할 경우 callback(err)을 사용하십시오. 연결/표현 미들웨어 범위에있는 경우 next(err)을 사용할 수도 있습니다.

규칙 2. 여전히 던져지고있는 물건을 잡으려면 domains을 사용하십시오. 이런 식으로 규칙 1을 생각하면 예상치 못한 일들을 잡을 수 있으므로 가능한 한 빨리 프로세스를 종료해야합니다.

+1

JohnnyHK의 답변도 정확하지만 vkurchatkin도 내가 조사 할 도메인을 지적했다. – rogodeter

4

예외가 콜백 아닌, 주변 코드의 호출로 이동 고마워요. 따라서 처리하지 않는 예외를 수신하고 앱을 크래시하는 코드는 req.coll.remove입니다.

대신 action 함수에서 호출자에게 오류를 다시 전달하는 데 사용할 수있는 콜백 매개 변수를 허용해야합니다.

이것은 예외가 node.js 코드에서 거의 사용되지 않고 콜백이 표준 인 이유입니다.

0

대신 콜백을 사용하는, 약속을 사용하고 약속 체인 내에서 excpetion을 던져 ...

var P = require('bluebird'); 

// ... 

return new P(function(resolve, reject) { 
    req.coll.remove({_id : req.coll.id(req.params.id)}, function(e, result) { 
    if (e) { 
     reject(swe.invalid('collection')); // THIS ERROR will be CAUGHT 
    } 
    resolve(res.send({msg : 'success'})); 
    }); 
}) 
.catch(function(err) { 
    throw err; 
}); 
관련 문제