请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Cannot access 'User' before initialization

老师:
您好!
在写实体类时,多对一,一对多关系时,出现了问题,一对一,多对多,是可以的,您有空闲时帮我看一下。

使用版本如下:

"@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
}

报错如下:
图片描述

正在回答 回答被采纳积分+3

1回答

Brian 2025-11-19 09:17:38

你这是循环依赖的问题。

加载顺序大致是: 

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
}


0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号