0
Sequelizeで作成したモデルでbeforeCreate操作を実行しようとしています。ユーザーを作成する前にパスワードと塩を保存しようとしています。ただし、ユーザーは暗号化されたパスワードまたは塩なしで作成されます。私はNode.JSに慣れていませんが、これは非同期の性質と関係していると仮定しています。私の作成関数が意図したとおりに動作するように、コールバックを適切に導入する方法Sequelize:Create Hookが意図したとおりに動作しない前に
モデル:
'use strict';
var Promise = require("bluebird");
var bcrypt =Promise.promisifyAll(require("bcrypt-nodejs"));
const SALT_ROUNDS = 10;
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define('User', {
username: { type: DataTypes.STRING, unique: true, allowNull: false, validate: { notEmpty: true } },
email: { type: DataTypes.STRING, unique: true, allowNull: false, isEmail: true },
phone_number: DataTypes.STRING,
password_hash: { type: DataTypes.STRING, allowNull: false, unique: true, validate: { notEmpty: true } },
password_salt: DataTypes.STRING,
first_name: DataTypes.STRING,
last_name: DataTypes.STRING,
user_type: DataTypes.INTEGER,
two_factor_enabled: { type: DataTypes.BOOLEAN, defaultValue: false, },
email_verified: DataTypes.DATE,
active: { type: DataTypes.BOOLEAN, defaultValue: true, },
}, {
classMethods: {
associate: function(models) {
// associations can be defined here
},
validPassword: function(password, passwd, callback) {
bcrypt.compare(password, passwd, function(err, isMatch) {
if (isMatch) {
return callback(null, true);
} else {
return callback(null, false);
}
});
},
},
hooks: {
\t beforeCreate: function(user, {}) {
\t \t bcrypt.genSalt(SALT_ROUNDS, function(err, salt) {
\t \t \t bcrypt.hash(user.password_hash, salt, function(){}, function(err, hash) {
\t \t \t \t if (err) {
\t \t \t \t \t return sequelize.Promise.reject(err);
\t \t \t \t }
\t \t \t user.setDataValue('password_hash',hash);
\t \t \t \t user.setDataValue('password_salt',salt);
\t \t \t });
\t \t });
\t }
},
instanceMethods: {
\t generateHash: function(password) {
\t \t return bcrypt.hashSync(password, bcrypt.genSaltSync(10), null);
\t },
\t validPassword: function(password) {
\t \t return bcrypt.compareSync(password, this.password);
\t }
}
});
//User.associate = (models) => {
// User.hasMany(models.UserType, {
// foreignKey: 'userId',
// as: 'userTypes'
// });
//};
return User;
};
そして、ここで呼び出します:
return db.User
\t \t \t .create({
\t \t \t \t first_name: req.body.first_name,
\t \t \t \t last_name: req.body.last_name,
\t \t \t \t username: req.body.username,
\t \t \t \t email: req.body.email,
\t \t \t \t password_hash: req.body.password \t
\t \t \t })
\t \t \t .then(user => res.status(201).send(user))
\t \t \t .catch(error => res.status(400).send(error));
\t \t },