Sequelize: необработанное отклонение. TypeError: Невозможно прочитать свойство 'id' из неопределенного - PullRequest
0 голосов
/ 20 ноября 2018

В настоящее время использует ExpressJS в качестве основы для создания небольшой системы CMS, но в настоящее время сталкивается с проблемой. Я пытаюсь создать модель для таблицы под названием «роли», но когда я добавляю ее в файл базы данных для включения, я получаю следующую ошибку после запуска «node app.js»

Unhandled rejection TypeError: Cannot read property 'id' of undefined
    at Object.mapValueFieldNames (C:\Users\Ryahn\Documents\Projects\monkeys\node_modules\sequelize\lib\utils.js:232:19)
    at Promise.try.then.then (C:\Users\Ryahn\Documents\Projects\monkeys\node_modules\sequelize\lib\model.js:2393:37)
    at tryCatcher (C:\Users\Ryahn\Documents\Projects\monkeys\node_modules\bluebird\js\release\util.js:16:23)
    at Promise._settlePromiseFromHandler (C:\Users\Ryahn\Documents\Projects\monkeys\node_modules\bluebird\js\release\promise.js:512:31)
    at Promise._settlePromise (C:\Users\Ryahn\Documents\Projects\monkeys\node_modules\bluebird\js\release\promise.js:569:18)
    at Promise._settlePromise0 (C:\Users\Ryahn\Documents\Projects\monkeys\node_modules\bluebird\js\release\promise.js:614:10)
    at Promise._settlePromises (C:\Users\Ryahn\Documents\Projects\monkeys\node_modules\bluebird\js\release\promise.js:694:18)
    at _drainQueueStep (C:\Users\Ryahn\Documents\Projects\monkeys\node_modules\bluebird\js\release\async.js:138:12)
    at _drainQueue (C:\Users\Ryahn\Documents\Projects\monkeys\node_modules\bluebird\js\release\async.js:131:9)
    at Async._drainQueues (C:\Users\Ryahn\Documents\Projects\monkeys\node_modules\bluebird\js\release\async.js:147:5)
    at Immediate.Async.drainQueues (C:\Users\Ryahn\Documents\Projects\monkeys\node_modules\bluebird\js\release\async.js:17:14)
    at runCallback (timers.js:810:20)
    at tryOnImmediate (timers.js:768:5)
    at processImmediate [as _immediateCallback] (timers.js:745:5)

Если я не включу модель в файл инициализации базы данных, она будет работать нормально. Идея состоит в том, чтобы затем использовать отношения для сопряжения двух. Я не планирую назначать разрешения, просто использую роли. Файл миграции настроен так же, как и модель. Я предполагал, что при сопоставлении пользовательской модели будет работать и модель ролей. Но сейчас я не уверен, что происходит.

Пользователи

'use strict';
const
    Promise = require('bluebird'),
    bcrypt = Promise.promisifyAll(require('bcrypt'))
    ;
module.exports = (sequelize, DataTypes) => {
    const users = sequelize.define('users', {
        id: {
            autoIncrement: true,
            primaryKey: true,
            type: DataTypes.INTEGER
        },
        username: {
            type: DataTypes.STRING,
            notEmpty: true,
            unique: true
        },
        password: {
            type: DataTypes.STRING,
            notEmpty: true
        },
        role: {
            type: DataTypes.INTEGER(2).UNSIGNED,
            validate: {
                isNumeric: true
            }
        },
        steamid: {
            type: DataTypes.STRING(17),
            validate: {
                len: 17
            }
        },
        link: {
            type: DataTypes.STRING,
            validate: {
                isUrl: true
            }
        },
        last_login: DataTypes.DATE
    }, 
    {
        hooks: {

            beforeCreate: function(user, options) {
                if (!user.changed('password')) {
                    return sequelize.Promise.reject('not modified');
                }

                return bcrypt.hash(user.password, 10).then(hash => {
                    return user.password = hash;
                }).catch(err => {
                    return sequelize.Promise.reject(err);
                });
            },

            beforeUpdate: function(user, options) {
                if (!user.changed('password')) {
                    return sequelize.Promise.reject('not modified');
                }

                return bcrypt.hash(user.password, 10).then(hash => {
                    return user.password = hash;
                }).catch(err => {
                    return sequelize.Promise.reject(err);
                });
            }
        }
    });

    users.prototype.generateHash = function(password) {
        return bcrypt.hashSync(password, bcrypt.genSaltSync(10));
    };

    users.prototype.validPassword = function(password) {
        return bcrypt.compareSync(password, this.password);
    };

    users.sync({force: false}).then(() => {
        return users.findOrCreate({
            where: {
                id: 1,
                username: 'Admin'
            },
            defaults: {
                username: 'Admin',
                password: 'admin123',
                role: 1,
                steamid: parseInt(12345678901234567),
                link: 'https://www.example.com/user_profile.php?userID=1171981'
            }
        });
    });

    return users;
};

Роли

'use strict';
module.exports = (sequelize, DataTypes) => {
    const roles = sequelize.define('roles', {
        id: {
            autoIncrement: true,
            primaryKey: true,
            type: DataTypes.INTEGER
        },
        name: DataTypes.STRING,
        slug: DataTypes.STRING
    }, {
        timestamps: false
    });

    let role = [];
    role.push([
        { name: 'Admin', slug: 'admin'},
        { name: 'Staff', slug: 'staff'},
        { name: 'Trainer', slug: 'trainer'},
        { name: 'Captain', slug: 'captain'},
        { name: 'Monkey', slug: 'monkey'}
    ]);
    roles.sync({force: false}).then(() => {
        return roles.bulkCreate(role);
    });

    return roles;
};

Init

const 
    config = require('../config/database'),
    Sequelize = require('sequelize'),
    sequelize = new Sequelize(config),
    db = {}
    ;

db.Sequelize = Sequelize;
db.sequelize = sequelize;

db.users = require('./models/users')(sequelize, Sequelize);
db.roles = require('./models/roles')(sequelize, Sequelize);

module.exports = db;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...