Геттеры и сеттеры для виртуальных полей в Sequelize - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь хешировать свое поле пароля перед его сохранением в базе данных. По этой причине я создал виртуальное поле с именем password и фактическое поле с именем hashedPassword. Проблема в том, что когда я пытаюсь зашифровать пароль в beforeCreate ловушке, он user.password не определен. Я перепробовал все. Я также определил пользовательские методы получения и установки для виртуального поля. Я не знаю, что я делаю здесь не так. Любая помощь или руководство будут оценены. Спасибо.

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 голосов
/ 28 октября 2019

используйте хуки:

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

это прекрасно работает для меня

...