@@ -23,43 +23,64 @@ export class ExpressLoader extends AbstractLoader {
23
23
) ;
24
24
loadPackage ( 'express-formidable' , '@admin-bro/nestjs' ) ;
25
25
26
+ let router ;
27
+
28
+ if ( 'auth' in options ) {
29
+ loadPackage ( 'express-session' , '@admin-bro/nestjs' ) ;
30
+ router = adminBroExpressjs . buildAuthenticatedRouter (
31
+ admin , options . auth , undefined , options . sessionOptions , options . formidableOptions
32
+ ) ;
33
+ } else {
34
+ router = adminBroExpressjs . buildRouter ( admin , undefined , options . formidableOptions ) ;
35
+ }
36
+
37
+ app . use ( options . adminBroOptions . rootPath , router ) ;
38
+ this . reorderRoutes ( app , options ) ; 980
39
+ }
40
+
41
+ private reorderRoutes ( app , options ) {
26
42
let jsonParser ;
27
43
let urlencodedParser ;
44
+ let admin ;
28
45
29
46
// Nestjs uses bodyParser under the hood which is in conflict with admin-bro setup.
30
47
// Due to admin-bro-expressjs usage of formidable we have to move body parser in layer tree after admin-bro init.
31
48
// Notice! This is not documented feature of express, so this may change in the future. We have to keep an eye on it.
32
49
if ( app && app . _router && app . _router . stack ) {
33
- const jsonParserIndex = app . _router . stack . findIndex ( layer => layer . name === 'jsonParser' ) ;
50
+ const jsonParserIndex = app . _router . stack . findIndex (
51
+ ( layer : { name : string } ) => layer . name === 'jsonParser'
52
+ ) ;
34
53
if ( jsonParserIndex >= 0 ) {
35
54
jsonParser = app . _router . stack . splice ( jsonParserIndex , 1 ) ;
36
55
}
37
56
38
- const urlencodedParserIndex = app . _router . stack . findIndex ( layer => layer . name === 'urlencodedParser' ) ;
57
+ const urlencodedParserIndex = app . _router . stack . findIndex (
58
+ ( layer : { name : string } ) => layer . name === 'urlencodedParser'
59
+ ) ;
39
60
if ( urlencodedParserIndex >= 0 ) {
40
61
urlencodedParser = app . _router . stack . splice ( urlencodedParserIndex , 1 ) ;
41
62
}
42
- }
43
-
44
- let router ;
45
63
46
- if ( 'auth' in options ) {
47
- loadPackage ( 'express-session' , '@admin-bro/nestjs' ) ;
48
- router = adminBroExpressjs . buildAuthenticatedRouter (
49
- admin , options . auth , undefined , options . sessionOptions , options . formidableOptions
50
- ) ;
51
- } else {
52
- router = adminBroExpressjs . buildRouter ( admin , undefined , options . formidableOptions ) ;
53
- }
54
-
55
- app . use ( options . adminBroOptions . rootPath , router ) ;
64
+ const adminIndex = app . _router . stack . findIndex ( ( layer : { regexp : RegExp } ) =>
65
+ layer . regexp . toString ( ) . includes ( options . adminBroOptions . rootPath ) ,
66
+ )
67
+ if ( adminIndex >= 0 ) {
68
+ admin = app . _router . stack . splice ( adminIndex , 1 )
69
+ }
56
70
57
- if ( jsonParser ) {
58
- app . _router . stack . push ( ...jsonParser ) ;
59
- }
71
+ // if admin-bro-nestjs didn't reorder the middleware
72
+ // the body parser would have come after corsMiddleware
73
+ const corsIndex = app . _router . stack . findIndex (
74
+ ( layer : { name : string } ) => layer . name === 'corsMiddleware' ,
75
+ )
60
76
61
- if ( urlencodedParser ) {
62
- app . _router . stack . push ( ...urlencodedParser ) ;
77
+ app . _router . stack . splice (
78
+ corsIndex >= 0 ? corsIndex + 1 : app . _router . stack . length ,
79
+ 0 ,
80
+ ...admin ,
81
+ ...jsonParser ,
82
+ ...urlencodedParser ,
83
+ )
63
84
}
64
85
}
65
86
}
0 commit comments