使用TypeORMAdapter扩展NextAuth的UserEntity添加一对多关联报错求助
在NextAuth中使用TypeORMAdapter时,为UserEntity添加与DatabaseEntity的OneToMany关联后,出现以下报错:
Entity metadata for UserEntity#databases was not found. Check if you specified a correct entity object and if it's connected in the connection options.
用户的关联代码示例:
@Entity({ name: "users" }) export class UserEntity { @PrimaryGeneratedColumn("uuid") id!: string // 其他字段... @OneToMany(() => DatabaseEntity, (database) => database.userId) databases!: DatabaseEntity[] }
解决步骤:
注册所有关联实体到TypeORM配置
TypeORM需要明确知晓所有要使用的实体,确保你的数据源配置(DataSource)的entities数组中同时包含UserEntity和DatabaseEntity:export const AppDataSource = new DataSource({ type: "postgres", // 根据你的数据库类型调整 host: "localhost", port: 5432, username: "your_username", password: "your_password", database: "your_db", entities: [UserEntity, DatabaseEntity], // 必须包含两个实体 synchronize: process.env.NODE_ENV === "development", // 开发环境自动同步schema });修正关联字段指向
OneToMany关联的反向引用应该指向DatabaseEntity中的实体关联,而非直接指向字段。同时DatabaseEntity必须定义对应的ManyToOne关联:@Entity({ name: "databases" }) export class DatabaseEntity { @PrimaryGeneratedColumn("uuid") id!: string; // 定义与UserEntity的多对一关联 @ManyToOne(() => UserEntity, (user) => user.databases) @JoinColumn({ name: "userId" }) // 指定外键列名 user!: UserEntity; // 可选:如果需要直接访问userId字段,可以添加 // @Column({ type: "uuid" }) // userId!: string; }同时修正
UserEntity中的OneToMany定义:@OneToMany(() => DatabaseEntity, (database) => database.user) // 改为指向database.user databases!: DatabaseEntity[]检查实体导入与循环依赖
确认UserEntity文件中正确导入了DatabaseEntity,你代码中使用的箭头函数延迟加载方式可以避免循环导入问题,只需确保没有拼写错误即可。同步数据库Schema
开发环境下可以开启synchronize: true让TypeORM自动同步表结构;生产环境建议使用迁移脚本,运行typeorm migration:run来更新数据库结构,确保外键和关联表字段正确创建。
内容的提问来源于stack exchange,提问作者Guy Korland

