我有这样的东西:

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
}

用户

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

推荐答案

问题是,您的两个模块具有循环关系,并且它们都试图在初始模块执行期间使用对方的导出成员.所以必须首先运行其中的一个(在您的示例中是photo.ts),当它try 使用User时,导出的成员还没有初始化,因为user.ts还没有执行.我必须承认,我对您将其视为运行时错误感到有点惊讶,因为我看到在模块代码的第top level位的循环中使用它们的唯一位置是应用于userphotos的类型.也许这与装饰符正在做的事情有关,或者与UserPhoto都是and类型的值(构造函数)有关.

TypeORM网站谈到了"循环关系"here.它说要使用Relation类型来避免这种情况(因此user: Relation<User>而不是user: User,photos: Relation<Photo[]>而不是photos: Photo[]).显然,这阻止了这个循环的出现.

Node.js相关问答推荐

monorepo内的NPM包使用不在注册表中的本地包

为什么我的表单数据在我的POST请求中作为应用程序/json发送,为什么它返回错误请求错误?

当FastifyJS向客户端发送响应时,apache 不会将其发送给他

如何在RavenDB中执行JS索引?

如何从shell脚本中计算ecmascript模块?

Mongoose抱怨说,整数是数字,而不是整数

如何修复PostgreSQL和NodeJS/NestJS应用程序之间的日期时间和时区问题?

如何使用NodeJS在mongodb中更新文档

Typescript 条件语句不过滤值?

WSL2 上需要脚本运行的 NPM 包的权限被拒绝

使用Typescript 时我应该避免循环导入吗?

仅显示用户在 Reactjs 中使用服务器端发布的帖子是 Node Js、Mongodb

Azure Function 在 2022 年 4 月 26 日禁用将用户字段设置为 HTTP 请求对象

带权限的机密 Rest-Api - 总是 403 - 我做错了什么?

在本地运行 Cloud Functions 会出现错误functions.config() 不可用

Node.js + Express 上的多个视图路径

我应该在(Docker)容器中使用 forever/pm2 吗?

名称类型为 mongoose 的字段

NPM:为什么要安装这个包?

在 Node.js 上使用 Connect 无法获取 /