下面的两段代码会抛出一个类型错误:
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);
});
};
答案 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
};