Node.js+Sequelize关联MySQL时别名重复错误求助
错误原因
你在User模型上定义了两个关联,都使用了assignments作为别名:
User.hasMany(Assignment, { as: 'assignments' }):表示导师(User)拥有多个作业(Assignment)User.belongsToMany(Assignment, { as: 'assignments' }):表示学生(User)关联多个作业(Assignment)
Sequelize要求同一模型的所有关联别名必须唯一,因此触发了AssociationError。
修改后的关联代码
User.hasMany(Assignment, { as: 'tutorAssignments', foreignKey: 'tutorId' }); Assignment.belongsTo(User, { as: 'tutor', foreignKey: 'tutorId' }); Assignment.belongsToMany(User, { as: 'students', through: 'studentAssignment', foreignKey: 'assignmentId', }); User.belongsToMany(Assignment, { as: 'studentAssignments', through: 'studentAssignment', foreignKey: 'studentId', }); Submission.belongsTo(User, { as: 'student', foreignKey: 'studentId' }); Submission.belongsTo(Assignment, { as: 'assignment', foreignKey: 'assignmentId', });
修改说明
- 将
User.hasMany(Assignment)的别名从assignments改为tutorAssignments,明确表示这是导师创建/拥有的作业 - 将
User.belongsToMany(Assignment)的别名从assignments改为studentAssignments,明确表示这是学生被分配的作业 - 两个别名现在唯一,Sequelize可以正确区分不同的关联关系
原错误信息
throw new AssociationError(
You have used the alias ${options.as} in two separate associations. Aliased associations must have unique aliases.);
^AssociationError [SequelizeAssociationError]: You have used the alias
assignments in two separate associations. Aliased associations must
have unique aliases.
at new Association (C:\Users\User\OneDrive\Desktop\Toddle app\node_modules\sequelize\lib\associations\base.js:13:13)
at new BelongsToMany (C:\Users\User\OneDrive\Desktop\Toddle app\node_modules\sequelize\lib\associations\belongs-to-many.js:33:5)
at Function.belongsToMany (C:\Users\User\OneDrive\Desktop\Toddle app\node_modules\sequelize\lib\associations\mixin.js:43:25)
at Object. (C:\Users\User\OneDrive\Desktop\Toddle app\toddleapp.js:76:8)
at Module._compile (node:internal/modules/cjs/loader:1126:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1180:10)
at Module.load (node:internal/modules/cjs/loader:1004:32)
at Function.Module._load (node:internal/modules/cjs/loader:839:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47
内容的提问来源于stack exchange,提问作者shashank n c

