我正在尝试使用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。
答案 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
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