2013-11-14 52 views
4

我有一個API使用swagger集成在node.js上的express和一個如下定義的資源。 Swagger的默認錯誤處理程序捕獲到(!req.params.id)檢查中引發的錯誤。從mongoDB刪除調用回調中引發的錯誤不會被捕獲,給我下面的錯誤。該錯誤看起來像它與回調函數的作用域/順序有關,並且作爲node.js的新成員,我希望得到如何正確執行此操作的建議,以保持異步性。 -Thanksnode.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

異步處理程序拋出的異常不容易被捕獲。如何解決導致它拋出異常的問題? – Pointy

回答

3

規則1.不要投入回叫。最好別拋棄。僅當您希望進程崩潰時才投擲。如果您需要將錯誤傳遞給呼叫者,請使用callback(err)。如果您在連接/快遞中間件範圍內,則還可以使用next(err)

規則2.如果還有東西被拋出並且您想要抓到它,請使用domains。考慮到這樣的規則1,你只能捕獲超意外的事情,所以你必須儘快取消這個過程。

+1

JohnnyHK的回答也是正確的,但vkurchatkin也指出了我將研究的域名。 – rogodeter

4

例外異步回調中拋出去的回調,而不是你周圍的代碼的調用者。所以這是req.coll.remove代碼接收異常(這是不處理它),並崩潰你的應用程序。

取而代之,您需要讓您的刪除action函數接受一個回調參數,它可以用來將錯誤傳回給調用者。

這就是爲什麼在node.js代碼中很少使用異常並且回調是標準的原因。

0

而不是使用一個回調,用一個承諾,承諾鏈中拋出錯誤時拋出......

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; 
}); 
相關問題