【问题标题】:Using Instance Methods in Sequelize在 Sequelize 中使用实例方法
【发布时间】:2013-10-26 08:41:50
【问题描述】:

谁能帮我理解如何在 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);
        });
      }
    }
  });
};

【问题讨论】:

  • 为什么在所有回调调用之前返回?
  • thissetPassword实例方法中的使用将无法引用实际的User实例。

标签: javascript node.js postgresql sequelize.js


【解决方案1】:

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

但您没有提供 done 参数。 因此,函数将 done 保留为未定义,调用 done() 正在执行未定义的函数。

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

  1. 默认完成到 noop 函数function () {}
  2. 如果定义了 done,则仅返回 done()
  3. 在调用实例函数时提供完成回调。

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

【讨论】:

    【解决方案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”是未定义的并且不是函数。
    猜你喜欢
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多