「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 {}
私の想定では、次のようなTypeormModule
プロパティを持つentities
構成があるとします。
_entities: ['src/**/*.entity.{ts,js}']
_
またはのように
_entities: ['../**/*.entity.{ts,js}']
_
発生しているエラーは、ts
コンテキストでjs
ファイルをインポートしようとしているためです。 Webpackを使用していない限り、これを代わりに使用して正しいファイルを取得できます。
_entities: [join(__dirname, '**', '*.entity.{ts,js}`)]
_
ここで、join
はpath
モジュールからインポートされます。これで___dirname
_はsrc
またはdist
に解決され、予想されるts
またはjs
ファイルをそれぞれ検索します。引き続き問題が発生する場合はお知らせください。
上記は、設定がJavaScript互換ファイル(_.js
_またはTypeormModule.forRoot()
渡されたパラメーター)で行われることを前提としています。代わりに_ormconfig.json
_を使用している場合は、
_entities: ['dist/**/*.entity.js']
_
コンパイルされたjsファイルを使用していて、コードでtsファイルを使用する機会がないようにします。
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"
],
アプリのすべてのセクションに、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 {}
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コマンドを実行できます。