Skip to content

Commit 44490dc

Browse files
fix(core): global module middleware should be executed first
1 parent d56553a commit 44490dc

File tree

2 files changed

+54
-16
lines changed

2 files changed

+54
-16
lines changed

integration/hello-world/e2e/middleware-execute-order.spec.ts

+44-12
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,46 @@
1-
import { INestApplication, MiddlewareConsumer, Module } from '@nestjs/common';
1+
import {
2+
Global,
3+
INestApplication,
4+
MiddlewareConsumer,
5+
Module,
6+
} from '@nestjs/common';
27
import { Test } from '@nestjs/testing';
38
import * as request from 'supertest';
49

510
const RETURN_VALUE_A = 'test_A';
611
const RETURN_VALUE_B = 'test_B';
12+
const RETURN_VALUE_X = 'test_X';
13+
const RETURN_VALUE_GLOBAL = 'test_GLOBAL';
714

8-
@Module({
9-
imports: [],
10-
})
15+
@Global()
16+
@Module({})
17+
class GlobalModule {
18+
configure(consumer: MiddlewareConsumer) {
19+
consumer
20+
.apply((req, res, next) => res.send(RETURN_VALUE_GLOBAL))
21+
.forRoutes('ping');
22+
}
23+
}
24+
25+
@Module({ imports: [GlobalModule] })
26+
class ModuleX {
27+
configure(consumer: MiddlewareConsumer) {
28+
consumer
29+
.apply((req, res, next) => res.send(RETURN_VALUE_X))
30+
.forRoutes('hello')
31+
.apply((req, res, next) => res.send(RETURN_VALUE_X))
32+
.forRoutes('ping');
33+
}
34+
}
35+
36+
@Module({ imports: [ModuleX] })
1137
class ModuleA {
1238
configure(consumer: MiddlewareConsumer) {
1339
consumer
14-
.apply((req, res, next) => {
15-
res.send(RETURN_VALUE_A);
16-
})
17-
.forRoutes('hello');
40+
.apply((req, res, next) => res.send(RETURN_VALUE_A))
41+
.forRoutes('hello')
42+
.apply((req, res, next) => res.send(RETURN_VALUE_A))
43+
.forRoutes('ping');
1844
}
1945
}
2046

@@ -24,10 +50,10 @@ class ModuleA {
2450
class ModuleB {
2551
configure(consumer: MiddlewareConsumer) {
2652
consumer
27-
.apply((req, res, next) => {
28-
res.send(RETURN_VALUE_B);
29-
})
30-
.forRoutes('hello');
53+
.apply((req, res, next) => res.send(RETURN_VALUE_B))
54+
.forRoutes('hello')
55+
.apply((req, res, next) => res.send(RETURN_VALUE_B))
56+
.forRoutes('ping');
3157
}
3258
}
3359

@@ -55,6 +81,12 @@ describe('Middleware (execution order)', () => {
5581
.expect(200, RETURN_VALUE_B);
5682
});
5783

84+
it('should execute global middleware first', () => {
85+
return request(app.getHttpServer())
86+
.get('/ping')
87+
.expect(200, RETURN_VALUE_GLOBAL);
88+
});
89+
5890
afterEach(async () => {
5991
await app.close();
6092
});

packages/core/middleware/middleware-module.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,16 @@ export class MiddlewareModule<
148148

149149
const entriesSortedByDistance = [...configs.entries()].sort(
150150
([moduleA], [moduleB]) => {
151-
return (
152-
this.container.getModuleByKey(moduleA)!.distance -
153-
this.container.getModuleByKey(moduleB)!.distance
154-
);
151+
const moduleARef = this.container.getModuleByKey(moduleA)!;
152+
const moduleBRef = this.container.getModuleByKey(moduleB)!;
153+
if (moduleARef.distance === Number.MAX_VALUE) {
154+
return -1;
155+
}
156+
if (moduleBRef.distance === Number.MAX_VALUE) {
157+
return 1;
158+
}
159+
160+
return moduleARef.distance - moduleBRef.distance;
155161
},
156162
);
157163
for (const [moduleRef, moduleConfigurations] of entriesSortedByDistance) {

0 commit comments

Comments
 (0)