@@ -26,17 +26,31 @@ import { isValid, parseBoolean } from './utils';
26
26
import { addRoute , BriskControllerError , reInitRouter , isFormData , isJson , isXml , router , setBaseUrl , isFile } from './router' ;
27
27
import { getBean , setBean } from 'brisk-ioc' ;
28
28
29
+ export interface BriskControllerHooks {
30
+ priority : number ;
31
+ handler : ( ) => Promise < void > | void ;
32
+ }
29
33
30
34
// 保存运行时region
31
35
const globalVal : {
32
36
_briskControllerRegion ?: symbol ,
37
+ _briskControllerBefores ?: BriskControllerHooks [ ] ,
38
+ _briskControllerAfters ?: BriskControllerHooks [ ] ,
33
39
[ key : string | symbol | number ] : any ,
34
40
} = globalThis ;
35
41
36
42
if ( ! globalVal . _briskControllerRegion ) {
37
43
globalVal . _briskControllerRegion = Symbol ( 'briskController' ) ;
38
44
}
39
45
46
+ if ( ! globalVal . _briskControllerBefores ) {
47
+ globalVal . _briskControllerBefores = [ ] ;
48
+ }
49
+
50
+ if ( ! globalVal . _briskControllerAfters ) {
51
+ globalVal . _briskControllerAfters = [ ] ;
52
+ }
53
+
40
54
41
55
const logger = getLogger ( globalVal . _briskControllerRegion ) ;
42
56
logger . configure ( {
@@ -45,6 +59,22 @@ logger.configure({
45
59
} ) ;
46
60
47
61
62
+ const sortBy = ( hookA : BriskControllerHooks , hookB : BriskControllerHooks ) => hookA . priority - hookB . priority ;
63
+
64
+ // 添加钩子
65
+ export function addHook ( pos : 'before_start' | 'after_start' , hook : BriskControllerHooks ) {
66
+ switch ( pos ) {
67
+ case 'before_start' :
68
+ globalVal . _briskControllerBefores ?. push ( hook ) ;
69
+ break ;
70
+ case 'after_start' :
71
+ globalVal . _briskControllerAfters ?. push ( hook ) ;
72
+ break ;
73
+ default :
74
+ break ;
75
+ }
76
+ }
77
+
48
78
/**
49
79
* 抛出错误响应
50
80
* @deprecated
@@ -137,15 +167,15 @@ function validateAndTransParameter(param: BriskControllerParameter, value: any):
137
167
const timestamp = Date . parse ( value ) ;
138
168
// 无法转换成日期
139
169
if ( Number . isNaN ( timestamp ) ) {
140
- logger . error ( `validateAndTransParameter param '${ param . name } ' type error` ) ;
170
+ logger . error ( `validateAndTransParameter param '${ param . name } ' type ' ${ param . type } ' error` ) ;
141
171
throwError ( 400 , `param '${ param . name } ' type error` ) ;
142
172
}
143
173
return new Date ( timestamp ) ;
144
174
}
145
175
146
176
if ( getParentTypeKind ( param . type ) === 'Array' ) {
147
177
if ( ! Array . isArray ( value ) ) {
148
- logger . error ( `validateAndTransParameter param '${ param . name } ' type error` ) ;
178
+ logger . error ( `validateAndTransParameter param '${ param . name } ' type ' ${ param . type } ' error` ) ;
149
179
throwError ( 400 , `param '${ param . name } ' type error` ) ;
150
180
}
151
181
return value . map ( ( item : any ) => validateAndTransParameter ( { ...param , type : getSubTypeKind ( param . type ) as TypeKind } , item ) ) ;
@@ -157,21 +187,21 @@ function validateAndTransParameter(param: BriskControllerParameter, value: any):
157
187
}
158
188
159
189
if ( typeof value !== 'string' ) {
160
- logger . error ( `validateAndTransParameter param '${ param . name } ' type error` ) ;
190
+ logger . error ( `validateAndTransParameter param '${ param . name } ' type ' ${ param . type } ' error` ) ;
161
191
throwError ( 400 , `param '${ param . name } ' type error` ) ;
162
192
}
163
193
switch ( param . type ) {
164
194
case 'string' :
165
195
return value ;
166
196
case 'number' :
167
197
if ( Number . isNaN ( Number ( value ) ) ) {
168
- logger . error ( `validateAndTransParameter param '${ param . name } ' type error` ) ;
198
+ logger . error ( `validateAndTransParameter param '${ param . name } ' type ' ${ param . type } ' error` ) ;
169
199
throwError ( 400 , `param '${ param . name } ' type error` ) ;
170
200
}
171
201
return Number ( value ) ;
172
202
case 'boolean' :
173
203
if ( parseBoolean ( value ) === undefined ) {
174
- logger . error ( `validateAndTransParameter param '${ param . name } ' type error` ) ;
204
+ logger . error ( `validateAndTransParameter param '${ param . name } ' type ' ${ param . type } ' error` ) ;
175
205
throwError ( 400 , `param '${ param . name } ' type error` ) ;
176
206
}
177
207
return parseBoolean ( value ) ;
@@ -181,18 +211,19 @@ function validateAndTransParameter(param: BriskControllerParameter, value: any):
181
211
}
182
212
183
213
if ( ! isLike < any > ( value , param . type ) ) {
184
- logger . error ( `validateAndTransParameter param '${ param . name } ' type error` ) ;
214
+ logger . error ( `validateAndTransParameter param '${ param . name } ' type ' ${ param . type } ' error` ) ;
185
215
throwError ( 400 , `param '${ param . name } ' type error` ) ;
186
216
}
187
217
188
218
const typedes = get ( param . type ) ;
189
219
190
220
// 枚举直接返回
191
- if ( typedes . enums ) {
221
+ if ( typedes ? .enums ) {
192
222
return value ;
193
223
}
194
224
195
- return typedes . properties . reduce ( ( pre , current ) => {
225
+ // 消毒处理,仅转换类型描述里的属性,多余属性自动过滤掉
226
+ return typedes ?. properties . reduce ( ( pre , current ) => {
196
227
pre [ current . key ] = value [ current . key ] ;
197
228
return pre ;
198
229
} , { } as any ) ;
@@ -380,7 +411,7 @@ export async function start(port: number = 3000, option?: BriskControllerOption)
380
411
381
412
if ( option ?. swagger ) {
382
413
addRequest ( '/swagger.json' , getSwaggerHandler ( realPort , globalBaseUrl ) , {
383
- title : 'swagger文件(仅开启swagger后有效) ' ,
414
+ title : 'swagger接口文档 ' ,
384
415
description : '获取swagger.json' ,
385
416
tag : {
386
417
name : 'System' ,
@@ -397,6 +428,11 @@ export async function start(port: number = 3000, option?: BriskControllerOption)
397
428
} ) ) ;
398
429
}
399
430
431
+ globalVal . _briskControllerBefores ?. sort ( sortBy ) ;
432
+ for ( let beforeHook of globalVal . _briskControllerBefores ! ) {
433
+ await Promise . resolve ( beforeHook . handler ( ) ) ;
434
+ }
435
+
400
436
await new Promise ( ( resolve ) => {
401
437
const server = app . listen ( realPort , '0.0.0.0' , ( ) => {
402
438
logger . info ( `listen http://0.0.0.0:${ realPort } ${ globalBaseUrl } ` ) ;
@@ -410,6 +446,11 @@ export async function start(port: number = 3000, option?: BriskControllerOption)
410
446
setBean ( 'KoaServer' , server , globalVal . _briskControllerRegion ) ;
411
447
} ) ;
412
448
449
+ globalVal . _briskControllerAfters ?. sort ( sortBy ) ;
450
+ for ( let afterHook of globalVal . _briskControllerAfters ! ) {
451
+ await Promise . resolve ( afterHook . handler ( ) ) ;
452
+ }
453
+
413
454
return app ;
414
455
}
415
456
0 commit comments