我有这样的话:
photo.ts
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from "typeorm"
import { User } from "./User"
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
id: number
@Column()
url: string
@ManyToOne(() => User, (user) => user.photos)
user: User
}
user.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm"
import { Photo } from "./Photo"
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
@Column()
name: string
@OneToMany(() => Photo, (photo) => photo.user)
photos: Photo[]
}
我正在使用nodemon
运行,并且我已经安装了ts-node
,但我收到以下错误:
ReferenceError: Cannot access 'User' before initialization
at file:///path/to/project/src/database/entities/photo.ts:14:9
at ModuleJob.run (node:internal/modules/esm/module_job:194:25)
这个错误打败了我,因为我甚至不知道从哪里开始,因为,坦率地说,我从来没有遇到过错误之前,任何帮助将不胜感激。
版本号:
node: v18.17.1
ts-node: v10.9.1
nodemon: v3.0.1
typescript: v5.2.2
1条答案
按热度按时间6pp0gazn1#
问题是,您的两个模块具有循环关系,并且它们都试图在初始模块执行期间使用对方的导出成员。因此,必须先运行其中一个(在您的示例中为
photo.ts
),并且当它尝试使用User
时,该导出成员尚未初始化,因为user.ts
尚未执行。我不得不承认,我有点惊讶你会得到这个作为一个运行时错误,因为我看到他们在一个循环中使用的唯一地方在模块代码的 * 顶层 * 是在类型被应用到user
和photos
。也许这与装饰器正在做的事情有关,或者User
和Photo
都是类型 * 和 * 值(构造函数)。TypeORM网站在这里谈到了“循环关系”。它说使用
Relation
类型来避免这种情况(所以user: Relation<User>
而不是user: User
,photos: Relation<Photo[]>
而不是photos: Photo[]
)。显然,这阻止了循环的产生。