选择结果后,使用实例方法

时间:2018-06-05 16:33:24

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

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

  

未处理拒绝TypeError: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'};
    })
}
...

1 个答案:

答案 0 :(得分:1)

这取决于你使用的续集版本和可能使用Sequelize v4的版本。 On 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 () {..}