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


11

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

'@ nestjs / common'에서 {모듈} 가져 오기;
Preston

@Preston은 무슨 뜻인지 자세히 설명하고 싶습니까? 일반적으로 공유되는 파일을위한 모듈을 만들어야합니까?
Joshua de Leon

린 터나 컴파일에서 오류가 발생합니까? 이 새 파일은 어디에 있습니까? 그것은 당신에 src디렉토리? TypeORM을 사용하는 경우 의 배열에 TypeOrmModule가져 오기 를 표시 할 수 있습니까? 우리가 볼 수없는 구성에 문제가있을 수 있습니다.AppModuleimports
Jay McDoniel

엔터티 가져 오기 정보로 업데이트 된 게시물
Anton

답변:


20

내 가정은 다음과 같은 속성을 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 파일을 사용할 기회가 없도록하십시오.


1
그러나 이것은 완전히 혼란입니다. 마이그레이션에 대한 타이프 스크립트를 허용하지 않는 타이프 스크립트 ORM ...
Madeo

deno유일한 기본 타입 스크립트 코드 러너입니다. TypeORMTypescript를 사용하는 동안에도 NodeJavaScript 런타임 과 함께 작동 합니다. ts파일 을 수락하고 파일을 JavaScript로 컴파일 한 다음 최종 사용자가 볼 수 없도록 파일을 삭제하도록 개선 할 수는 있지만 TypeORM git 저장소에서 문제로 제기되어야합니다
Jay McDoniel

4

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

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

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

src아마 변경해야 dist실행 가능한 코드가 자바 스크립트에 transpiled 후입니다 그건한다.
Jay McDoniel

감사합니다. 경로를 업데이트했습니다.
iY1NQ

2

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


이것은 정답입니다
Nico Li

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

우수한. 따라서 여러 모듈에서 기본 엔터티를 공유 할 수 있거나 해당 기본 엔터티가 일종의 공통 모듈의 일부 여야합니까?
Joshua de Leon

아마도 Angular와 같지만 결코 시도하지 않았습니다.
Preston

이것이 작동하면 답변으로 표시하십시오.
Preston

엔터티를 모듈로 이미 가져온 것 같습니다. 업데이트 된 게시물을보십시오
Anton

1
Anton, 이미 해결 한 경우 솔루션을 SO에 게시하십시오.
프레스턴
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.