【问题标题】:Throwing exception on mongoose callback在猫鼬回调上抛出异常
【发布时间】:2013-05-01 21:18:01
【问题描述】:

我正在开发 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...

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

【问题讨论】:

    标签: javascript node.js express mongoose


    【解决方案1】:

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

    【讨论】:

    • 我尝试使用异常而不是通过参数传递信息来寻找可爱/可读性代码。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-02-12
      • 2016-04-03
      • 1970-01-01
      • 2020-06-10
      • 2015-08-31
      • 2012-11-22
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      相关资源
      最近更新 更多