node.js:在条件回调中更改其值的对象

时间:2015-08-25 13:39:09

标签: node.js

我有以下代码来保存配置文件,只有在提供旧密码和新密码时才会更新密码。在模型中检查旧密码,因此我在回调中获得了检查值。

以下代码的问题是我必须在回调内和回调后调用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),我调用了两次。 这是最好的解决方案吗?

2 个答案:

答案 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。

您可以在数组中添加任意数量的函数,它们将从头到尾执行。它适用于异步代码,因为在上一个函数完成之前,下一个函数不会执行。

希望这有帮助!如果您需要任何澄清,请务必告诉我们!