web-dev-qa-db-ja.com

NESTJSのTypeORMエンティティ-モジュールの外部ではimportステートメントを使用できません

「nest new」コマンドで新しいプロジェクトを開始しました。エンティティファイルを追加するまで問題なく動作します。

次のエラーが発生しました:

'typeorm'から{Entity、Column、PrimaryGeneratedColumn}をインポートします。

^^^^^^

SyntaxError:モジュールの外部ではimportステートメントを使用できません

私は何を見逃していますか?

モジュールへのエンティティの追加:

import { Module } from '@nestjs/common';
import { BooksController } from './books.controller';
import { BooksService } from './books.service';
import { BookEntity } from './book.entity';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [TypeOrmModule.forFeature([BookEntity])],
  controllers: [BooksController],
  providers: [BooksService],
})
export class BooksModule {}

app.module.ts:

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Connection } from 'typeorm';
import { BooksModule } from './books/books.module';

@Module({
  imports: [TypeOrmModule.forRoot()],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
9
Anton

私の想定では、次のようなTypeormModuleプロパティを持つentities構成があるとします。

_entities: ['src/**/*.entity.{ts,js}']
_

またはのように

_entities: ['../**/*.entity.{ts,js}']
_

発生しているエラーは、tsコンテキストでjsファイルをインポートしようとしているためです。 Webpackを使用していない限り、これを代わりに使用して正しいファイルを取得できます。

_entities: [join(__dirname, '**', '*.entity.{ts,js}`)]
_

ここで、joinpathモジュールからインポートされます。これで___dirname_はsrcまたはdistに解決され、予想されるtsまたはjsファイルをそれぞれ検索します。引き続き問題が発生する場合はお知らせください。

2020年1月10日の編集

上記は、設定がJavaScript互換ファイル(_.js_またはTypeormModule.forRoot()渡されたパラメーター)で行われることを前提としています。代わりに_ormconfig.json_を使用している場合は、

_entities: ['dist/**/*.entity.js']
_

コンパイルされたjsファイルを使用していて、コードでtsファイルを使用する機会がないようにします。

11
Jay McDoniel

Jay McDonielが彼の回答で説明したように、問題はormconfig.jsonファイル内のエンティティファイルのパターンマッチングにあるようです:おそらくTypeScriptファイル(モジュール)がJavaScriptファイル(おそらく以前に変換されたTypeScriptファイル)からインポートされます。

TypeORMがJavaScriptファイルのみをロードするように、ormconfig.jsonの既存のtsグロブパターンを削除するだけで十分です。エンティティファイルへのパスは、nodeが実行される作業ディレクトリからの相対パスである必要があります。

   "entities"   : [
      "dist/entity/**/*.js"
   ],
   "migrations" : [
      "dist/migration/**/*.js"
   ],
   "subscribers": [
      "dist/subscriber/**/*.js"
   ],
3
iY1NQ

アプリのすべてのセクションに、something.module.tsが必要です。 Angularのように動作します。これは、GraphQLリゾルバーとサービスでセットアップされます。 RESTはコントローラによって少し異なります。各モジュールにはおそらくエンティティがあり、GraphQLの場合はprojects.schema.graphqlです。

projects.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ProjectsService } from './projects.service';
import { Projects } from './projects.entity';

import { ProjectsResolvers } from './projects.resolvers';

@Module({
  imports: [
    TypeOrmModule.forFeature([Projects])],
  providers: [
    ProjectsService,
    ProjectsResolvers
  ],

})

export class ProjectsModule {}
1
Preston

TypeORMのドキュメントで、 TypeScript の特定のセクションを見つけました。

このセクションは言う:

Ts-nodeをグローバルにインストールします。

npm install -g ts-node

Package.jsonのスクリプトセクションの下にtypeormコマンドを追加します。

"scripts" {
    ...
    "typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js"    
}

次に、次のようなコマンドを実行します。

npm run typeorm migration:run

ダッシュ付きのパラメーターをnpmスクリプトに渡す必要がある場合は、それらを-の後に追加する必要があります。たとえば、生成する必要がある場合、コマンドは次のようになります。

npm run typeorm migration:generate -- -n migrationNameHere

これは私のファイル構成で動作します:

{
    "type": "postgres",
    "Host": "yourhost",
    "port": 5423,
    "username": "username",
    "password": "password",
    "database": "your_db",
    "synchronize": true,
    "entities": [
        "src/modules/**/*.entity.{ts,js}"
    ],
    "migrations": [
        "src/migrations/**/*.{ts,js}"
    ],
    "cli": {
        "entitiesDir": "src/modules",
        "migrationsDir": "src/migrations"
    }
}

次に、generateコマンドを実行できます。

0
Fabio Cortez