nestjs / nest

A progressive Node.js framework for building efficient, scalable, and enterprise-grade server-side applications with TypeScript/JavaScript 🚀
https://nestjs.com
MIT License
67.11k stars 7.56k forks source link

Fastify with TypeORM with @Body() undefined #13146

Closed trentsgustavo closed 8 months ago

trentsgustavo commented 8 months ago

Is there an existing issue for this?

Current behavior

When using NestJS with Fastify and add TypeORM module, the @Body() decorator change to undefined and the body gets empty on Swagger

Minimum reproduction code

https://github.com/trentsgustavo/error-typeorm

Steps to reproduce

1 npm i 2 npm run start:debug 3 Do a request to /auth 4 Open swagger on http://localhost:3001, see empty body on /auth route

Expected behavior

When comment TypeORM Module, @Body() gets data, when uncomment @Body() is undefined

Package

Other package

@nestjs/typeorm

NestJS version

10.0.0

Packages versions


{
  "name": "error-type-orm",
  "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"
  },
  "dependencies": {
    "@fastify/static": "^6.12.0",
    "@nestjs/axios": "^3.0.1",
    "@nestjs/common": "^10.0.0",
    "@nestjs/config": "^3.1.1",
    "@nestjs/core": "^10.0.0",
    "@nestjs/platform-express": "^10.0.0",
    "@nestjs/platform-fastify": "^10.3.1",
    "@nestjs/swagger": "^7.2.0",
    "@nestjs/typeorm": "^10.0.1",
    "class-validator": "^0.14.1",
    "mssql": "^10.0.2",
    "pg": "^8.11.3",
    "reflect-metadata": "^0.1.13",
    "rxjs": "^7.8.1",
    "typeorm": "^0.3.20"
  },
  "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/supertest": "^2.0.12",
    "@typescript-eslint/eslint-plugin": "^5.59.11",
    "@typescript-eslint/parser": "^5.59.11",
    "eslint": "^8.42.0",
    "eslint-config-prettier": "^8.8.0",
    "eslint-plugin-prettier": "^4.2.1",
    "jest": "^29.5.0",
    "prettier": "^2.8.8",
    "source-map-support": "^0.5.21",
    "supertest": "^6.3.3",
    "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"
  }
}

Node.js version

18.19.0

In which operating systems have you tested?

Other

No response

micalevisk commented 8 months ago

I managed to reproduce the issue by having the TypeOrmModule class somewhere in the code like this:

image

so it's not a bug on TypeOrmModule itself but rather some circular import introduced by @nestjs/typeorm, I guess :thinking: pretty weird. That happens even if we import that class from '@nestjs/typeorm/dist/typeorm.module'

Also, that isn't related with Fastify adapter. It behaves the same with Express.

I've no ideia on what's happening so far.

jackbaron commented 8 months ago

I have similar problem

23431 commented 8 months ago

me too, I have similar problem

kamilmysliwiec commented 8 months ago

Not sure but it sounds like it might be related to the reflect-metadata package https://github.com/nestjs/nest/issues/13107#issuecomment-1919948793 (incompatibility between versions)?

micalevisk commented 8 months ago

yep, that's due to reflect-metadata.

A quick solution is to pin the version of typeorm to v0.3.19

image

As a general suggestion: be careful when upgrading packages that are under v0, guys. Make sure you're using lock files.

kamilmysliwiec commented 8 months ago

I'm wondering if we should change the peer dependency restriction of NestJS packages to not allow ^0.2.1 yet (just pin it to 0.1 instead) to avoid packages hoisting

trentsgustavo commented 8 months ago

Thanks @micalevisk the solution worked for me, in my case was a new project, so i followed the docs. But for sure is always a good practice to lock files