Sequelize实例方法不起作用

Aar*_*lal 9 node.js sequelize.js

我正在尝试使用Sequelize的实例方法来验证登录尝试时的密码.我已将User模型定义为:

var User = sequelize.define('User',{
    id:{
          type:DataTypes.BIGINT,
          autoIncrement: true,
          allowNull: false,
          primaryKey:true
        },
    username:{
          type:DataTypes.STRING,
          unique:true
        },
    password:{
          type: DataTypes.STRING
        },
    ...
  },
  {
    classMethods:{
        associate:function(models){
        ...
        }
      }
  },
  {
    instanceMethods:{
        validatePassword:function(password){
          return bcrypt.compareSync(password, this.password);
        }
      }
  }
);
  return User;
}
Run Code Online (Sandbox Code Playgroud)

在我的登录路线中,我执行以下操作:

  • 1)从请求正文中检索用户名和密码
  • 2)检查数据库中是否存在用户名
  • 3)如果用户存在,则使用validatePassword方法获取用户对象并将发送的密码与数据库中的散列密码进行比较.

这是相关的代码

var username = req.body.username || "";
var password = req.body.password || "";
models.User.findOne({ where: {username: username} }).
then(
    function(user) {
     if(user){
      console.log(user.validatePassword(password));
     }
 ....
Run Code Online (Sandbox Code Playgroud)

每次我尝试登录时都会出现以下错误

[TypeError: user.validatePassword is not a function]
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

小智 13

对于遇到类似问题的任何人,我都遇到了同样的问题,但使用的是 Sequelize 5.21.5。根据这篇文章Sequelize Instance Methods,从 Sequelize 4.0 及更高版本开始,您必须使用原型方法来定义实例方法,如下所示:

    // Adding an instance level methods.
    User.prototype.validPassword = function(password) {
      return bcrypt.compareSync(password, this.password);
};
Run Code Online (Sandbox Code Playgroud)

  • 当我在实例上使用该函数时,我无法访问它。你知道为什么会发生这种情况吗? (2认同)

Sib*_*lil 9

我们可以将 instanceLevelMethods 添加到原型中,

User.prototype.your-instance-level-method-name = function() {
    return 'foo';
};
Run Code Online (Sandbox Code Playgroud)

我是这样做的:

// Adding an instance level methods.
User.prototype.validPassword = function(password) {
    return bcrypt.compareSync(password, this.password);
};
Run Code Online (Sandbox Code Playgroud)


use*_*032 8

我认为你正在使用sequelize模型定义api错误. http://docs.sequelizejs.com/en/latest/docs/models-definition/#expansion-of-models

这是正确的方法:

var User = sequelize.define('User',{}, {
  classMethods: {
    method1: ...
  },
  instanceMethods: {
    method2: ...
  }
});
Run Code Online (Sandbox Code Playgroud)

不是这样的:

var User = sequelize.define('User',{}, {
  classMethods: {
    method1: ...
  }
},{
  instanceMethods: {
    method2: ...
  }
});
Run Code Online (Sandbox Code Playgroud)