Javascript 节点承诺-TypeError无法读取属性。则为未定义的
下面的两段代码引发类型错误: TypeError:无法读取未定义的属性“then” 我觉得我错过了一些基本的东西。值得注意的是,第二段代码中的“result”日志是在抛出错误后完成的。这让我相信我可能在异步方面做错了什么。然而,即使在阅读了建议的问题之后,我也无法理解它 任何帮助都将不胜感激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
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);
});
};