NESTJS'de TypeORM Varlığı - İçe aktarma deyimi modül dışında kullanılamaz


11

'Nest new' komutuyla yeni bir proje başlattı. Ben varlık dosyasını eklemek kadar iyi çalışır.

Aşağıdaki hatayı aldım:

'typeorm' öğesinden içe aktarma {Entity, Column, PrimaryGeneratedColumn};

^^^^^^

Sözdizimi Hatası: İçe aktarma ifadesi modül dışında kullanılamaz

Neyi özledim?

Modüle Varlık Ekleme:

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

{Module} '@ nestjs / common' öğesinden içe aktarın;
Preston

@Preston ne demek istediğine dikkat etmeli mi? Yaygın olarak paylaşılan dosyalar için bir modül oluşturmanız gerekiyor mu?
Joshua de Leon

Hatayı linterinizden veya bir derlemeden mi alıyorsunuz? Bu yeni dosyanız nerede? Sizin de mi srcdizine? TypeORM kullanıyorsanız, TypeOrmModuleiçe aktarma işleminizi AppModule' importsdizisinde gösterebilir misiniz ?
Göremediğimiz

varlık içe aktarma bilgisi ile güncellenmiş yayın
Anton

Yanıtlar:


20

Benim varsayım şu gibi TypeormModulebir entitiesözellik ile bir yapılandırma var :

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

veya benzeri

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

Aldığınız hata ts, bir jsiçeriği bir bağlamda içe aktarmaya çalıştığınız içindir . Web paketini kullanmadığınız sürece bunu kullanabilirsiniz, böylece doğru dosyaları alabilirsiniz

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

burada joinithal pathmodülü. Şimdi __dirnamesonucuna varılır srcveya distdaha sonra beklenen bulmak tsveya jsdosya sırasıyla. hala bir sorun olup olmadığını bana bildirin.

1/10/2020 DÜZENLE

Yukarıdaki yapılandırma, JavaScript ile uyumlu bir dosya ( .jsveya TypeormModule.forRoot()geçirilen parametrelerde) yapıldığını varsayar . ormconfig.jsonBunun yerine bir

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

Böylece derlenmiş js dosyalarını kullanıyorsunuz ve kodunuzdaki ts dosyalarını kullanma şansınız yok.


1
Ama bu tam bir karmaşa. Taşımacılık için daktilo kabul etmeyen bir daktilo ORM ...
Madeo

denoyalnızca yerel dizgi kodu çalıştırıcısıdır. TypeORM, Typescript'i kullanırken, yine Nodede JavaScript çalışma zamanı ile çalışır . Belki de tsdosyaları kabul etmek ve bunları başlık altında JavaScript'e derlemek için iyileştirmeler yapılabilir , daha sonra bunları son kullanıcının görmemesi için silin, ancak bunun TypeORM git deposunda bir sorun olarak ortaya çıkarılması gerekir
Jay McDoniel

4

Jay McDoniel'in cevabında açıkladığı gibi, problem ormconfig.jsondosyadaki varlık dosyalarının desen eşleşmesi gibi görünüyor : Muhtemelen bir javascript dosyasından (muhtemelen daha önce aktarılan bir daktilo dosyası) bir daktilo dosyası (modül) içe aktarılıyor.

Varolan bir tsglob desenini kaldırmak yeterli olmalıdır ormconfig.json, böylece TypeORM yalnızca javascript dosyalarını yükleyecektir. Varlık dosyalarının yolu, düğümün yürütüldüğü çalışma dizinine göreli olmalıdır.

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

Büyük srcolasılıkla distçalıştırılabilir kod javascript'e aktarıldıktan sonra olduğu gibi değiştirilmelidir.
Jay McDoniel

Teşekkürler, yolları güncelledim.
iY1NQ

2

TypeORM belgelerinde, i belirli bir bölümü bulunan typescript .

Bu bölüm diyor ki:

Ts-node'u global olarak kurun:

npm install -g ts-node

Package.json dosyasındaki komut dosyaları bölümüne typeorm komutu ekle

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

Sonra komutu şu şekilde çalıştırabilirsiniz:

npm run typeorm migration:run

Parametreyi tire - npm betiği ile geçirmeniz gerekiyorsa, - parametresinden sonra eklemeniz gerekir. Örneğin, oluşturmanız gerekiyorsa, komut aşağıdaki gibidir:

npm run typeorm migration:generate -- -n migrationNameHere

Bu benim dosya yapılandırma ile çalışır:

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

Daha sonra create komutunu çalıştırabilirsiniz.


kabul edilen cevap bu olmalı
Nico Li

1

Uygulamanızın her bölümü için bir şey var. Modül.ts. Angular gibi çalışır. Bu GraphQL çözücüler ve servis ile ayarlanır. REST bir kontrolörle biraz farklıdır. Her modülün muhtemelen bir varlığı olacaktır ve GraphQL ise 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 {}

Mükemmel. Yani bu, birden fazla modül arasında paylaşılan bir temel varlığa sahip olabileceğiniz anlamına mı geliyor yoksa bu temel varlığın ortak bir tür modülün parçası olması mı gerekiyor?
Joshua de Leon

Muhtemelen, Angular gibi, ama asla denemedim.
Preston

Bu işe yararsa lütfen cevap olarak işaretleyin.
Preston

Varlığı modüle zaten aktardığımı düşünüyorum. Lütfen güncellenmiş
Anton

1
Anton, bunu zaten çözdüyseniz, lütfen çözümünüzü SO'ya gönderin.
Preston
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.