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


11

「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 {}

'@ nestjs / common'から{Module}をインポートします。
プレストン

@プレストンはあなたが何を意味するかについて詳しく説明しますか?一般的に共有されるファイルのモジュールを作成する必要がありますか?
ジョシュアデレオン

エラーはリンターからですか、それともコンパイルからですか?この新しいファイルはどこにありますか?それはあなたのsrcディレクトリにありますか?TypeORMを使用している場合TypeOrmModuleAppModuleimports配列にインポートを表示できますか?見えない構成に問題がある可能性があります
Jay McDoniel

エンティティのインポート情報を含む更新された投稿
アントン

回答:


20

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

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

またはのように

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

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

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

どこjoinから輸入されるpathモジュール。今すぐ__dirnameに解決されますsrcdist、次に期待見つけるtsか、jsそれぞれのファイルを。引き続き問題が発生する場合はお知らせください。

2020年1月10日の編集

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

entities: ['dist/**/*.entity.js']

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


1
しかし、これは完全に混乱しています。移行のためのtypescriptを受け付けないtypescript ORM ...
Madeo

deno唯一のネイティブtypescriptコードランナーです。TypeORMは、Typescriptを使用しNodeていますが、JavaScriptランタイムでも動作します。tsファイルを受け入れて内部でJavaScriptにコンパイルし、エンドユーザーに表示されないようにファイルを削除するように改善できるかもしれませんが、TypeORM gitリポジトリの問題として取り上げる必要があります
Jay

4

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

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

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

srcおそらくに変更する必要がありますdist実行可能なコードはJavaScriptにtranspiledされた後、ここでそれはだとして。
ジェイマクドニエル

おかげで、私はパスを更新しました。
iY1NQ

2

TypeORMのドキュメントでは、私はのための特定のセクション見つかった活字体を

このセクションは言う:

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コマンドを実行できます。


これは受け入れられる答えになるはずです
ニコ・リ

1

アプリのすべてのセクションに、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 {}

優秀な。それでは、複数のモジュール間でベースエンティティを共有できるということですか、それともそのベースエンティティを一種のCommonsモジュールの一部にする必要があるのでしょうか。
ジョシュア・デ・レオン

おそらく、Angularのようですが、試したことはありません。
プレストン

これが機能する場合は、それを回答としてマークしてください。
プレストン

エンティティをすでにモジュールにインポートしていると思います。更新された投稿をご覧ください
アントン

1
アントン、これをすでに解決している場合は、ソリューションをSOに投稿してください。
プレストン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.