после выбора результата прекратить использование метода экземпляра - PullRequest
0 голосов
/ 05 июня 2018

Я хочу понять, как работают методы экземпляра 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 голосов
/ 06 июня 2018

Это зависит от того, какую версию sequelize вы используете и, вероятно, вы используете Sequelize v4.В Sequelize v4 classMethods и instanceMethods были удалены из sequelize.define.

Вы можете проверить это в официальных документах для получения дополнительной информации: http://docs.sequelizejs.com/manual/tutorial/upgrade-to-v4.html#config-options

Удалены опции classMethods и instanceMethods из sequelize.определить.Модели 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 () {..}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...