我正在使用Sequelize.js在我的Node.js应用程序中,并且一直遇到一个非常奇怪的问题。
背景:我有两个模型,Account和AccountCategory如下所示。我的API端点调用路由/accounts,该路由调用账户控制器执行Account.findAll()查询。
Accounts模型具有defaultScope,可以默认包含相关类别,而无需每次在findAll({})块内指定它。
问题:当Accounts模型尝试访问并从数据库返回数据时,默认范围(defaultScope)尝试包含AccountCategory,Sequelize抛出错误:
Include unexpected. Element has to be either a Model, an Association or an object.
我怀疑这与我的models文件夹中的AccountCategory放在Account之后有关,因此没有被处理(关联)。我基于这样一个事实:其他关联,如User和Role(即用户拥有角色),使用相同的方法都很好(即没有路径深度问题,就像this answer所建议的那样)。
我已经花了最近两天的时间尝试使
背景:我有两个模型,Account和AccountCategory如下所示。我的API端点调用路由/accounts,该路由调用账户控制器执行Account.findAll()查询。
Accounts模型具有defaultScope,可以默认包含相关类别,而无需每次在findAll({})块内指定它。
问题:当Accounts模型尝试访问并从数据库返回数据时,默认范围(defaultScope)尝试包含AccountCategory,Sequelize抛出错误:
Include unexpected. Element has to be either a Model, an Association or an object.
我怀疑这与我的models文件夹中的AccountCategory放在Account之后有关,因此没有被处理(关联)。我基于这样一个事实:其他关联,如User和Role(即用户拥有角色),使用相同的方法都很好(即没有路径深度问题,就像this answer所建议的那样)。
我已经花了最近两天的时间尝试使
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;
var model = sequelize["import"](path.join(__dirname, 'account.js')); db[model.name] = model;model = sequelize["import"](path.join(__dirname, 'account_categoryjs')); db[model.name] = model;
替换readDir(或者按照你想要的任何顺序)? - KenOn10index.js
文件中执行的导入/排序顺序引起的。 - Dillon