ユーザーと習慣の2つのエンティティがあります。ユーザーは複数の習慣を作成できるため、ユーザーにOneToManyリレーションを使用します(習慣にそれぞれManyToOne)。
import {Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, BeforeInsert, BeforeUpdate, OneToMany} from "typeorm";
import * as bcrypt from "bcryptjs";
import { Habit } from "../habits/habits.entity";
@Entity()
export class User {
@PrimaryGeneratedColumn("uuid")
id: string;
@Column()
name: string;
@Column()
email: string;
@Column()
password: string;
@OneToMany(type => Habit, habit => habit.author)
habits: Habit[];
@CreateDateColumn()
dateCreated: Date;
@UpdateDateColumn()
dateUpdated: Date;
@BeforeInsert()
@BeforeUpdate()
async hashPassword(): Promise<void> {
this.password = await bcrypt.hash(this.password,10);
}
async comparePassword(password: string): Promise<boolean> {
return bcrypt.compare(password, this.password);
}
constructor(props: any) {
Object.assign(this, props);
}
}
import {Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn, ManyToOne} from "typeorm";
import { User } from "../users/users.entity";
@Entity()
export class Habit {
@PrimaryGeneratedColumn("uuid")
id: string;
@Column()
name: string;
@Column({ nullable: true})
description?: string;
@ManyToOne(type => User, user => user.habits)
author: User;
@CreateDateColumn()
dateCreated: Date;
@UpdateDateColumn()
dateUpdated: Date;
constructor(props: Partial<Habit>) {
Object.assign(this, props);
}
}
上記の関係を設定すると、次のエラーが表示されます
WARNING in Circular dependency detected:
apps\api\src\habits\habits.entity.ts -> apps\api\src\users\users.entity.ts -> apps\api\src\habits\habits.entity.ts
WARNING in Circular dependency detected:
apps\api\src\users\users.entity.ts -> apps\api\src\habits\habits.entity.ts -> apps\api\src\users\users.entity.ts
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "User", function() { return User; });
^
ReferenceError: Cannot access 'User' before initialization
at Module.User (...\dist\apps\api\main.js:1782:96)
at Module../apps/api/src/habits/habits.entity.ts (...\dist\apps\api\webpack:\apps\api\src\habits\habits.entity.ts:42:13)
at __webpack_require__ (...\dist\apps\api\webpack:\webpack\bootstrap:19:1)
at Module../apps/api/src/users/users.entity.ts (...\dist\apps\api\main.js:1790:79)
at __webpack_require__ (...\dist\apps\api\webpack:\webpack\bootstrap:19:1)
at Module../apps/api/src/config/db-config.service.ts (...\dist\apps\api\main.js:1038:77)
at __webpack_require__ (...\dist\apps\api\webpack:\webpack\bootstrap:19:1)
at Module../apps/api/src/config/config.module.ts (...\dist\apps\api\main.js:978:76)
at __webpack_require__ (...\dist\apps\api\webpack:\webpack\bootstrap:19:1)
at Module../apps/api/src/app/app.module.ts (...\dist\apps\api\main.js:147:79)
Nxを使用してNestJSアプリを作成しました。 TypeOrmバージョンは"^ 0.2.22"であり、@ nestjs/typeormバージョンは"^ 6.2.0"です。
私のtsconfigは次のとおりです。
{
"compileOnSave": false,
"compilerOptions": {
"rootDir": ".",
"sourceMap": true,
"declaration": false,
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"importHelpers": true,
"target": "es2015",
"module": "esnext",
"typeRoots": ["node_modules/@types"],
"lib": ["es2018", "dom"],
"skipLibCheck": true,
"skipDefaultLibCheck": true,
"baseUrl": ".",
"paths": {
"@awhile/contracts": ["libs/contracts/src/index.ts"],
"@awhile/ui": ["libs/ui/src/index.ts"]
}
},
"exclude": ["node_modules", "tmp"]
}
ManyToManyリレーションを使用しようとしましたが、うまくいきました。また、別のNestJSアプリ(Nxなし)では、この参照エラーを再現できません。 ECMAScriptの変更targettsconfig.jsonのバージョンも機能しませんでした。
どちらのエンティティもサービスでのみ使用され、他の場所ではインスタンス化されません。
どんな助けにも感謝します。前もって感謝します。
バレルファイルを使用して、@ jdruperと同じことを実行できます。 tsconfig.jsonにパスプロパティがない場合は、compilerOptions
の下に次のようなパスプロパティを追加します。
"paths": {
"@entities":["app/src/entities/index.ts"]
}
すべてのエンティティークラスをエンティティーフォルダーに配置し、index.tsファイルを作成して、index.tsファイルにエクスポートステートメントを追加します。
export * from './user.entity';
export * from './habit.entity';
エクスポート文が必要な順序で表示されていることを確認してください。インポートは次のようになります。
import { User, Habit } from '@entities';
バレルファイルの操作方法の詳細については、TypeScriptバレルファイルを検索してください。
NXを使用している場合は、エンティティをlibにして同じことを実行できます。
それはおそらく、すべてのエンティティファイルを一緒に移動し、モジュールとサービスのインポートを更新する必要があることを意味します。正確には理想的ではないかもしれませんが、すべてを1つのファイルに収めるよりも望ましいと思います。