NodeJS 当变量在另一个文件中初始化时,无法在初始化错误之前访问变量

zz2j4svz  于 2023-10-17  发布在  Node.js
关注(0)|答案(1)|浏览(139)

我有这样的话:
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
6pp0gazn

6pp0gazn1#

问题是,您的两个模块具有循环关系,并且它们都试图在初始模块执行期间使用对方的导出成员。因此,必须先运行其中一个(在您的示例中为photo.ts),并且当它尝试使用User时,该导出成员尚未初始化,因为user.ts尚未执行。我不得不承认,我有点惊讶你会得到这个作为一个运行时错误,因为我看到他们在一个循环中使用的唯一地方在模块代码的 * 顶层 * 是在类型被应用到userphotos。也许这与装饰器正在做的事情有关,或者UserPhoto都是类型 * 和 * 值(构造函数)。
TypeORM网站在这里谈到了“循环关系”。它说使用Relation类型来避免这种情况(所以user: Relation<User>而不是user: Userphotos: Relation<Photo[]>而不是photos: Photo[])。显然,这阻止了循环的产生。

相关问题