인프런 커뮤니티 질문&답변

education mmax님의 프로필 이미지

작성한 질문수

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

typeorm seeding, migration

npm run db:create 시에 발생하는 decorating 오류

24.10.04 11:59 작성

·

98

0

cli 통해서 db생성을 하면 migration 테이블이 생기지 않아서 오류를 들여다 봤더니 아래와 같은 오류가 생겼습니다.

ERROR
Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform.

 

데코레이터를 적용하는 과정에서의 이슈로 보이는데 수업 과정을 이수하는 시점까지 별다른 문제나 별개의 코드를 작성하지 않았기에 의문점이 있는 상태입니다.

 

오류가 발생하는 구간은 아래 코드와 같습니다.

at _initializerWarningHelper (C:/Users/user/Desktop/Study/nestjsbook/src/entities/Mentions.ts:12:1005)
at Mentions.<instance_members_initializer> (C:/Users/user/Desktop/Study/nestjsbook/src/entities/Mentions.ts:61:291)
at new Mentions (C:/Users/user/Desktop/Study/nestjsbook/src/entities/Mentions.ts:61:270)
at EntityMetadata.create (node_modules\src\metadata\EntityMetadata.ts:568:23)
at EntityMetadataValidator.validate (node_modules\src\metadata-builder\EntityMetadataValidator.ts:211:47)
at node_modules\src\metadata-builder\EntityMetadataValidator.ts:43:18
at Array.forEach (<anonymous>)
at EntityMetadataValidator.validateMany (node_modules\src\metadata-builder\EntityMetadataValidator.ts:42:25)
at DataSource.buildMetadatas (node_modules\src\data-source\DataSource.ts:730:33)
at processTicksAndRejections (node:internal/process/task_queues:95:5)


Mentions만에 문제인가 싶어서 Entities를 제거하고 다른 특정 하나(Users)의 Entity만 포함시켜서 실행했을 때도 동일한 오류를 뱉고 있어요.

tsconfig가 컴파일될 때, 제 때 동작이 안되는가 싶어 바벨을 설치해서 플러그인을 주입해도 동일한 현상이 발생되네요 ㅠㅠ 물론 tsconfig에 데코레이터 관련 옵션이 true이긴 합니다. emitDecoratorMetadata: true experimentalDecorators : true

script

"db:create": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs db:create -d ./dataSource.ts",
"db:drop": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs db:drop -d ./dataSource.ts",

참고로 db:drop시에는 오류가 없이 잘 동작합니다.

답변 2

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2024. 10. 04. 14:23

package.json 보여주셔야 할 것 같습니다. 라이브러리들 버전 이슈로 보입니다.

education mmax님의 프로필 이미지

2024. 10. 04. 14:40

{
  "name": "nestjsbook",
  "version": "0.0.1",
  "description": "",
  "author": "",
  "private": true,
  "license": "UNLICENSED",
  "scripts": {
    "build": "nest build",
    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
    "start": "nest start",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "node dist/main",
    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:cov": "jest --coverage",
    "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
    "test:e2e": "jest --config ./test/jest-e2e.json",
    "typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js",
    "db:create": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs db:create -d ./dataSource.ts",
    "db:drop": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs db:drop -d ./dataSource.ts",
    "seed": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs seed -d ./dataSource.ts",
    "schema:drop": "ts-node ./node_modules/typeorm/cli.js schema:drop",
    "schema:sync": "ts-node ./node_modules/typeorm/cli.js schema:sync",
    "db:migrate": "npm run typeorm migration:run -- -d ./dataSource.ts",
    "db:migrate:revert": "npm run typeorm migration:revert -- -d ./dataSource.ts",
    "db:create-migration": "npm run typeorm migration:create -- ./src/migrations/",
    "db:generate-migration": "npm run typeorm migration:generate -- ./src/migrations -d ./dataSource.ts"
  },
  "dependencies": {
    "@nestjs/common": "^10.4.4",
    "@nestjs/config": "^3.2.3",
    "@nestjs/core": "^10.4.4",
    "@nestjs/mapped-types": "*",
    "@nestjs/passport": "^10.0.3",
    "@nestjs/platform-express": "^10.0.0",
    "@nestjs/swagger": "^7.4.2",
    "@nestjs/typeorm": "^10.0.2",
    "bcrypt": "^5.1.1",
    "class-transformer": "^0.5.1",
    "class-validator": "^0.14.1",
    "cookie-parser": "^1.4.6",
    "express-session": "^1.18.0",
    "mysql2": "^3.11.3",
    "passport": "^0.7.0",
    "passport-local": "^1.0.0",
    "reflect-metadata": "^0.2.2",
    "rimraf": "^6.0.1",
    "rxjs": "^7.8.1",
    "swagger-ui-express": "^5.0.1",
    "typeorm": "^0.3.20",
    "typeorm-extension": "^3.6.1"
  },
  "devDependencies": {
    "@nestjs/cli": "^10.0.0",
    "@nestjs/schematics": "^10.0.0",
    "@nestjs/testing": "^10.0.0",
    "@types/express": "^4.17.17",
    "@types/jest": "^29.5.2",
    "@types/node": "^20.3.1",
    "@types/passport-local": "^1.0.38",
    "@types/supertest": "^6.0.0",
    "@typescript-eslint/eslint-plugin": "^8.0.0",
    "@typescript-eslint/parser": "^8.0.0",
    "eslint": "^8.42.0",
    "eslint-config-prettier": "^9.0.0",
    "eslint-plugin-prettier": "^5.0.0",
    "jest": "^29.5.0",
    "prettier": "^3.0.0",
    "source-map-support": "^0.5.21",
    "supertest": "^7.0.0",
    "ts-jest": "^29.1.0",
    "ts-loader": "^9.4.3",
    "ts-node": "^10.9.1",
    "tsconfig-paths": "^4.2.0",
    "typescript": "^5.1.3"
  },
  "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "rootDir": "src",
    "testRegex": ".*\\.spec\\.ts$",
    "transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },
    "collectCoverageFrom": [
      "**/*.(t|j)s"
    ],
    "coverageDirectory": "../coverage",
    "testEnvironment": "node"
  }
}

package.json 전달 드립니다 !

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2024. 10. 05. 12:51

이게 지금 타입스크립트와 엮어서 문제가 있는 것 같은데요.

npm run build를 해서 dist 폴더에 js 파일을 만든 뒤에 다음 명령어로 js 기반으로 생성하셔야 할 것 같습니다.

typeorm-extension db:create -d ./dist/dataSource.js

0

인프런 AI 인턴님의 프로필 이미지

2024. 10. 04. 12:01

안녕하세요, 인프런 AI 인턴입니다. education mmax님,

제공해주신 정보를 토대로 살펴본 결과, 발생하고 있는 오류는 주로 TypeScript 데코레이터를 사용하는 환경에서 발생할 수 있는 문제입니다. 특히, 데코레이터가 제대로 적용되지 않으면 이러한 문제가 발생할 수 있습니다. 이 에러는 바벨 환경에서 데코레이터를 사용할 때 설정이 부족하거나 잘못된 경우에 발생할 수 있습니다.

다음은 일반적으로 이러한 문제를 해결하기 위해 점검할 수 있는 사항입니다:

  1. tsconfig.json 파일 설정 확인:

    • experimentalDecorators: true
    • emitDecoratorMetadata: true
    • 위 옵션들이 설정되어 있는지 확인하세요. 이미 설정하셨다고 하셨으니 이 부분은 문제 없을 가능성이 있습니다.
  2. babel 설정 확인:

    • 바벨을 사용하여 컴파일 시, 필요한 플러그인이 잘 설정되어 있는지 확인하세요. @babel/plugin-proposal-decorators@babel/plugin-proposal-class-properties 플러그인이 필요합니다.
    • 설정 순서가 중요합니다. 데코레이터 플러그인이 클래스 속성 플러그인보다 먼저 적용되어야 합니다.
    • 바벨 설정 파일(.babelrc 또는 babel config // package.json의 babel 속성)에서 설정이 적용되고 있는지 확인하세요.
  3. 데코레이터 사용하는 방식 점검:

    • 모든 데코레이터가 올바르게 적용되었는지 확인하세요. 데코레이터의 순서나 위치에 따라 문제가 발생할 수 있습니다. 데코레이터가 선언된 위치와 대상이 올바른지 확인하세요.
  4. 엔티티 파일의 의존성 문제 확인:

    • 여러 엔티티가 동일하거나 상호 참조하는 경우, circular dependency 문제가 발생할 수 있습니다. 이런 문제는 가끔 데코레이터 적용에 영향을 미칠 수 있습니다. 필요한 경우 구조를 재검토하십시오.
  5. 이전 빌드 남아있을 가능성:

    • 불필요한 빌드 파일이 프로젝트에 남아 있을 수 있습니다. dist 디렉토리를 삭제하고 다시 빌드해보세요.

혹시 위 방법으로도 해결이 되지 않으면, 강의에서 제공된 코드와 본인의 코드를 비교하거나, 해당 강좌 내 다른 수강생의 유사 질문을 검토해보는 것도 좋은 방법입니다. 비슷한 상황에 대한 논의가 있을 수 있으니 확인해 보세요.

유사한 문제를 해결하며 자세한 도움을 드린 두 질문을 참고해주세요:
- DB 생성시 Error: Cannot find module ‘./index.js가 계속 뜨는데 뭐가 문제인가요??
- typeorm을 통해 db 생성을 하려고 하는데 에러가 발생합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.