Sequelize: TypeError: Невозможно прочитать свойство '_expandIncludeAll' из неопределенного

0

Я пытаюсь обновить Sequelize V3 до V4.

Далее следуют инструкции по устранению изменений.

Я получаю сообщение об ошибке при запуске следующего запроса с V4:

Auth.findOne({ . // This is where it failes
    include: {
        required: true,
        include: {
            where: {
                id: decoded.id,
                token: token,
            }
        }
    }
})

Настроить:

Существующий код с V3 (работает):

module.exports = function (sequelize, DataTypes) {
const Auth = sequelize.define('Auth', {
    token: {
        type: DataTypes.STRING,
        allowedNull: true,
        unique: true,
        required: true,
        validate: {
            len: [5, 200]
        }
    }
    device: {
        type: DataTypes.STRING,
        allowedNull: true,
        unique: false,
    }
}, {
        tableName: 'Auth',
        classMethods: {
            associate: function (models) {
                Auth.belongsTo(models.User, { 
                    foreignKey: {
                        name: 'user_id',
                        allowedNull: false,

                    }                        
                })
                Auth.hasMany(models.Endpoint, {
                    as: 'endpoints',
                    foreignKey: 'auth_id'                         
                })
            },
            findByToken: function (token) {
                var User = this
                var decoded

                try {
                    decoded = jwt.verify(token, 'abc123')
                } catch (e) {
                    return Promise.reject()
                }

                return Auth.findOne({
                    where: {
                        id: decoded.id,
                        token: token,
                    }
                })
            }
        }, instanceMethods: {
            generateAuthToken: function () {
                var auth = this
                var access = 'auth'
                var token = jwt.sign({ id: auth.id, access }, 'abc123').toString()
                auth.token = token
                auth.code = null
                auth.save().then(() => {
                })
            }

        }
    })

return Auth

}

Обновление до V4 (появляется TypeError)

module.exports = function (sequelize, DataTypes) {
var Auth = sequelize.define('Auth', {
    token: {
        type: DataTypes.STRING,
        allowedNull: true,
        unique: true,
        required: true,
        validate: {
            len: [5, 200]
        }
    },
    device: {
        type: DataTypes.STRING,
        allowedNull: true,
        unique: false,
    }
})
Auth.associate = function (models) {
    Auth.belongsTo(models.User, {
        foreignKey: {
            name: 'user_id',
            allowedNull: false,

        }
    })
    Auth.hasMany(models.Endpoint, {
        as: 'endpoints',
        foreignKey: 'auth_id'
    })
}
Auth.findByToken = function (token) {
    var User = this
    var decoded

    try {
        decoded = jwt.verify(token, 'abc123')
    } catch (e) {
        return Promise.reject()
    }

    return Auth.findOne({ . // This is where it fails
        include: {
            required: true,
            include: {
                where: {
                    id: decoded.id,
                    token: token,
                }
            }
        }
    })
}
Auth.prototype.generateAuthToken = function () {
    var auth = this
    var access = 'auth'
    var token = jwt.sign({ id: auth.id, access }, 'abc123').toString()
    auth.token = token
    auth.code = null
    auth.save().then(() => {
    })
}

return Auth

}

Промежуточное

var authenticate = (req, res, next) => {
    var token = req.header('x-auth')
    var db = req.app.get('db')

    db.Auth.findByToken(token).then((auth) =>  {
        if (!auth) {
            return Promise.reject()
        }
        req.user_id = auth.user_id
        req.device_id = auth.device_id
        req.auth_id = auth.id
        return next()
    }).catch((e) => {
        return res.status(401).send() 
        // I get an error here:  'TypeError: Cannot read property '_expandIncludeAll' of undefined
    })
}

Что я делаю неправильно?

Теги:
sequelize.js

2 ответа

0
Лучший ответ

Вы пробовали без "включить"?

Что-то вроде:

return Auth.findOne({ . // This is where it fails
    where: {
        id: decoded.id,
        token: token,
    }
});

должно сработать.

"include" используется для подзапросов через ассоциации, но предложение where, по-видимому, относится только к атрибутам Auth (http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-findAll)

Вы должны использовать "include", если вы хотите фильтровать некоторые атрибуты для пользователя.

0

Вы должны include: { model: YourModel }.

Выполнение include: { include: Model} выдает именно эту ошибку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню