在 Sequelize 中使用实例方法
Posted
技术标签:
【中文标题】在 Sequelize 中使用实例方法【英文标题】:Using Instance Methods in Sequelize 【发布时间】:2013-10-26 08:41:50 【问题描述】:谁能帮我理解如何?我已经查看了文档,但发现它很少。目前,我正在尝试在我的用户模型上使用 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);
);
);
;
【问题讨论】:
为什么在所有回调调用之前返回?this
在setPassword
实例方法中的使用将无法引用实际的User实例。
【参考方案1】:
您将函数定义为:
function(password, done)
但您没有提供 done 参数。 因此,函数将 done 保留为未定义,调用 done() 正在执行未定义的函数。
您可以通过 3 种方式解决此问题:
-
默认完成到 noop 函数
function ()
如果定义了 done,则仅返回 done()
在调用实例函数时提供完成回调。
另一种方法是重构它以返回它在完成时解析的承诺。
【讨论】:
【参考方案2】:实例方法可以用于特定的元素实例,例如。
models.User.find(123).success( function( user )
user.setPassword('test');
);
【讨论】:
啊,这很有道理。你知道为什么我在跑步时从return done()
得到TypeError: undefined is not a function
:> models.User.find(1).success( function( user ) user.setPassword('password'); );
不知道。我在我的项目中使用这个构造没有问题
冲浪。 “done”是 setPassword 的第二个参数,它必须是一个函数,正如您所说的“return done();”。您没有传入参数,因此“done”是未定义的并且不是函数。以上是关于在 Sequelize 中使用实例方法的主要内容,如果未能解决你的问题,请参考以下文章