我很困惑如何根据following documentation使用findOne()来使用mongoose.update()。exec()应该返回一个promise,但返回的内容没有fail成员:
var ret = mongoose.models[collection].findOne({_id:id})
.update({status:status})
.exec();
console.log('having fail:',ret.fail);//undefined
console.log('having catch:',ret.catch);//undefined
console.log('having then:',ret.then);//this is defined
这可能是因为他们的承诺没有实现失败或捕获,我必须尝试在最后设置拒绝功能。然后看看是否会被调用:
promise.then(returningPromise)
.then(returningPromise)
.then(returningPromise)
.then(null,handleFail)
然后我尝试以下方法:
var ret = mongoose.models[collection].findOne({_id:id})
// .update({status:status})
.exec(function(er,dt){
//callback: null { _id: 000000000000000000000001,...
console.log('callback:',er,dt);
});
很高兴看到我得到了一些东西,但取消了对更新的注释,我得到以下内容:
var ret = mongoose.models[collection].findOne({_id:id})
.update({status:status})
.exec(function(er,dt){
//callback: null null
console.log('callback:',er,dt);
});
记录也未更新。我知道如果没有找到记录,但没有更新,它确实找到了记录。
所以我的主要问题是如何使用findOne和update(而不是findOneAndUpdate)更新此记录,第二个问题是如果第一个承诺拒绝,将调用最后一个.then的拒绝。如果没有,那么最后如何捕获,因为猫鼬承诺不支持失败或捕获。
答案 0 :(得分:0)
注意到我必须提供更新标准,以下内容似乎对我有用:
return Q().then(function(){
var d = Q.defer();
mongoose.models[col].findOne({_id:id})
.update({_id:id},{status:status})
.exec(function(e,dt){
if(e){
d.reject(e);return;
}
d.resolve(dt);
});
return d.promise;
});
添加了Q依赖项,因此我可以返回一个不需要我更改调用代码的承诺。