web-dev-qa-db-ja.com

import statementはconfig.jsonファイルを介して登録されたときにTypeORM Enititiesを分割する

公式ドキュメントの後、私は小さなKOA/typeorm/Postgresアプリを作成しました。 Configを使用してcreateConnectionを使用していたときは、同じファイル内のエンティティのインポートアプリは正常に機能していましたが、TypeORM CLI Coudは設定ファイルを見つけてください。これでこのエラーが発生します。

SyntaxError: Cannot use import statement outside a module _

TypeORMがES6機能を使用できないように見えます。

私の ormconfig.json

{
  "type": "postgres",
  "Host": "localhost",
  "port": 5432,
  "username": ****,
  "password": ****,
  "database": ****,
  "synchronize": true,
  "entities": ["src/entity/**/*.ts"],
  "migrations": ["src/migration/**/*.ts"],
  "subscribers": ["src/subscriber/**/*.ts"],
  "cli": {
    "entitiesDir": "src/entity",
    "migrationsDir": "src/migration",
    "subscribersDir": "src/subscriber"
  }
}
 _

私の tsconfig.json

{
  "compilerOptions": {
    "lib": ["es5", "es6"],
    "target": "es6",
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "./dist",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
  },
  "exclude": ["node_modules"]
}
 _

エラー付きのファイル:

import {
  BaseEntity,
  Column,
  Entity,
  PrimaryGeneratedColumn,
  CreateDateColumn,
  ManyToOne
} from 'typeorm';
import { IsIn, IsPositive, IsNotEmpty } from 'class-validator';

import { LOAN_TYPE } from '../consts';
import { User } from './user';

@Entity('loans')
export class Loan extends BaseEntity {
  @PrimaryGeneratedColumn()
  public id: number;

  @CreateDateColumn({ type: 'timestamp' })
  public createdAt: Date;

  @Column()
  @IsNotEmpty()
  @IsPositive()
  public amount: number;

  @Column({ type: 'enum', enum: LOAN_TYPE })
  @IsNotEmpty()
  @IsIn(Object.values(LOAN_TYPE))
  public type: LOAN_TYPE;

  @Column({ default: false })
  public approvalStatus: boolean;

  @ManyToOne(type => User, user => user.loans)
  @IsNotEmpty()
  public user: User;
}

export default Loan;

 _
7
vvAve

問題は、エンティティをロードするだけでなく、移行者や購読者にも発生します。

あなたのアプリは、事前コンパイルされた.tsファイル上のエンティティ、移行および購読者のファイルを探しています。そのため、ファイルにはNodeJSが理解できない「インポート」が含まれているため、エラーの原因です。

TypeScriptがコードをコンパイルするときは、すべてのインポートを必要とする(ノードで理解されます)。

そのため、エラーを停止するには、設定をormconfig.jsonに設定する必要があります。

{
  "type": "postgres",
  "Host": "localhost",
  "port": 5432,
  "username": ****,
  "password": ****,
  "database": ****,
  "synchronize": true,
  "entities": ["dist/entity/**/*.js"],
  "migrations": ["dist/migration/**/*.js"],
  "subscribers": ["dist/subscriber/**/*.js"],
  "cli": {
    "entitiesDir": "src/entity",
    "migrationsDir": "src/migration",
    "subscribersDir": "src/subscriber"
  }
}
 _
1

自動負荷エンティティ 、その回答はNESTJS + TITILOMに適合します。

接続オプションのアレイを手動で追加する接続オプションの配列は面倒です。さらに、ルートモジュールからエンティティを参照すると、アプリケーションドメインの境界が分割され、実装の詳細がアプリケーションの他の部分に発生します。この問題を解決するために、静的グロブパスを使用することができます(例えば、dist/**/*。entity {.ts、.js})。

ただし、globパスはWebPackではサポートされていないため、モノレポ内でアプリケーションを構築している場合は、それらを使用することはできません。この問題に対処するために、代替の解決策が提供されます。エンティティを自動的にロードするには、以下に示すように、構成オブジェクトのAutoLoadEntitiesプロパティ(forroot()メソッドに渡す)をtrueに設定します。

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      ...
      autoLoadEntities: true,
    }),
  ],
})
export class AppModule {}
 _

そのオプションを指定して、forFeature()メソッドを介して登録されているすべてのエンティティは、設定オブジェクトのエンティティ配列に自動的に追加されます。

そして、必ずエンティティDIST/SRCの正しいカタログパスを使用してください。と最新のNESTJSとTITILOM Ver。

0
Max Sherbakov