[nestjs] NESTJS의 TypeORM 엔터티-모듈 외부에서 import 문을 사용할 수 없습니다

‘nest new’명령으로 새 프로젝트를 시작했습니다. 엔터티 파일을 추가 할 때까지 제대로 작동합니다.

다음 오류가 발생했습니다.

‘typeorm’에서 import {Entity, Column, PrimaryGeneratedColumn};

^^^^^^

구문 오류 : 모듈 외부에서 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}']

오류 tsjs컨텍스트 에서 파일 을 가져 오려고하기 때문에 발생합니다 . webpack을 사용하지 않는 한 올바른 파일을 얻을 수 있도록 대신 이것을 사용할 수 있습니다

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

여기서 모듈 join에서 가져옵니다 path. 지금 __dirname에 해결할 src또는 dist후 예상 검색 ts또는 js파일을 각각. 여전히 문제가 발생하면 알려주세요.

1/10/2020 수정

위의 구성은 자바 스크립트 호환 파일 ( .js또는 TypeormModule.forRoot()전달 된 매개 변수) 로 수행되었다고 가정합니다 . ormconfig.json대신 에 사용하는 경우

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

컴파일 된 js 파일을 사용하고 코드에서 ts 파일을 사용할 기회가 없도록하십시오.


답변

Jay McDoniel이 그의 답변에서 설명했듯이, 문제는 파일에서 엔티티 파일의 패턴 일치로 보인다 ormconfig.json: 아마도 타입 스크립트 파일 (모듈)은 자바 스크립트 파일 (아마도 이전에 변환 된 타입 스크립트 파일)에서 가져 오는 것 같습니다.

TypeORM이 자바 스크립트 파일 만로드 할 수 있도록 ts에서 기존 glob 패턴 을 제거하면 충분 ormconfig.json합니다. 엔티티 파일의 경로는 노드가 실행되는 작업 디렉토리에 상대적이어야합니다.

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


답변

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 명령을 실행할 수 있습니다.


답변

앱의 모든 섹션에 대해 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 {}


답변