【问题标题】:sequelize use instance method after selecting result选择结果后sequelize使用实例方法
【发布时间】:2018-06-06 10:19:41
【问题描述】:

我想了解 sequelize 实例方法的工作原理以及是否可以将返回的对象用作实例以供进一步使用。基本上我只是通过用户名选择用户,稍后我想比较密码是否匹配,如果匹配,则更新数据。但是错误说

未处理的拒绝类型错误:user_data.validPassword 不是函数

我什至还没有接近实例更新..

我的用户模型:

const bcrypt = require('bcryptjs');

module.exports = (sequelize, DataTypes) => {
    const User = sequelize.define('User', {
        id: {
            type: DataTypes.INTEGER,
            primaryKey: true,
            autoIncrement: true,
        },
        user_name: DataTypes.STRING,
        user_password: DataTypes.STRING,
        user_token: DataTypes.STRING,
        user_alias_name: DataTypes.STRING,
    }, {
        tableName: 'oc_users',
        instanceMethods: {
            generateHash(password) {
                return bcrypt.hash(password, bcrypt.genSaltSync(8));
            },
            validPassword(password) {
                return bcrypt.compare(password, this.password);
            }
        }
    });

    return User;
};

我的方法:

...
loginAttempt(cookie) {
    return models.User.findOne({
        attributes: ['id', 'user_password', 'user_alias_name'],
        where: {user_name: this.user}
    }).then(user_data => {
        if (!user_data) return 'No matching results for such a user';
        return user_data.validPassword(this.password).then(result => {
            if (result !== true) return 'Invalid password for selected user';
            return this.updateAfterLogin(user_data, cookie);
        })
    })
}

updateAfterLogin(user, cookie) {
    return user.update({
        user_token: cookie
    }).then(()=> {
        return {data: 'updated'};
    })
}
...

【问题讨论】:

    标签: node.js ecmascript-6 sequelize.js


    【解决方案1】:

    这取决于您使用的是哪个版本的 sequelize,并且可能您使用的是 Sequelize v4。在 Sequelize v4 中,classMethods 和 instanceMethods 已从 sequelize.define 中移除。

    您可以在官方文档中查看更多信息: http://docs.sequelizejs.com/manual/tutorial/upgrade-to-v4.html#config-options

    从 sequelize.define 中删除了 classMethods 和 instanceMethods 选项。 Sequelize 模型现在是 ES6 类。您可以像这样设置类/实例级别的方法

    const Model = sequelize.define('Model', {
        ...
    }, {
        classMethods: {
            associate: function (model) {...}
        },
        instanceMethods: {
            someMethod: function () { ...}
        }
    });
    

    const Model = sequelize.define('Model', {
        ...
    });
    
    // Class Method
    Model.associate = function (models) {
        ...associate the models
    };
    
    // Instance Method
    Model.prototype.someMethod = function () {..}
    

    【讨论】:

      猜你喜欢
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 2016-09-04
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多