Sequelize.js: включить неожиданное.Элемент должен быть либо моделью, ассоциацией или объектом - PullRequest
1 голос
/ 29 апреля 2019

Я использую Sequelize.js в своем приложении Node.js и продолжаю сталкиваться с очень странной проблемой.

Справочная информация: У меня есть две модели, Учетная запись и AccountCategory следующим образом.Моя конечная точка API вызывает маршрут /accounts, который вызывает контроллер учетных записей для выполнения запроса Account.findAll().

Учетные записи модель имеет defaultScope для включения связанной категории по умолчанию, безнеобходимость указывать его каждый раз внутри блока findAll({}).

Проблема: Когда модель Счета пытается получить доступ и вернуть данные из базы данных,defaultScope пытается включить AccountCategory , Sequelize выдает ошибку:

Включить неожиданное.Элементом должен быть либо Модель, Ассоциация или объект.

Я подозреваю, что это связано с тем, что AccountCategory ставится после Account в моей папке models , когда модели устанавливаются и, следовательно, не обрабатываются (связываются).Я основываю это на том факте, что другие ассоциации, такие как Пользователь и Роль (т. Е. У пользователя есть роль), прекрасно работают с использованием того же метода (т. Е. Нет проблем с глубиной пути, как у этот ответ предлагает).

Последние два дня я потратил на то, чтобы заставить работать defaultScope и прекратить выдавать эту ошибку без всякой удачи.Подобные вопросы не дают ответа, и я был бы очень признателен за любую помощь в решении этой проблемы.Спасибо.

Аккаунт:

module.exports = (sequelize, DataTypes) => {
    const Account = sequelize.define(
        "Account",
        {
            id: {
                type: DataTypes.INTEGER(11),
                allowNull: false,
                primaryKey: true,
                autoIncrement: true
            },
            name: {
                type: DataTypes.STRING(100)
            },
            category_id: {
                type: DataTypes.INTEGER(11),
                allowNull: false
            }
        },
        {
            timestamps: false,
            tableName: "Account",
            defaultScope: {
                include: [{
                    model: sequelize.models.AccountCategory,
                    as: "category"
                }]
            }
        }
    );

    Account.associate = models => {
        // Association: Account -> AccountCategory
        Account.belongsTo(models.AccountCategory, {
            onDelete: "CASCADE",
            foreignKey: {
                fieldName: "category_id",
                allowNull: false,
                require: true
            },
            targetKey: "id",
            as: "category"
        });
    };

    return Account;
};

Категория аккаунта:

module.exports = (sequelize, DataTypes) => {
    var AccountCategory = sequelize.define(
        "AccountCategory",
        {
            id: {
                type: DataTypes.INTEGER(11),
                allowNull: false,
                primaryKey: true,
                autoIncrement: true
            },
            name: {
                type: DataTypes.STRING(30),
                allowNull: false,
                unique: true
            }
        },
        {
            timestamps: false,
            tableName: "Account_Category"
        }
    );

    return AccountCategory;
};

Индекс моделей:

const fs = require("fs");
const path = require("path");
const Sequelize = require("sequelize");
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || "development";
const db = {};

const sequelize = new Sequelize(
    process.env.DB_NAME,
    process.env.DB_USER,
    process.env.DB_PASS,
    {
        host: process.env.DB_HOST,
        dialect: "mysql",
        operatorAliases: false,

        pool: {
            max: 5,
            min: 0,
            acquire: 30000,
            idle: 10000
        }
    }
);

fs.readdirSync(__dirname)
    .filter(function(file) {
        return (
            file.indexOf(".") !== 0 && file !== basename && file.slice(-3) === ".js"
        );
    })
    .forEach(function(file) {
        var model = sequelize["import"](path.join(__dirname, file));
        db[model.name] = model;
    });

Object.keys(db).forEach(function(modelName) {
    if (db[modelName].associate) {
        db[modelName].associate(db);
    }
    db[modelName].associate(db);
});

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

module.exports = db;

1 Ответ

0 голосов
/ 21 июня 2019

Вы должны попытаться определить, включить по псевдониму

defaultScope: {
  include: 'category'
}

У меня работает в sequelize 5 +

...