2017-07-25 75 views
0

我想在創建記錄和用戶更新其密碼時爲用戶哈希密碼。在創建時,我可以做類似關於創建和更新的哈希密碼

User.beforeCreate((user, options) => { 
    user.password = encryptPassword(user.password) 
}) 

這將很容易執行並散列新用戶的密碼。但更新密碼時遇到問題。如果我只是做

User.beforeUpdate((user, options) => { 
    user.password = encryptPassword(user.password) 
}) 

然後每次用戶更新他們的記錄(即更新名稱,地址等),它觸發鉤和重新散列密碼。

如何知道密碼何時更改以便觸發掛鉤?而不是有這兩個鉤子,我怎麼才能使用beforeSave來實現相同的結果?

UPDATE

按要求我的用戶的定義很簡單,只要

sequelize.define(
    'user', 
    { 
    id: { 
     type:   Sequelize.INTEGER, 
     autoIncrement: true, 
     primaryKey: true, 
    }, 
    emailAddress: { 
     field:  'email_address', 
     type:   Sequelize.STRING, 
     allowNull: false, 
     unique:  true, 
     validate: { 
     isEmail: { 
      args:  true, 
      msg:  "Email is not valid" 
     } 
     }, 
    }, 
    password: { 
     type:   Sequelize.STRING, 
     allowNull: false, 
     validate: { 
     min: { 
      args:  6, 
      msg:  "Password must be more than 6 characters" 
     } 
     } 
    } 
    } 
) 

回答

1

嘿,讓我這個給了一槍

所以第一關就可以運行相同功能兩個鉤子類似如下:

function encryptPasswordIfChanged(user, options) { 
    if (user.changed('password')) { 
    encryptPassword(user.get('password')); 
    } 
} 

User.beforeCreate(encryptPasswordIfChanged); 
User.beforeUpdate(encryptPasswordIfChanged); 

如果您想更改更新中的密碼並創建API端點,則可以致電user.set('password', somePasswordString);。我不確定這是否正是您所需要的,但我認爲這種模式應該可以滿足您的需求。當您創建用戶時,.changed函數應該返回true,因爲密碼的_previousDataValues應該是undefined

祝你好運:)

+0

嘿,看起來沒問題。用'.changed()'我可以知道密碼何時更改。但另一個問題是鉤子不會觸發驗證。所以如果我的驗證說最小密碼是6個字符,我仍然可以傳遞3位密碼。 – spondbob

+0

您是否檢查過https://sequelize.readthedocs.io/en/v3/docs/hooks/?這意味着驗證鉤將在這兩個鉤子之前運行。如果您發佈您正在處理的用戶表的Sequelize定義,我可能會向您提供一些見解。 –

+0

我明白了鉤子順序,它與v4仍然相關,我正在使用http://docs.sequelizejs.com/manual/tutorial/hooks.html#order-of-operations。但我仍然不明白爲什麼當觸發update/create hook時不應用驗證。我添加了我的用戶定義。 – spondbob