NodeJS+Express+PostgreSQL+Sequelize关联查询报SequelizeEagerLoadingError
问题原因
你的报错核心是models/index.js中重复实例化模型,导致关联关系没有绑定到你控制器使用的模型实例上:
- 模型定义中
Umkm_Jenis的modelName为Umkm_Jenis、Umkm_Kategori的modelName为Umkm_Kategori,models/index.js的自动导入逻辑会把两个模型挂载到db.Umkm_Jenis和db.Umkm_Kategori上,且自动调用associate方法建立了关联。 - 你在
index.js末尾手动新增了4行require代码,重新实例化了四个模型挂载到db.jenis、db.kategori等属性上,这部分重复实例化的模型没有执行关联逻辑,不存在绑定关系。 - 控制器中使用的
Kategori和db.jenis都是手动重复实例化的无关联模型,执行include时就会抛出SequelizeEagerLoadingError。
解决方案
第一步:修正models/index.js
删除index.js末尾以下重复实例化模型的代码:
db.kategori = require("./umkm_kategori")(sequelize, Sequelize); db.jenis = require("./umkm_jenis")(sequelize, Sequelize); db.produk = require("./umkm_produk")(sequelize, Sequelize); db.review = require("./umkm_review")(sequelize, Sequelize);
第二步:统一控制器的模型引用
修改控制器代码,使用自动导入的、已建立关联的模型实例:
exports.findAllKategori = async (req, res) => { //check if theres a filter applied const nama = req.query.nama; const condition = nama ? { nama: { [Op.iLike]: `%${nama}%` } } : null; try { const data = await db.Umkm_Kategori.findAll({ where: condition, include: [{ model: db.Umkm_Jenis, as: "umkm_jenis", required: false }], }); return res.status(200).send(data); } catch (error) { console.log(error); return res.status(500).send(error); } };
可选优化(推荐)
如果想保留db.jenis、db.kategori的短命名引用,可以在删除重复实例化代码后,手动给db对象加别名映射:
// models/index.js 自动导入关联逻辑后添加 db.kategori = db.Umkm_Kategori; db.jenis = db.Umkm_Jenis; db.produk = db.Umkm_Produk; db.review = db.Umkm_Review;
添加后控制器不需要修改原有模型引用即可正常运行。
额外建议
建议在kategori的迁移文件中给jenis_id增加外键约束,保证数据一致性,修改kategori-migration.js中的jenis_id定义:
jenis_id: { type: Sequelize.INTEGER, allowNull: false, references: { model: 'Umkm_Jenis', key: 'id' } },
内容的提问来源于stack exchange,提问作者Bagus Amrullah Fikri
相关产品推荐
相关产品推荐

