Sequelize中虚拟字段的获取器和设置器

时间:2019-10-28 09:47:15

标签: javascript node.js sequelize.js getter-setter

在将密码字段存储在数据库中之前,我试图对其进行哈希处理。因此,我创建了一个名为password的虚拟字段和一个名为hashedPassword的实际字段。问题在于,当我尝试对beforeCreate挂钩中的密码进行加密时,user.password是未定义的。我已经尝试了一切。我还为虚拟字段定义了自定义getter和setter。我不知道我在做什么错。任何帮助或指导,将不胜感激。谢谢。

import bcrypt from 'bcrypt';

module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define(
    'User',
    {
        passwordhash: {
          type: DataTypes.STRING,
          allowNull: false,
          validate: {
            notEmpty: true
          }
        },
        password: {
          allowNull: false,
          type: DataTypes.VIRTUAL,
          set(password) {
            const valid = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[#$^+=!*()@%&]).{8,30}$/.test(
              password
            );
            if (!valid) {
              throw new Error(`Password not valid ${password}`);
            }
            this.setDataValue('password', password);
          },
          get() {
            return this.getDataValue('password');
          }
        }
      }
    },
    {
      hooks: {
        beforeCreate: function hashPassword(user) {
          console.log('user is:', user);
          return bcrypt
            .hash('Abcdefgh1@', 12)
            .then(hashed => {
              user.passwordhash = hashed;
            })
            .catch(error => error);
        }
      }
    }
  );
  User.associate = function(models) {
    // associations can be defined here
  };
  return User;
};


1 个答案:

答案 0 :(得分:0)

使用挂钩:

hooks: {
      beforeCreate: async (user, options) => {
        let salt = await bcrypt.genSalt(10)
        let hash = await bcrypt.hash(user.password, salt)
        user.password = hash;
      }
    }

并使用以下命令更新密码字段:

User.beforeBulkUpdate(async instance => {
    if (instance.attributes.password) {
      let salt = await bcrypt.genSalt(10)
      let hash = await bcrypt.hash(instance.attributes.password, salt)
      instance.attributes.password = hash;
    }
  })

这对我来说很好