You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS+Express+PostgreSQL+Sequelize关联查询报SequelizeEagerLoadingError

问题原因

你的报错核心是models/index.js中重复实例化模型,导致关联关系没有绑定到你控制器使用的模型实例上:

  1. 模型定义中Umkm_Jenis的modelName为Umkm_Jenis、Umkm_Kategori的modelName为Umkm_Kategori,models/index.js的自动导入逻辑会把两个模型挂载到db.Umkm_Jenis和db.Umkm_Kategori上,且自动调用associate方法建立了关联。
  2. 你在index.js末尾手动新增了4行require代码,重新实例化了四个模型挂载到db.jenis、db.kategori等属性上,这部分重复实例化的模型没有执行关联逻辑,不存在绑定关系。
  3. 控制器中使用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:15:04