Sequelize.js中OneToMany关联定义报错排查求助
解决Sequelize OneToMany关联报错:Categoria.hasMany called with something that's not a subclass of Sequelize.Model
咱们来拆解下你遇到的这个问题:你直接在Categoria模型里通过require导入Subcategoria模块来建立关联,但这时候Subcategoria模型还没完成Sequelize的初始化流程,并不是Sequelize.Model的合法子类,所以触发了这个报错。
正确的做法是利用Sequelize提供的associate方法来定义模型间的关联——因为models/index.js会在所有模型加载完成后,自动调用每个模型的associate方法,并且会把所有已初始化的模型通过参数传递进来,这时候引用其他模型就安全了。
第一步:修改Categoria模型
删掉顶部的var {subcategoria} = require('./');,然后把关联定义移到associate方法里:
'use strict'; const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class Categoria extends Model { static associate(models) { // 通过models.Subcategoria引用已初始化的子模型 this.hasMany(models.Subcategoria, { foreignKey: 'idCategoria', sourceKey: 'id' }); } }; Categoria.init({ id: { type: DataTypes.NUMBER, autoIncrement: true, primaryKey: true}, nomeCategoria: { field: 'nome_categoria', type: DataTypes.STRING}, nomeLinkCategoria:{ field: 'nome_link_categoria', type: DataTypes.STRING} }, { sequelize, tableName: 'categoria', modelName: 'Categoria', }); return Categoria; };
第二步:完善Subcategoria模型(可选但推荐)
在Subcategoria的associate方法里添加反向的belongsTo关联,这样你可以通过子模型直接获取对应的父模型:
'use strict'; const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class Subcategoria extends Model { static associate(models) { // 定义反向关联,关联到Categoria this.belongsTo(models.Categoria, { foreignKey: 'idCategoria', targetKey: 'id' }); } }; Subcategoria.init({ id: { type: DataTypes.NUMBER, autoIncrement: true, primaryKey: true}, idCategoria: DataTypes.NUMBER, nomeSubcategoria: DataTypes.STRING, nomeLinkSubcategoria: DataTypes.STRING }, { sequelize, tableName: 'subcategoria', modelName: 'Subcategoria' }); return Subcategoria; };
为什么这样改能解决问题?
Sequelize的模型初始化流程是:models/index.js会遍历所有模型文件,先初始化每个模型,然后再统一调用每个模型的associate方法。这时候所有模型都已经完成了Model的继承,通过models参数引用的模型都是合法的Sequelize.Model子类,不会再触发类型错误。而直接require子模型会打破这个流程,导致子模型还没初始化完成就被引用,从而报错。
内容的提问来源于stack exchange,提问作者Diego Alves
相关产品推荐
相关产品推荐

