背景
形似 koa 的中间件无法使用 inject 进行注入,使用上与 service 无法对齐;故而新增中间件类型:
- 类中间件:在类添加
@Middleware({ enable: true }) 注解
- 函数中间件:在对应的 http method 上添加
@MV({ middlewares: [] }) 注解
需要考虑一下是否在 @artus/pipeline 中添加对类中间件支持?
实现
示例
类中间件
对于全局中间件,参考 nestjs 的语法,支持 Middleware 注解,参数为是否启用,通过 pipeline.run(ctx) 运行
import { ArtusInjectEnum, Inject } from '@artus/core';
import { ArtusxContext, ArtusxNext, Middleware } from '@artusx/core';
@Middleware({
enable: true,
})
export default class CheckAuthMiddleware {
@Inject(ArtusInjectEnum.Config)
config: Record<string, string | number>;
async use(ctx: ArtusxContext, next: ArtusxNext): Promise<void> {
const { data } = ctx.context.output;
data.authed = false;
console.log('middleware - checkAuth', ctx.context, this.config);
await next();
}
}
函数中间件
函数中间件,在 http method 中使用,接收参数为函数中间件数组,通过 koa.use(middlewares) 方式运行
middleware.ts
import { ArtusxContext, ArtusxNext } from '@artusx/core';
export default async function traceTime(_ctx: ArtusxContext, next: ArtusxNext): Promise<void> {
console.time('trace');
await next();
console.timeEnd('trace');
}
controller.ts
import { ArtusInjectEnum, Inject } from '@artus/core';
import { GET, POST, Controller, MW } from '@artusx/core';
import type { ArtusxContext } from '@artusx/core';
import traceTime from '../middleware/traceTime';
@Controller()
export default class HomeController {
@Inject(ArtusInjectEnum.Config)
config: Record<string, string | number>;
@MW([traceTime])
@GET('/')
async home(ctx: ArtusxContext) {
ctx.body = 'home';
}
}
背景
形似 koa 的中间件无法使用 inject 进行注入,使用上与 service 无法对齐;故而新增中间件类型:
@Middleware({ enable: true })注解@MV({ middlewares: [] })注解需要考虑一下是否在
@artus/pipeline中添加对类中间件支持?实现
示例
类中间件
对于全局中间件,参考 nestjs 的语法,支持 Middleware 注解,参数为是否启用,通过
pipeline.run(ctx)运行函数中间件
函数中间件,在 http method 中使用,接收参数为函数中间件数组,通过
koa.use(middlewares)方式运行middleware.ts
controller.ts