首页

2023-12-30

尝试了一下实现中间件,运行那块的函数是请教 chatGPT 得到的,自己之前想的一团乱麻,结果如此简洁。
核心只用18行实现
ts
// 最小中间件实现,接收一个函数 handel 作为最终执行的函数,当执行 runMiddlewareHandel 时等价于执行 Handel // 通过 use 注册中间件,类似于洋葱路由,先注册的先执行 type FuncMiddlewares any> = ((ctx: Parameters, next: Handel) => ReturnType) class middlewareRunner any>{ middlewares: FuncMiddlewares[] = [] constructor(public handel: Handel) { } use(middleware: FuncMiddlewares) { this.middlewares.push(middleware) } runMiddlewareHandel(...ctx: Parameters) { let index = 0 const next = ((...ctx2: Parameters) => { const middleware = this.middlewares[index] index++ if (middleware === undefined) { return this.handel.call(this, ...ctx2) } return middleware(ctx2, next) }) as Handel return next.call(this, ...ctx) } } // 最终处理事物的函数 async function handel(a: number) { return (a + 1) } // 某个中间件 const middlewareA: FuncMiddlewares = async (ctx, next) => { // 处理上下文 const newCtx = ctx.map(v => v + v) // 让其他中间件继续处理 const value = await next(newCtx[0]) // 处理返回值 return value + 1 } const m = new middlewareRunner(handel) m.use(middlewareA) // 4 m.runMiddlewareHandel(1).then(console.log)