Node Promise - TypeError无法读取属性。然后是undefined

时间:2017-02-28 09:47:17

标签: javascript node.js mongoose promise

下面的两段代码会抛出一个类型错误:

TypeError:无法读取属性'然后'未定义的。

我觉得我错过了一些基本的东西。值得注意的是,'结果的日志'第二段代码是在抛出错误后完成的。这让我相信我可能在做涉及异步的错误。然而,即使在阅读了建议的问题之后,我也无法理解它。

非常感谢任何帮助!

router.route('/user/:id')

    .put(auth.authRest, function(req, res) {
      userManager.updateUser(req.params.id, req.body)
        .then(function(response) { // line where error is thrown
          res.send({data:response});
        });
    });

来自userManager:

this.updateUser = function(id, data) {
    User.findOne({ _id: id }).exec(function(err, user){
      if(err) {
        console.log(err);
      } else {
        for(let prop in data) {
          user[prop] = data[prop];
        }

        var result = user.save().catch(function(err){
          console.log(err);
        });

        console.log(result); // this log is done below the error, it does contain a promise
        return result;
      } 
    }).catch(function(err){
      console.log(err);
    });

  };

2 个答案:

答案 0 :(得分:2)

如果你想使用Promises,你需要从this.updateUser返回一个Promise,return result属于你传递给exec的回调,而不属于你赋给this.updateUser的函数。 1}}。

this.updateUser = function(id, data) {
  return User.findOne({
    _id: id
  }).exec().then(function(user) {
    for (let prop in data) {
      user[prop] = data[prop];
    }

    var result = user.save().catch(function(err) {
      console.log(err);
    });

    console.log(result); // this log is done below the error, it does contain a promise
    return result;
  }).catch(function(err) {
    console.log(err);
  });

};

根据您希望如何进行错误处理,您可以将其缩小为:

this.updateUser = function(id, data) {
  return User.findOne({
    _id: id
  }).exec().then(function(user) {
    for (let prop in data) {
      user[prop] = data[prop];
    }

    return user.save();
  }).catch(function(err) {
    console.log(err);
  });
};

答案 1 :(得分:-1)

'updateUser'方法应该返回一个promise,这样。然后调用第一个方法就行了。

尝试类似下面的内容(使用节点包'q')

this.updateUser = function(id, data) {
    var deferred = Q.defer()
    User.findOne({ _id: id }).exec(function(err, user){
      if(err) {
        console.log(err);
        deferred.reject(err)
      } else {
        for(let prop in data) {
          user[prop] = data[prop];
        }

        var result = user.save().catch(function(err){
          console.log(err);
        });

        console.log(result); // this log is done below the error, it does contain a promise
        deferred.resolve(resolve)
        //return result;
      } 
    }).catch(function(err){
        deferred.reject(err)
      console.log(err);
    });

    return deferred.promise

  };