Sequelize中EagerLoadingError问题(模型关联)排查与解决
问题:Sequelize预加载关联报错
User is not associated to Task! 问题场景
尝试使用findAll结合include进行预加载时,触发关联不存在的错误,以下是相关代码及错误信息:
业务代码
async function getAllTasks() { try { const tasks = await Task.findAll({ include: User, }); return tasks; } catch (error) { throw error; } }
关联定义文件(associations.js)
function applyExtraSetup(sequelize) { const User = require("./User"); const Task= require("./Task"); Task.belongsTo(User, { foreignKey: "userId" }); User.hasMany(Task, { foreignKey: "userId" }); } module.exports = { applyExtraSetup };
Task模型文件
const { Sequelize, DataTypes } = require("sequelize"); const sequelize = require("../../config/database"); const User = require("./User"); const Task = sequelize.define( "Task", { id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true, }, name: { type: DataTypes.STRING, allowNull: false, }, userId: { type: DataTypes.INTEGER, allowNull: false, references: { model: User, key: "id", }, }, }, { tableName: "Tasks", } ); module.exports = Task;
初始化文件(init.js)
const { Sequelize } = require("sequelize"); const sequelize = require("./config/database"); const { applyExtraSetup } = require("./app/models/associations"); const User = require("./app/models/User"); const Task = require("./app/models/Task"); applyExtraSetup(sequelize); sequelize.sync({ alter: true }).catch((err) => { console.log(err); });
错误信息
EagerLoadingError [SequelizeEagerLoadingError]: User is not associated to Task!
解决方案
通过给模型添加静态associate方法,并在初始化阶段统一执行关联定义,解决了关联未正确绑定的问题:
修改Task模型
class Task extends Model { static associate(models) { Task.belongsTo(models.User, { foreignKey: "userId" }); } } Task.init( { id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true, }, name: { type: DataTypes.STRING, allowNull: false, }, userId: { type: DataTypes.INTEGER, allowNull: false, references: { model: User, key: "id", }, }, }, { sequelize, tableName: "Tasks", } ); module.exports = Task;
修改init.js
const { Sequelize } = require("sequelize"); const sequelize = require("./config/database"); const models = require("./app/models"); // 批量执行所有模型的关联定义 Object.values(models).forEach((model) => { if (model.associate) { model.associate(models); } }); sequelize.sync({ alter: true }).catch((err) => { console.log(err); });
说明
该方案通过模型内置的associate方法管理关联关系,在初始化时批量执行关联绑定,解决了原方式中关联未生效的问题。目前已能正常运行,仍有优化空间。
内容的提问来源于stack exchange,提问作者Fino
相关产品推荐
相关产品推荐

