链条的作用

当我们写的接口越来越多,挂载的中间件的逻辑也可能出现重复劳动的情况。如果某些中间件不是所有路由都能使用,那么它就不能被挂载到app上,此时你需要在各个路由挨个挂载。繁琐不说,还容易遗漏,后期维护修改也得小心翼翼

接口挂载中间件
api-1gzip - logger - cors - etag - custom
api-2gzip - logger - cors - etag - custom
api-3gzip - logger - cors - etag - jwt
api-4gzip - logger - cors - etag - jwt
api-5gzip - logger

针对这几个接口,我们发现它们之间使用了重复的中间件,现在改造成链条试一试

// ./src/chain/web.chain
import { chain } from '@aomex/core';

export const appChain = chain.web.mount(gzip).mount(logger);
export const publicChain = appChain.mount(cors).mount(etag);
export const authChain = publicChain.mount(jwt);

// ./src/index.ts
const app = new WebApp();
app.mount(appChain);
接口挂载中间件挂载链条
api-1gzip - logger - cors - etag - custompublicChain - custom
api-2gzip - logger - cors - etag - custompublicChain - custom
api-3gzip - logger - cors - etag - jwtauthChain
api-4gzip - logger - cors - etag - jwtauthChain
api-5gzip - logger-

清爽多了,公共的中间件就应该抽取出来。全局公共的中间件就用链条挂载到app上,而局部公共的中间件就设置新的链条等待路由挂载

export const router1 = new Router({
  // 组内共享
  mount: publicChain.mount(custom).mount(otherChain),
});
router1.get('api-1');
router1.get('api-2', {
  mount: [localMiddleware],
});

export const router2 = new Router({
  // 组内共享
  mount: authChain.mount(otherMiddleware),
});
router2.get('api-3');
router2.get('api-4');

export const router3 = new Router();
router3.get('api-5');

链条属于中间件容器,初衷是为了让路由逻辑有完整的类型提示