Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点承诺-TypeError无法读取属性。则为未定义的_Javascript_Node.js_Mongoose_Promise - Fatal编程技术网

Javascript 节点承诺-TypeError无法读取属性。则为未定义的

Javascript 节点承诺-TypeError无法读取属性。则为未定义的,javascript,node.js,mongoose,promise,Javascript,Node.js,Mongoose,Promise,下面的两段代码引发类型错误: TypeError:无法读取未定义的属性“then” 我觉得我错过了一些基本的东西。值得注意的是,第二段代码中的“result”日志是在抛出错误后完成的。这让我相信我可能在异步方面做错了什么。然而,即使在阅读了建议的问题之后,我也无法理解它 任何帮助都将不胜感激 router.route('/user/:id') .put(auth.authRest, function(req, res) { userManager.updateUser(re

下面的两段代码引发类型错误:

TypeError:无法读取未定义的属性“then”

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

任何帮助都将不胜感激

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);
    });

  };

“updateUser”方法应该返回一个承诺,这样。然后在第一个方法中调用就可以了

尝试下面使用的节点包'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

  };

如果要使用承诺,则需要从this.updateUser返回承诺,返回结果属于传递给exec的回调,而不是分配给this.updateUser的函数

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

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);
  });
};

您不返回此.updateUser的承诺。exec是否返回一个承诺?嗯,当记录结果时,它告诉我它包含一个承诺,为什么?返回结果;属于您传递给exec的回调函数,而不是分配给此函数的函数。updateUser。@BenFortune:问题不在于使用哪种承诺模式。。这是关于导致问题的原因,在这种情况下,理想情况下,返回的承诺丢失了-TypeError:cannotreadproperty'then'of undefined。你的答案是正确的,它解决了问题。但是使用每个Promise library供应商建议/坚持您不应该再使用的模式是您应该避免的。@BenFortune是的,绝对感谢您的提示,我不小心删除了它。
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);
  });
};