Entitas TypeORM di NESTJS - Tidak dapat menggunakan pernyataan impor di luar modul

11

Memulai proyek baru dengan perintah 'nest new'. Bekerja dengan baik sampai saya menambahkan file entitas ke dalamnya.

Mendapat kesalahan berikut:

impor {Entity, Column, PrimaryGeneratedColumn} dari 'typeorm';

^^^^^^

SyntaxError: Tidak dapat menggunakan pernyataan impor di luar modul

Apa yang saya lewatkan?

Menambahkan Entitas ke Modul:

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 {}
Anton
sumber
impor {Modul} dari '@ nestjs / common';
Preston
@Preston peduli untuk menjelaskan apa yang Anda maksud? Apakah Anda harus membuat modul untuk file yang umum digunakan bersama?
Joshua de Leon
Apakah Anda mendapatkan kesalahan dari linter atau dari kompilasi? Di mana Anda memiliki file baru ini? Apakah itu di srcdirektori Anda ? Jika Anda menggunakan TypeORM, dapatkah Anda menunjukkan TypeOrmModuleimpor Anda AppModuledi importsarray 's ? Mungkin ada sesuatu yang salah dengan konfigurasi yang tidak dapat kita lihat
Jay McDoniel
posting diperbarui dengan info impor entitas
Anton

Jawaban:

20

Asumsi saya adalah bahwa Anda memiliki TypeormModulekonfigurasi dengan entitiesproperti yang terlihat seperti ini:

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

atau suka

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

Kesalahan yang Anda dapatkan adalah karena Anda mencoba mengimpor tsfile dalam jskonteks. Selama Anda tidak menggunakan paket web, Anda dapat menggunakan ini sebagai gantinya agar Anda mendapatkan file yang benar

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

di mana joindiimpor dari pathmodul. Sekarang __dirnameakan menyelesaikan srcatau distmenemukan masing-masing file tsatau yang diharapkan js. beri tahu saya jika masih ada masalah yang terjadi.

EDIT 1/10/2020

Di atas menganggap konfigurasi yang dilakukan adalah file yang kompatibel dengan javascript ( .jsatau dalam TypeormModule.forRoot()parameter yang diteruskan). Jika Anda menggunakan ormconfig.jsongantinya, Anda harus menggunakan

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

sehingga Anda menggunakan file js yang dikompilasi dan tidak memiliki kesempatan untuk menggunakan file ts dalam kode Anda.

Jay McDoniel
sumber
1
Tapi ini berantakan total. ORM naskah yang tidak menerima naskah untuk migrasi ...
Madeo
denoadalah satu-satunya pelari kode naskah asli. TypeORM, saat ini menggunakan TypeScript, masih berfungsi dengan Nodedan JavaScript runtime. Mungkin perbaikan dapat dilakukan untuk menerima tsfile dan mengkompilasinya ke dalam JavaScript di bawah tenda, kemudian menghapusnya sehingga pengguna akhir tidak melihatnya, tetapi itu perlu diangkat sebagai masalah pada repositori git TypeORM
Jay McDoniel
4

Seperti yang dijelaskan Jay McDoniel dalam jawabannya, masalahnya tampaknya adalah pola yang cocok dengan file entitas dalam ormconfig.jsonfile: Mungkin file naskah (modul) diimpor dari file javascript (mungkin file naskah skrip yang sebelumnya diubah).

Itu harus cukup untuk menghapus tspola gumpalan yang ada di ormconfig.json, sehingga TypeORM hanya akan memuat file javascript. Path ke file entitas harus relatif ke direktori kerja di mana node dieksekusi.

   "entities"   : [
      "dist/entity/**/*.js"
   ],
   "migrations" : [
      "dist/migration/**/*.js"
   ],
   "subscribers": [
      "dist/subscriber/**/*.js"
   ],
iY1NQ
sumber
The srcmungkin harus diubah untuk distseperti itulah di mana kode runnable adalah setelah transpiled ke javascript.
Jay McDoniel
Terima kasih, saya memperbarui jalurnya.
iY1NQ
2

Dalam dokumentasi TypeORM, saya menemukan bagian spesifik untuk naskah .

Bagian ini mengatakan:

Instal ts-node secara global:

npm install -g ts-node

Tambahkan perintah typeorm di bawah bagian skrip di package.json

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

Maka Anda dapat menjalankan perintah seperti ini:

npm run typeorm migration:run

Jika Anda perlu meneruskan parameter dengan skrip dash ke npm, Anda harus menambahkannya setelah -. Misalnya, jika Anda perlu membuat, perintahnya seperti ini:

npm run typeorm migration:generate -- -n migrationNameHere

Ini berfungsi dengan konfigurasi file saya:

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

Kemudian Anda dapat menjalankan perintah generate.

Fabio Cortez
sumber
ini seharusnya jawaban yang diterima
Nico Li
1

Anda perlu memiliki sesuatu.module.ts untuk setiap bagian aplikasi Anda. Ini bekerja seperti Angular. Ini adalah pengaturan dengan resolvers dan layanan GraphQL. REST agak berbeda dengan controller. Setiap modul mungkin akan memiliki entitas dan jika 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 {}
Preston
sumber
Luar biasa. Jadi apakah itu berarti Anda dapat memiliki entitas dasar yang dibagikan di beberapa modul atau apakah entitas dasar itu harus menjadi bagian dari semacam modul umum?
Joshua de Leon
Mungkin, seperti Angular, tetapi tidak pernah mencobanya.
Preston
Jika ini berhasil, silakan tandai sebagai jawabannya.
Preston
Saya pikir saya sudah mengimpor entitas ke modul. Silakan lihat posting yang diperbarui
Anton
1
Anton, jika Anda sudah menyelesaikan ini, silakan kirim solusi Anda ke SO.
Preston