diff --git a/integration/nest-application/global-prefix/e2e/global-prefix.spec.ts b/integration/nest-application/global-prefix/e2e/global-prefix.spec.ts index 74f8e9ad6fc..01973ed17fa 100644 --- a/integration/nest-application/global-prefix/e2e/global-prefix.spec.ts +++ b/integration/nest-application/global-prefix/e2e/global-prefix.spec.ts @@ -28,6 +28,10 @@ describe('Global prefix', () => { await request(server).get('/health').expect(404); await request(server).get('/api/v1/health').expect(200); + + await request(server) + .get('/api/v1') + .expect(200, 'Root: Data attached in middleware'); }); it(`should exclude the path as string`, async () => { diff --git a/integration/nest-application/global-prefix/src/app.controller.ts b/integration/nest-application/global-prefix/src/app.controller.ts index d826cd0dbc2..35444679426 100644 --- a/integration/nest-application/global-prefix/src/app.controller.ts +++ b/integration/nest-application/global-prefix/src/app.controller.ts @@ -2,6 +2,11 @@ import { Controller, Get, Post, Req } from '@nestjs/common'; @Controller() export class AppController { + @Get() + root(@Req() req): string { + return 'Root: ' + req.extras?.data; + } + @Get('hello/:name') getHello(@Req() req): string { return 'Hello: ' + req.extras?.data; diff --git a/packages/core/middleware/route-info-path-extractor.ts b/packages/core/middleware/route-info-path-extractor.ts index d8f17f5d954..caf3f0c6f42 100644 --- a/packages/core/middleware/route-info-path-extractor.ts +++ b/packages/core/middleware/route-info-path-extractor.ts @@ -35,11 +35,15 @@ export class RouteInfoPathExtractor { if (this.isAWildcard(path)) { const entries = versionPaths.length > 0 - ? versionPaths.map( - versionPath => + ? versionPaths + .map(versionPath => [ + this.prefixPath + versionPath, this.prefixPath + versionPath + addLeadingSlash(path), - ) - : [this.prefixPath + addLeadingSlash(path)]; + ]) + .flat() + : this.prefixPath + ? [this.prefixPath, this.prefixPath + addLeadingSlash(path)] + : [addLeadingSlash(path)]; return Array.isArray(this.excludedGlobalPrefixRoutes) ? [ diff --git a/packages/core/middleware/routes-mapper.ts b/packages/core/middleware/routes-mapper.ts index bd491277d89..ce8f3e9b0bf 100644 --- a/packages/core/middleware/routes-mapper.ts +++ b/packages/core/middleware/routes-mapper.ts @@ -20,6 +20,7 @@ import { Module } from '../injector/module'; import { MetadataScanner } from '../metadata-scanner'; import { PathsExplorer, RouteDefinition } from '../router/paths-explorer'; import { targetModulesByContainer } from '../router/router-module'; +import { RequestMethod } from '@nestjs/common'; export class RoutesMapper { private readonly pathsExplorer: PathsExplorer; @@ -46,7 +47,7 @@ export class RoutesMapper { } private getRouteInfoFromPath(routePath: string): RouteInfo[] { - const defaultRequestMethod = -1; + const defaultRequestMethod = RequestMethod.ALL; return [ { path: addLeadingSlash(routePath), diff --git a/packages/core/test/middleware/builder.spec.ts b/packages/core/test/middleware/builder.spec.ts index fa73acae66a..f3854a5bf1d 100644 --- a/packages/core/test/middleware/builder.spec.ts +++ b/packages/core/test/middleware/builder.spec.ts @@ -193,7 +193,7 @@ describe('MiddlewareBuilder', () => { expect(proxy.getExcludedRoutes()).to.be.eql([ { path, - method: -1 as any, + method: RequestMethod.ALL, }, ]); }); diff --git a/packages/core/test/middleware/route-info-path-extractor.spec.ts b/packages/core/test/middleware/route-info-path-extractor.spec.ts index 0255cb9227c..a836d4a0342 100644 --- a/packages/core/test/middleware/route-info-path-extractor.spec.ts +++ b/packages/core/test/middleware/route-info-path-extractor.spec.ts @@ -31,7 +31,7 @@ describe('RouteInfoPathExtractor', () => { method: RequestMethod.ALL, version: '1', }), - ).to.eql(['/v1/*']); + ).to.eql(['/v1', '/v1/*']); }); it(`should return correct paths when set global prefix`, () => { @@ -42,7 +42,7 @@ describe('RouteInfoPathExtractor', () => { path: '*', method: RequestMethod.ALL, }), - ).to.eql(['/api/*']); + ).to.eql(['/api', '/api/*']); expect( routeInfoPathExtractor.extractPathsFrom({ @@ -50,7 +50,7 @@ describe('RouteInfoPathExtractor', () => { method: RequestMethod.ALL, version: '1', }), - ).to.eql(['/api/v1/*']); + ).to.eql(['/api/v1', '/api/v1/*']); }); it(`should return correct paths when set global prefix and global prefix options`, () => { @@ -66,7 +66,7 @@ describe('RouteInfoPathExtractor', () => { path: '*', method: RequestMethod.ALL, }), - ).to.eql(['/api/*', '/foo']); + ).to.eql(['/api', '/api/*', '/foo']); expect( routeInfoPathExtractor.extractPathsFrom({ @@ -74,7 +74,7 @@ describe('RouteInfoPathExtractor', () => { method: RequestMethod.ALL, version: '1', }), - ).to.eql(['/api/v1/*', '/v1/foo']); + ).to.eql(['/api/v1', '/api/v1/*', '/v1/foo']); expect( routeInfoPathExtractor.extractPathsFrom({