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.69k stars 7.63k forks source link

Middleware applied twice using setGlobalPrefix excluding route "/" #11821

Closed alucebur closed 1 year ago

alucebur commented 1 year ago

Is there an existing issue for this?

Current behavior

Middleware is applied twice when using setGlobalPrefix with the route "/" excluded, for every route except "/".

Minimum reproduction code

https://codesandbox.io/p/sandbox/determined-ben-7357wt

Steps to reproduce

There are 4 routes; three of them are prefixed by "api" global prefix, and one is excluded ("/").

There is a middleware that logs the request, showing baseUrl and originalUrl from the petition.

When calling "/" route, middleware is executed once.

When calling any other route, middleware is executed twice, the last of them with baseUrl empty (check logs in the terminal).

If we edit the excluded route from "/" to "one", everything works as expected, being the middleware only executed once for every route.

Expected behavior

When setting a global prefix and excluding the route "/", the middleware is executed only once for every route in the application.

Package

Other package

No response

NestJS version

10.0.0

Packages versions

{
  "name": "nest-typescript-starter",
  "private": true,
  "version": "1.0.0",
  "description": "Nest TypeScript starter repository",
  "license": "MIT",
  "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": {
    "@nestjs/common": "^10.0.0",
    "@nestjs/core": "^10.0.0",
    "@nestjs/platform-express": "^10.0.0",
    "reflect-metadata": "^0.1.13",
    "rxjs": "^7.8.1"
  },
  "devDependencies": {
    "@nestjs/cli": "^10.0.1",
    "@nestjs/schematics": "^10.0.1",
    "@nestjs/testing": "^10.0.0",
    "@swc/cli": "^0.1.62",
    "@swc/core": "^1.3.64",
    "@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

16.17.0

In which operating systems have you tested?

Other

The issue has also been reproduced using Nest v9.4 and Node 18, under WSL.

micalevisk commented 1 year ago

this seems to be a regression introduced on PR #10390 (v9.3.2)

v9.3.0 went fine

kamilmysliwiec commented 1 year ago

Would you like to create a PR for this issue?

kamilmysliwiec commented 1 year ago

Let's track this here https://github.com/nestjs/nest/pull/11832

jr-dimedis commented 9 months ago

Any plan to merge the referenced PR? I hit this bug and was happy to see that there is a fix available but unfortunately it's not released yet.

Thanks!

jonasnilsberg commented 8 months ago

Any updates on this?