Sequelize JS中模型关联配置出错,关联查询报错求助
问题描述
我有两个模型,为hasMany/belongsTo关系,数据库表结构如下:
documents表
| id | user_id | path |
|---|
queryables表
| id | user_id | queryable_type | document_id |
|---|
模型文件中的关联配置如下:
Document.associate = (models) => { Document.belongsTo(models.User, { name: 'user_id', allowNull: false, }); Document.hasMany(models.Queryable, { foreignKey: 'document_id', onDelete: 'CASCADE' }); }; };
Queryable.associate = (models) => { Queryable.belongsTo(models.Document, { name: 'document_id', allowNull: false }); };
我可以正常插入和查询这两个表,但尝试通过关联查询时:
const document = await Document.findByPk(req.params.id, { include: { model: Queryable, }, });
出现以下错误:
/Users/jackcollins/inquirer/node_modules/sequelize/lib/model.js:565 throw new sequelizeErrors.EagerLoadingError(`${targetModel.name} is not associated to ${this.name}!`); ^ EagerLoadingError [SequelizeEagerLoadingError]: Queryable is not associated to Document! at Document._getIncludedAssociation (/Users/jackcollins/inquirer/node_modules/sequelize/lib/model.js:565:13) at Document._validateIncludedElement (/Users/jackcollins/inquirer/node_modules/sequelize/lib/model.js:502:53) at /Users/jackcollins/inquirer/node_modules/sequelize/lib/model.js:421:37 at Array.map (<anonymous>) at Document._validateIncludedElements (/Users/jackcollins/inquirer/node_modules/sequelize/lib/model.js:417:39) at Document.findAll (/Users/jackcollins/inquirer/node_modules/sequelize/lib/model.js:1124:12) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async Document.findOne (/Users/jackcollins/inquirer/node_modules/sequelize/lib/model.js:1240:12) at async Document.findByPk (/Users/jackcollins/inquirer/node_modules/sequelize/lib/model.js:1221:12) at async getDocument (file:///Users/jackcollins/inquirer/server/controllers/documentsController.js:162:20) Node.js v19.8.1
我已尝试使用sequelize.sync()但无效果,请问我的配置哪里出错了?
问题原因与解决方法
1. 关联参数误用
Sequelize中定义外键需要使用foreignKey参数,你错误地用了name参数(name是用来指定关联别名的,不是外键字段名)。
2. 语法错误
Document模型的关联代码末尾多了一个冗余的};,导致关联函数执行异常,关联关系未被正确注册。
修正后的关联代码
Document模型:
Document.associate = (models) => { Document.belongsTo(models.User, { foreignKey: 'user_id', // 替换name为foreignKey allowNull: false, }); Document.hasMany(models.Queryable, { foreignKey: 'document_id', onDelete: 'CASCADE' }); };
Queryable模型:
Queryable.associate = (models) => { Queryable.belongsTo(models.Document, { foreignKey: 'document_id', // 替换name为foreignKey allowNull: false }); };
验证步骤
修正代码后,重启服务,确保所有模型的associate函数都被Sequelize正确执行,之后再执行关联查询即可正常加载关联数据。
内容的提问来源于stack exchange,提问作者Jack Collins
相关产品推荐
相关产品推荐

