mongoose findOne,update和exec

时间:2015-02-05 08:00:38

标签: javascript node.js mongodb mongoose

我很困惑如何根据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的拒绝。如果没有,那么最后如何捕获,因为猫鼬承诺不支持失败或捕获。

1 个答案:

答案 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依赖项,因此我可以返回一个不需要我更改调用代码的承诺。