我有以下代码来保存配置文件,只有在提供旧密码和新密码时才会更新密码。在模型中检查旧密码,因此我在回调中获得了检查值。
以下代码的问题是我必须在回调内和回调后调用user.save。 什么是重构这个的最好方法,thx
user.firstName = req.body.firstName;
user.lastName = req.body.lastName;
if (req.body.password)
if (req.body.newPassword)
//we want to change password
user.comparePassword(req.body.password, function(err, isMatch) {
if (!isMatch) {
return res.status(401).send({
message: 'Mot de passe actuel invalide'
});
}
user.password = req.body.newPassword;
user.save(function(err) {
if (err)
res.status(500).send({
message: "Une erreur est survenue lors de la mise à jour du profil"
});
var profile = {
displayName: getDisplayName(user),
pictureUrl: user.pictureUrl || config.defaultProfilePic,
};
profile.lastName = user.lastName;
profile.firstName = user.firstName;
res.send(profile);
});
});
user.save(function(err) {
if (err)
res.status(500).send({
message: "Une erreur est survenue lors de la mise à jour du profil"
});
var profile = {
displayName: getDisplayName(user),
pictureUrl: user.pictureUrl || config.defaultProfilePic,
};
profile.lastName = user.lastName;
profile.firstName = user.firstName;
res.send(profile);
});
编辑:我创建了一个函数saveUser(user,res),我调用了两次。 这是最好的解决方案吗?
答案 0 :(得分:3)
为什么不创建" saveUser"在检查密码后或在其他情况下调用的函数:
function saveUser(user,res){
user.save(function(err) {
if (err)
res.status(500).send({
message: "Une erreur est survenue lors de la mise à jour du profil"
});
var profile = {
displayName: getDisplayName(user),
pictureUrl: user.pictureUrl || config.defaultProfilePic,
};
profile.lastName = user.lastName;
profile.firstName = user.firstName;
res.send(profile);
});
}
user.firstName = req.body.firstName;
user.lastName = req.body.lastName;
if (req.body.password) && (req.body.newPassword) {
//we want to change password
user.comparePassword(req.body.password, function(err, isMatch) {
if (!isMatch) {
return res.status(401).send({
message: 'Mot de passe actuel invalide'
});
}
user.password = req.body.newPassword;
saveUser(user,res);
});
} else {
saveUser(user,res);
}
另一个选择是使用promise(使用Q库)
Q().then(checkPasswordChange).then(saveUser);
但我不是承诺的专家,没有时间编写确切的代码......
答案 1 :(得分:0)
我想我理解这个问题(如果我不能随意纠正我):
您需要调用user.save,然后再发送响应(res.send)然后再发送user.save(?)。
如果这是你想要的,我会看看async。它将允许您串行运行异步代码(async.series)
即
async.series([
function(){ ... },
function(){ ... },
function(){ ... }
]);
第一个函数可以是user.save,然后第二个函数可以发送响应,第三个函数可以是user.save。
您可以在数组中添加任意数量的函数,它们将从头到尾执行。它适用于异步代码,因为在上一个函数完成之前,下一个函数不会执行。
希望这有帮助!如果您需要任何澄清,请务必告诉我们!