2015-08-25 37 views
2

我有以下代碼來保存配置文件,只有在提供舊密碼和新密碼時才更新密碼。舊密碼在模型內被檢查,所以我得到回調中的檢查值。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(用戶,RES),我稱之爲兩次。 這是最好的解決方案嗎?

+0

首先,你確定你沒有忘記一些括號嗎?另外,我不明白你爲什麼要做user.save? – tomsoft

回答

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

另一種選擇是使用諾(用品質庫)

Q().then(checkPasswordChange).then(saveUser); 

但我不是專家承諾,沒有時間寫出確切的代碼...

+0

Thx tomsoft,是的,這就是我所做的,這是最好的解決方案嗎? – hichn

+0

你可以使用承諾,看我的言論 – tomsoft

0

我想我理解的問題(如果我不自由地糾正我):

您需要調用user.save,然後發送響應(res.send),然後再發送user.save(?)。

如果這是你想要的,我會看看async。它可以讓你在運行異步系列碼(async.series)

async.series([ 
    function(){ ... }, 
    function(){ ... }, 
    function(){ ... } 
]); 

當第一個功能可以user.save,然後第二個功能可發送響應和第三功能可能會再次向user.save。

您可以添加任意數量的函數到數組中,它們將從頭到尾執行。它適用於異步代碼,因爲直到前一個函數完成後纔會執行下一個函數。

希望這會有所幫助!如果您需要澄清,一定要讓我知道!

相關問題