2013-04-26 94 views
0

我正在开发一个Node.js + Express。我的数据库是Mongo,我使用Mongoose连接到这个数据库。在猫鼬回调上抛出异常

我想抛出一个异常的猫鼬查询回调是这样的:

game.save(function (err) { 
    if (err) { 
    throw new app.exception.EntitySaveFailed(); 
    }   
}); 

,但是当我这样做,节点服务器崩溃,并显示该堆栈跟踪:

[object Object] 
    at Promise.<anonymous> (/home/server/routes/api/game.js:219:17) 
    at Promise.<anonymous> (/home/server/node_modules/mongoose/node_modules/mpromise/lib/promise.js:162:8) 
    at Promise.EventEmitter.emit (events.js:95:17) 
    at Promise.emit (/home/server/node_modules/mongoose/node_modules/mpromise/lib/promise.js:79:38) 
    at Promise.fulfill (/home/server/node_modules/mongoose/node_modules/mpromise/lib/promise.js:92:20) 
    at Promise.resolve (/home/server/node_modules/mongoose/lib/promise.js:108:15) 
    at Promise.<anonymous> (/home/server/node_modules/mongoose/node_modules/mpromise/lib/promise.js:162:8) 
    at Promise.EventEmitter.emit (events.js:95:17) 
    at Promise.emit (/home/server/node_modules/mongoose/node_modules/mpromise/lib/promise.js:79:38) 
    at Promise.fulfill (/home/server/node_modules/mongoose/node_modules/mpromise/lib/promise.js:92:20) 
Forever detected script exited with code: 8 
Forever restarting script for 9389 time 
Listening on port 3000... 

当我在mongoose回调函数外抛出一个异常,所有工作正常。

回答

1

当您在node.js回调中引发异常时,它将转到实际调用回调的代码,而不是代码的词法范围。在这种情况下,这意味着Promise库会收到异常并使程序崩溃。这就是为什么通常通过第一个回调参数而不是异常来报告错误的原因。

+0

我试图用例外的,而不是通过寻找参数传递信息为可爱/可读性代码。谢谢! – 2013-04-28 18:53:21

1

您可以添加“下一步”函数的参数,可以这样当你需要抛出一个异常,你可以做这样的事情:

function saveGame(req, res, next) { 
    game.save(function (err) { 
    if (err) { 
     return next(new app.exception.EntitySaveFailed()); 
    }   
    }); 
}