Cannot access 'User' before initialization
来源:1-1 课程介绍
慕尼黑8466541
2025-11-18
老师:
您好!
在写实体类时,多对一,一对多关系时,出现了问题,一对一,多对多,是可以的,您有空闲时帮我看一下。
使用版本如下:
"@nestjs-modules/mailer": "^2.0.2",
"@nestjs/common": "^11.0.1",
"@nestjs/typeorm": "^11.0.0",
"mysql2": "^3.15.3",
"typeorm": "^0.3.27",
user.entity.ts
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
OneToMany,
JoinColumn
} from 'typeorm'
import { Log } from '../log/log.entity'
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
@Column({ length: 20, comment: '用户名', unique: true })
username: string
@Column({ length: 64, comment: '密码' })
password: string
@Column({ length: 11, comment: '手机号' })
phone: string
@Column({ length: 50, comment: '邮箱' })
email: string
@Column({ type: 'tinyint', width: 1, comment: '状态', default: 1 })
status: number
@CreateDateColumn({ comment: '创建时间' })
createTime: Date
@UpdateDateColumn({ comment: '更新时间' })
updateTime: Date
// 一个用户拥有多个日志,称之为一对多关系
@OneToMany(() => Log, (log) => log.user)
logs: Log[]
}
log.entity.ts
import { Entity, Column, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'
import { User } from '../user/user.entity'
@Entity()
export class Log {
@PrimaryGeneratedColumn()
id: number
@Column()
path: string
@Column()
method: string
@Column()
data: string
@Column()
result: string
// 多条日志为一个用户,称之为 多对一关系
@ManyToOne(() => User, (user) => user.logs)
@JoinColumn()
user: User
}
报错如下:
写回答
1回答
-
Brian
2025-11-19
你这是循环依赖的问题。
加载顺序大致是:
Node 开始加载 log.entity.ts -> log.entity.ts 需要 User,于是 require(../user/user.entity')
进入 user.entity 类 User 还在初始化过程 ->
log.entity.ts 里的 @ManyToOne(() => User, ...) 在装饰器执行时被 TypeORM 立即调用 -> 里面需要访问 User
结果触发 “Cannot access ....”
建议:
1. 改成单向关系,实际上:多条日志 属于 同一用户,只保留Log -> User 这一侧就够了,大概是这样:
import { Entity, Column, ManyToOne, PrimaryGeneratedColumn, JoinColumn } from 'typeorm' import { User } from '../user/user.entity' @Entity() export class Log { @PrimaryGeneratedColumn() id: number @Column() path: string @Column() method: string @Column() data: string @Column() result: string // 多条日志属于一个用户(单向) @ManyToOne(() => User) @JoinColumn() user: User }user.entity.ts(删除对 Log 的 import 和 OneToMany)
2. 保持双向关系,把两个实体放在同一个文件里(不常见,你可以试试)
import { ... } from 'typeorm' @Entity() export class User { .... // 一对多 @OneToMany(() => Log, (log) => log.user) logs: Log[] } @Entity() export class Log { .... // 多对一 @ManyToOne(() => User, (user) => user.logs) @JoinColumn() user: User }00
相似问题