在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)

但是你不提供完成的参数。 因此,函数离开完成未定义和调用完成()正在执行一个未定义的函数。

你可以用三种方法解决这个问题:

  1. 默认做了一个noop函数function () {}
  2. 只有返回done()如果完成定义
  3. 调用实例函数时提供完成的callback。

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