0

我正在开发一个 Node.js + Express。我的数据库是 Mongo,我正在使用 Mongoose 连接到这个数据库。

我试图以这种方式在 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...

当我在猫鼬回调函数之外抛出异常时,一切正常。

4

2 回答 2

2

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

于 2013-04-26T12:52:44.543 回答
1

您可以将“next”添加到函数的参数中,因此当您需要抛出异常时,您可以执行以下操作:

function saveGame(req, res, next) {
  game.save(function (err) {
    if (err) {
      return next(new app.exception.EntitySaveFailed());
    }          
  });
}
于 2013-05-01T13:18:01.473 回答