Sequelize TypeScript关联创建报错:无法访问未初始化的User
解决Sequelize关联创建时的"Cannot access 'User' before initialization"错误
错误原因
报错是因为定义Post类时,类型注解user: User直接引用了还未初始化的User类。虽然装饰器@BelongsTo(() => User)用箭头函数实现了惰性求值没问题,但类型注解是即时解析的,所以触发了引用未初始化变量的错误。
修复方案
方案1:调整类的定义顺序
把User类放在Post类前面,确保定义Post时User已经完成初始化:
import { InferAttributes, InferCreationAttributes } from 'sequelize' import { Table, Column, ForeignKey, BelongsTo, HasMany, Model } from 'sequelize-typescript' @Table export class User extends Model<InferAttributes<User>, InferCreationAttributes<User>> { @Column name: string @HasMany(() => Post) posts: Post[] } @Table export class Post extends Model<InferAttributes<Post>, InferCreationAttributes<Post>> { @Column table: string @ForeignKey(() => User) @Column userId: number @BelongsTo(() => User) user: User }
方案2:延迟类型引用(无需调整顺序)
如果不想改变类的定义顺序,可以用typeof来延迟类型解析,避免即时引用未初始化的User:
import { InferAttributes, InferCreationAttributes } from 'sequelize' import { Table, Column, ForeignKey, BelongsTo, HasMany, Model } from 'sequelize-typescript' @Table export class Post extends Model<InferAttributes<Post>, InferCreationAttributes<Post>> { @Column table: string @ForeignKey(() => User) @Column userId: number @BelongsTo(() => User) user: typeof User | User } @Table export class User extends Model<InferAttributes<User>, InferCreationAttributes<User>> { @Column name: string @HasMany(() => Post) posts: Post[] }
修正创建代码的小问题
index.ts里的创建逻辑可以优化,不需要同时传user和userId,二选一即可:
// 创建用户(如果需要初始化空帖子,加上include) const user = await User.create({name: 'username'}, {include: [Post]}) // 方式1:通过userId关联创建帖子 const post = await Post.create({table: 'title of a post', userId: user.id}) // 方式2:通过关联对象+include创建帖子 const post = await Post.create({table: 'title of a post', user: user}, {include: [User]})
内容的提问来源于stack exchange,提问作者nm980
相关产品推荐
相关产品推荐

