繁体   English   中英

在Sequelize中使用实例方法

[英]Using Instance Methods in Sequelize

有人可以帮我理解如何在Sequelize中使用实例方法吗? 我已经查看了文档,但发现它很稀疏。 目前,我正在尝试在我的用户模型上使用setPassword和verifyPassword实例方法。 当我尝试在REPL中调用代码时,在导入用户模型并同步数据库之后,我得到以下内容:

> models.User.setPassword('test');
TypeError: Object [object Object] has no method 'setPassword'

以下是用户模型的代码:

var bcrypt = require('bcrypt');

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('User', {
    email: { type: DataTypes.STRING, unique: true, allowNull: false, validate: { isEmail: true } },
    password: { type: DataTypes.STRING, allowNull: false},
    firstName: {type: DataTypes.STRING},
    lastName: {type: DataTypes.STRING},
    companyName: {type: DataTypes.STRING},
    admin: {type: DataTypes.BOOLEAN, allowNull: false, defaultValue: false,},
    forgotUrl: {type: DataTypes.STRING, unique: true},
    forgotDate: {type: DataTypes.STRING},
    lastLogin: {
      type: DataTypes.DATE,
      defaultValue: DataTypes.NOW
    }
  }, {
    paranoid: true,
    instanceMethods: {
      setPassword: function(password, done) {
        return bcrypt.genSalt(10, function(err, salt) {
          return bcrypt.hash(password, salt, function(error, encrypted) {
            this.password = encrypted;
            this.salt = salt;
            return done();
          });
        });
      },
      verifyPassword: function(password, done) {
        return bcrypt.compare(password, this.password, function(err, res) {
          return done(err, res);
        });
      }
    }
  });
};

实例方法可以用于特定元素实例,例如。

models.User.find(123).success( function( user ) { 
    user.setPassword('test');
});

您将函数定义为: function(password, done)

但是你没有提供done参数。 因此,函数将作为未定义完成,并且调用done()正在执行未定义的函数。

您可以通过3种方式解决此问题:

  1. 默认完成noop函数function () {}
  2. 只有在定义完成后才返回done()
  3. 调用实例函数时提供完成回调。

另一种方法是重构它以返回它在完成时解析的承诺。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM