Mongoose save()使用本机承诺 - 如何捕获错误

时间:2015-07-14 01:10:20

标签: mongoose promise

我正在尝试使用Mongoose的本机承诺捕获从Mongoose抛出的错误。但我不知道从哪里获取Mongoose的错误对象。

我希望错误在.then()中抛出,如果可能的话会被.catch()抓住。

var contact = new aircraftContactModel(postVars.contact);
contact.save().then(function(){
    var aircraft = new aircraftModel(postVars.aircraft);
    return aircraft.save();
})
.then(function(){
    console.log('aircraft saved')
}).catch(function(){
    // want to handle errors here
});

尝试不使用其他库,因为.save()本身会返回一个promise。

4 个答案:

答案 0 :(得分:26)

MongooseJS使用没有catch()方法的mpromise library。要捕获错误,您可以使用then()的第二个参数。

var contact = new aircraftContactModel(postVars.contact);
contact.save().then(function() {
    var aircraft = new aircraftModel(postVars.aircraft);
    return aircraft.save();
  })
  .then(function() {
    console.log('aircraft saved')
  }, function(err) {
    // want to handle errors here
  });

更新1:从4.1.0开始,MongooseJS现在允许specification of which promise implementation to use

  

Yup require('mongoose').Promise = global.Promise会让猫鼬使用原生承诺。你应该可以使用任何ES6 promise构造函数,但是现在我们只测试native,bluebird和Q

更新2:如果您在最新版本的4.x中使用mpromise,您将收到此删除警告:

DeprecationWarning: Mongoose: mpromise (mongoose's default promise library) is deprecated

答案 1 :(得分:3)

您可以使用bluebird

在mongoose上扩展承诺功能
Promise = require('bluebird');
mongoose.Promise = Promise;

答案 2 :(得分:1)

您可能正在返回方法保存创建的承诺,以便在其他地方处理它。 如果是这种情况,您可能希望将错误抛给父承诺,以便捕获错误。你可以用这个来实现它:

function saveSchema(doc) {
  return doc.save().then(null, function (err) { 
    throw new Error(err); //Here you are throwing the error to the parent promise
  });
}
function AParentPromise() {
  return new Promise(function (accept, reject) {
    var doc = new MongoSchema({name: 'Jhon'});
    saveSchema(doc).then(function () { // this promise might throw if there is an error
      // by being here the doc is already saved
    });
  }).catch(function(err) {
    console.log(err); // now you can catch an error from saveSchema method
  });
}

我不确定这可能是反模式,但这可以帮助您在一个地方处理错误。

答案 3 :(得分:0)

Bluebird is actually not required to use promises with Mongoose, you can simply use Node's native promises, just like this:

mongoose.Promise = Promise