首页 > 解决方案 > 如何在 Sequelize Model 中创建方法?

问题描述

我写了一个扩展模型的类,我需要创建一个方法来比较同步密码:

const { Model, DataTypes } = require('sequelize');


class User extends Model {
  static init(sequelize) {
    super.init({
      username: DataTypes.STRING,
      password: DataTypes.STRING,
      role: DataTypes.STRING,
      status: DataTypes.INTEGER
    },
      {
        sequelize,
        hooks: {
          beforeCreate: (user) => {
            const salt = bcrypt.genSaltSync();
            user.password = bcrypt.hashSync(user.password, salt);
          }
        }   
      }
    )
  }

  static associate(model) {
    this.belongsToMany(models.Movie, { through: models.Ratings });
  }

}
module.exports = User;

钩子正在工作,我想在 beforeCreate 之后添加:

 instanceMethods: {
      validPassword: function (password) {
        return bcrypt.compareSync(password, this.password);
      }
    }

使用此类我如何定义用户方法?

标签: javascriptnode.jssequelize.js

解决方案


我懂了:

const { Model, DataTypes } = require('sequelize');
const bcrypt = require("bcrypt")

class User extends Model {
  static init(sequelize) {
    super.init({
      username: DataTypes.STRING,
      password: DataTypes.STRING,
      role: DataTypes.STRING,
      status: DataTypes.INTEGER
    },
      {
        sequelize,
        hooks: {
          beforeCreate: (user) => {
            const salt = bcrypt.genSaltSync();
            user.password = bcrypt.hashSync(user.password, salt);
          }
        }
      }
    )
  }

  static associate(model) {
    this.belongsToMany(models.Movie, { through: models.Ratings });
  }

  validPassword(password) {
    return bcrypt.compareSync(password, this.password);
  }
}
module.exports = User;

如果我想使用控制器内部的方法,例如:

const login = async (req, res) => {
    const { username, password } = req.params;
    const user = await User.findOne({
        where: { username }
    });

    if (!user) {
        return res.status(400).send("User not find!")
    }

    if(!user.validPassword(password)){..}
    res.send(user)

}

推荐阅读