Sequelize.js:包括意外内容。元素必须是模型,关联或对象

时间:2019-04-29 02:51:32

标签: mysql node.js sequelize.js associations

我在Node.js应用程序中使用Sequelize.js,并不断遇到一个非常奇怪的问题。

背景:我有两个模型,分别是 Account AccountCategory 。我的API端点调用了路由/accounts,该路由调用了帐户控制器来进行Account.findAll()查询。

帐户模型具有一个defaultScope,默认情况下包括相关类别,而不必每次都在findAll({})块内进行指定。

问题:当 Accounts 模型试图访问数据库中的数据并从中返回数据时,defaultScope试图包括 AccountCategory ,Sequelize会引发错误:

  

包括意外内容。元素必须是模型,关联或对象。

我怀疑这与以下事实有关:在建立模型时, AccountCategory 放在我的 models 文件夹中的 Account 之后因此未处理(关联)。我基于这样的事实,即使用相同的方法(例如,路径深度没有问题),例如 User Role 之类的其他关联(即用户具有角色)也可以如this answer所建议)。

最近2天,我一直在努力使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 :(得分:0)

您应该尝试通过别名定义包含

defaultScope: {
  include: 'category'
}

为我工作,续集5个以上