Skip to content

Commit 50f6948

Browse files
committed
feat(0.1.0): 发布0.1.0,修复相关问题
1 parent 0b678bf commit 50f6948

File tree

10 files changed

+152
-48
lines changed

10 files changed

+152
-48
lines changed

CHANGELOG.md

+11-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,17 @@
33
> 次版本:每季度发布一次,向下兼容的功能性新增
44
> 修订版本:每周发布一次(紧急版本随时发布),向下兼容的问题修正
55
6-
## 0.0.7 [Current]
6+
## 0.1.0 [Current]
7+
###### 发布日期:2023-11-04
8+
###### 兼容性:0.1.x
9+
10+
+ swagger的operateId使用tag名称结合,不兼容以前的swagger
11+
+ 添加hook
12+
+ 暴露返回swagger配置方法
13+
+ 修复路由处理逻辑,保证无请求处理器的路由不进拦截器
14+
+ 修复请求类型枚举值的问题
15+
16+
## 0.0.7
717
###### 发布日期:2023-09-20
818
###### 兼容性:0.x.x
919

jest.config.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export default {
77
// 所有文件总的覆盖率要求
88
global: {
99
branches: 70,
10-
functions: 90,
10+
functions: 70,
1111
lines: 90,
1212
statements: 90,
1313
},
@@ -35,4 +35,5 @@ export default {
3535
},
3636
],
3737
},
38+
maxWorkers: 1,
3839
};

package.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "brisk-controller",
3-
"version": "0.0.7",
3+
"version": "0.1.0",
44
"description": "fast light brisk controller in nodejs(koa)",
55
"main": "lib/index.js",
66
"types": "lib/index.d.ts",
@@ -35,9 +35,9 @@
3535
},
3636
"homepage": "https://github.com/ruixiaozi/brisk-controller#readme",
3737
"dependencies": {
38-
"brisk-ioc": "0.0.7",
39-
"brisk-log": "0.0.7",
40-
"brisk-ts-extends": "0.0.7",
38+
"brisk-ioc": "0.1.0",
39+
"brisk-log": "0.1.0",
40+
"brisk-ts-extends": "0.1.0",
4141
"co-body": "6.1.0",
4242
"formidable": "3.5.1",
4343
"koa": "2.14.1",

src/core/core.ts

+50-9
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,31 @@ import { isValid, parseBoolean } from './utils';
2626
import { addRoute, BriskControllerError, reInitRouter, isFormData, isJson, isXml, router, setBaseUrl, isFile } from './router';
2727
import { getBean, setBean } from 'brisk-ioc';
2828

29+
export interface BriskControllerHooks {
30+
priority: number;
31+
handler: () => Promise<void> | void;
32+
}
2933

3034
// 保存运行时region
3135
const globalVal: {
3236
_briskControllerRegion?: symbol,
37+
_briskControllerBefores?: BriskControllerHooks[],
38+
_briskControllerAfters?: BriskControllerHooks[],
3339
[key: string | symbol | number]: any,
3440
} = globalThis;
3541

3642
if (!globalVal._briskControllerRegion) {
3743
globalVal._briskControllerRegion = Symbol('briskController');
3844
}
3945

46+
if (!globalVal._briskControllerBefores) {
47+
globalVal._briskControllerBefores = [];
48+
}
49+
50+
if (!globalVal._briskControllerAfters) {
51+
globalVal._briskControllerAfters = [];
52+
}
53+
4054

4155
const logger = getLogger(globalVal._briskControllerRegion);
4256
logger.configure({
@@ -45,6 +59,22 @@ logger.configure({
4559
});
4660

4761

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+
4878
/**
4979
* 抛出错误响应
5080
* @deprecated
@@ -137,15 +167,15 @@ function validateAndTransParameter(param: BriskControllerParameter, value: any):
137167
const timestamp = Date.parse(value);
138168
// 无法转换成日期
139169
if (Number.isNaN(timestamp)) {
140-
logger.error(`validateAndTransParameter param '${param.name}' type error`);
170+
logger.error(`validateAndTransParameter param '${param.name}' type '${param.type}' error`);
141171
throwError(400, `param '${param.name}' type error`);
142172
}
143173
return new Date(timestamp);
144174
}
145175

146176
if (getParentTypeKind(param.type) === 'Array') {
147177
if (!Array.isArray(value)) {
148-
logger.error(`validateAndTransParameter param '${param.name}' type error`);
178+
logger.error(`validateAndTransParameter param '${param.name}' type '${param.type}' error`);
149179
throwError(400, `param '${param.name}' type error`);
150180
}
151181
return value.map((item: any) => validateAndTransParameter({ ...param, type: getSubTypeKind(param.type) as TypeKind }, item));
@@ -157,21 +187,21 @@ function validateAndTransParameter(param: BriskControllerParameter, value: any):
157187
}
158188

159189
if (typeof value !== 'string') {
160-
logger.error(`validateAndTransParameter param '${param.name}' type error`);
190+
logger.error(`validateAndTransParameter param '${param.name}' type '${param.type}' error`);
161191
throwError(400, `param '${param.name}' type error`);
162192
}
163193
switch (param.type) {
164194
case 'string':
165195
return value;
166196
case 'number':
167197
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`);
169199
throwError(400, `param '${param.name}' type error`);
170200
}
171201
return Number(value);
172202
case 'boolean':
173203
if (parseBoolean(value) === undefined) {
174-
logger.error(`validateAndTransParameter param '${param.name}' type error`);
204+
logger.error(`validateAndTransParameter param '${param.name}' type '${param.type}' error`);
175205
throwError(400, `param '${param.name}' type error`);
176206
}
177207
return parseBoolean(value);
@@ -181,18 +211,19 @@ function validateAndTransParameter(param: BriskControllerParameter, value: any):
181211
}
182212

183213
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`);
185215
throwError(400, `param '${param.name}' type error`);
186216
}
187217

188218
const typedes = get(param.type);
189219

190220
// 枚举直接返回
191-
if (typedes.enums) {
221+
if (typedes?.enums) {
192222
return value;
193223
}
194224

195-
return typedes.properties.reduce((pre, current) => {
225+
// 消毒处理,仅转换类型描述里的属性,多余属性自动过滤掉
226+
return typedes?.properties.reduce((pre, current) => {
196227
pre[current.key] = value[current.key];
197228
return pre;
198229
}, {} as any);
@@ -380,7 +411,7 @@ export async function start(port: number = 3000, option?: BriskControllerOption)
380411

381412
if (option?.swagger) {
382413
addRequest('/swagger.json', getSwaggerHandler(realPort, globalBaseUrl), {
383-
title: 'swagger文件(仅开启swagger后有效)',
414+
title: 'swagger接口文档',
384415
description: '获取swagger.json',
385416
tag: {
386417
name: 'System',
@@ -397,6 +428,11 @@ export async function start(port: number = 3000, option?: BriskControllerOption)
397428
}));
398429
}
399430

431+
globalVal._briskControllerBefores?.sort(sortBy);
432+
for (let beforeHook of globalVal._briskControllerBefores!) {
433+
await Promise.resolve(beforeHook.handler());
434+
}
435+
400436
await new Promise((resolve) => {
401437
const server = app.listen(realPort, '0.0.0.0', () => {
402438
logger.info(`listen http://0.0.0.0:${realPort}${globalBaseUrl}`);
@@ -410,6 +446,11 @@ export async function start(port: number = 3000, option?: BriskControllerOption)
410446
setBean('KoaServer', server, globalVal._briskControllerRegion);
411447
});
412448

449+
globalVal._briskControllerAfters?.sort(sortBy);
450+
for (let afterHook of globalVal._briskControllerAfters!) {
451+
await Promise.resolve(afterHook.handler());
452+
}
453+
413454
return app;
414455
}
415456

src/core/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export * from './core';
2-
export { BriskControllerError } from './router';
2+
export { BriskControllerError, getBaseUrl } from './router';
3+
export { getSwaggerConfig } from './swagger';

src/core/router.ts

+35-23
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ export function setBaseUrl(_baseUrl: string) {
3939
globalVal._briskControllerBaseUrl = _baseUrl;
4040
}
4141

42+
export function getBaseUrl() {
43+
return globalVal._briskControllerBaseUrl;
44+
}
45+
4246
export class BriskControllerError extends Error {
4347

4448
status!: number;
@@ -180,6 +184,7 @@ function parseBody(ctx: Context) {
180184
}
181185

182186

187+
// eslint-disable-next-line complexity
183188
export const router: Middleware = async(ctx: Context, next: Next) => {
184189
try {
185190
// 路径匹配
@@ -212,21 +217,37 @@ export const router: Middleware = async(ctx: Context, next: Next) => {
212217
return;
213218
}
214219

215-
// 先执行所有拦截器
220+
221+
const interceptors: BriskControllerRouterHandler[] = [];
222+
const requests: BriskControllerRouterHandler[] = [];
223+
224+
// 获取所有匹配的拦截器和请求器
216225
for (const pathInfo of pathInfos) {
217226
// 路径参数放入pathParams
218227
(ctx.request as any).pathParams = pathInfo.params;
219-
const interceptors = pathInfo.methodMap
228+
interceptors.push(...(pathInfo.methodMap
220229
?.get(ctx.request.method.toLowerCase() as BRISK_CONTROLLER_METHOD_E)
221230
?.get(BRISK_CONTROLLER_ROUTER_TYPE_E.INTERCEPTOR)
222-
|| [];
231+
|| []));
232+
requests.push(...(pathInfo.methodMap
233+
?.get(ctx.request.method.toLowerCase() as BRISK_CONTROLLER_METHOD_E)
234+
?.get(BRISK_CONTROLLER_ROUTER_TYPE_E.REQUEST)
235+
|| []));
236+
}
223237

224-
for (const interceptor of interceptors) {
225-
const interceptorRes = await interceptor(ctx);
226-
// 返回false,则终止后续所有处理
227-
if (!interceptorRes) {
228-
return;
229-
}
238+
// 没有请求处理的,不需要拦截,也不需要再执行请求器
239+
if (!requests.length) {
240+
// 执行后续中间件
241+
await next();
242+
return;
243+
}
244+
245+
// 先执行所有拦截器
246+
for (const interceptor of interceptors) {
247+
const interceptorRes = await interceptor(ctx);
248+
// 返回false,则终止后续所有处理
249+
if (!interceptorRes) {
250+
return;
230251
}
231252
}
232253

@@ -247,20 +268,11 @@ export const router: Middleware = async(ctx: Context, next: Next) => {
247268
}
248269

249270
// 执行所有请求处理器
250-
for (const pathInfo of pathInfos) {
251-
// 路径参数放入pathParams
252-
(ctx.request as any).pathParams = pathInfo.params;
253-
const requests = pathInfo.methodMap
254-
?.get(ctx.request.method.toLowerCase() as BRISK_CONTROLLER_METHOD_E)
255-
?.get(BRISK_CONTROLLER_ROUTER_TYPE_E.REQUEST)
256-
|| [];
257-
258-
for (const request of requests) {
259-
const requestRes = await request(ctx);
260-
// 返回false,则终止后续所有处理
261-
if (!requestRes) {
262-
return;
263-
}
271+
for (const request of requests) {
272+
const requestRes = await request(ctx);
273+
// 返回false,则终止后续所有处理
274+
if (!requestRes) {
275+
return;
264276
}
265277
}
266278

src/core/swagger.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -274,9 +274,11 @@ export function addSwaggerRoute(routePath: string, option?: BriskControllerReque
274274

275275
const methods = Array.isArray(option?.method) ? option!.method : [option?.method || BRISK_CONTROLLER_METHOD_E.GET];
276276
methods.forEach((method) => {
277+
const tagName = option?.tag?.name || defaultTag.name;
277278
globalVal._briskSwaggerConfig!.paths[transRoutePath][method] = {
278-
operationId: option?.name,
279-
tags: [option?.tag?.name || defaultTag.name],
279+
// operationId应该保障全局唯一
280+
operationId: (option?.name || Math.floor(Math.random() * 10000).toFixed(16)) + tagName,
281+
tags: [tagName],
280282
summary: option?.title,
281283
description: option?.description,
282284
parameters: option?.params
@@ -329,3 +331,7 @@ export function getSwaggerHandler(port: number, basePath: string) {
329331
globalVal._briskSwaggerConfig!.info.description = `<b>注意:仅开启swagger选项有效,建议上线前关闭该选项</b>\n\n${packageInfo.description}`;
330332
return () => globalVal._briskSwaggerConfig!;
331333
}
334+
335+
export function getSwaggerConfig() {
336+
return globalVal._briskSwaggerConfig!;
337+
}

src/decorator/index.ts

+36-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { setBean } from 'brisk-ioc';
22
import { DecoratorFactory } from 'brisk-ts-extends';
33
import { getParentTypeKind, getSubTypeKind } from 'brisk-ts-extends/runtime';
4-
import { addInterceptor, addRequest } from '../core';
4+
import { addHook, addInterceptor, addRequest } from '../core';
55
import {
66
BriskControllerDecoratorInterceptor,
77
BriskControllerDecoratorOption,
@@ -12,8 +12,8 @@ import {
1212

1313

1414
enum BRISK_CONTROLLER_DECORATOR_ROUTE_TYPE_E {
15-
REQUEST,
16-
INTERCEPTOR,
15+
INTERCEPTOR = '0',
16+
REQUEST = '1',
1717
}
1818

1919
/**
@@ -216,3 +216,36 @@ export function Interceptor(path: string, option?: BriskControllerDecoratorInter
216216
})
217217
.getDecorator();
218218
}
219+
220+
221+
/**
222+
* 控制层启动前
223+
* @param priority 优先级,默认10
224+
* @returns
225+
*/
226+
export function BeforeControllerStart(priority: number = 10): Function {
227+
return new DecoratorFactory()
228+
.setMethodCallback((target, key, descriptor) => {
229+
addHook('before_start', {
230+
priority,
231+
handler: descriptor.value?.bind(target),
232+
});
233+
})
234+
.getDecorator();
235+
}
236+
237+
/**
238+
* 控制层启动后
239+
* @param priority 优先级,默认10
240+
* @returns
241+
*/
242+
export function AfterControllerStart(priority: number = 10): Function {
243+
return new DecoratorFactory()
244+
.setMethodCallback((target, key, descriptor) => {
245+
addHook('after_start', {
246+
priority,
247+
handler: descriptor.value?.bind(target),
248+
});
249+
})
250+
.getDecorator();
251+
}

0 commit comments

Comments
 (0)