2017-07-25 5 views
0

レコードの作成時およびユーザーのパスワードの更新時にユーザーのパスワードをハッシュしようとしています。作成時には、作成時および更新時のハッシュパスワード

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

のようにすることができます。これは、簡単に実行され、新しいユーザーのパスワードをハッシュします。しかし、私はパスワードを更新する際に問題があります。私がしたばかりの場合、ユーザーはレコード(更新名、住所など)を更新するたびに、フックをトリガーしてパスワードを再ハッシュします。

フックをトリガーできるようにパスワードが変更されたときをどうすればわかりますか?また、それらの2つのフックを持つ代わりに、私はちょうど同じ結果を達成するために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);に電話するだけです。私はそれがあなたが必要とするものであるかどうかは確かではありませんが、私はこのパターンがあなたが必要とするものを行うべきだと思います。パスワードの_previousDataValuesundefinedである必要があるため、ユーザーを作成するときに.changed関数はtrueを返す必要があります。

幸運にも:)

+0

ちょっといいですね。 '.changed()'では、パスワードがいつ変更されたかを知ることができます。しかし、別の問題は、フックがバリデーションを引き起こさないということです。だから私の妥当性検査が最小パスワードが6文字であると言えば、私はまだ3桁のパスワードを渡すことができます。 – spondbob

+0

https://sequelize.readthedocs.io/en/v3/docs/hooks/を確認しましたか?これは、検証フックがこれら2つのフックの前に実行されることを意味します。私が作業しているユーザーテーブルのSequelize定義を投稿すると、いくつかの洞察を得ることができます。 –

+0

私はフックの順序について理解していますが、まだv4と関連があります。http://docs.sequelizejs.com/manual/tutorial/hooks.html#order-of-operationsを使用しています。しかし、私はまだ更新/作成フックがトリガされたときに検証が適用されない理由を理解していません。私は自分のユーザー定義を追加しました。 – spondbob

関連する問題