KOA-SCRIPTS 主要实现了启动时动态挂载 Controller,Service,Config。
.
├── index.ts
├── interfaces
│ └── App.ts
├── loadConfig.ts
├── loadController.ts
├── loadRouter.ts
├── loadService.ts
└── loader.ts
- 启动时检查
- 规范化路由与业务逻辑
- 灵活的配置
将 Controller 中的业务逻辑函数动态挂载到 KOA 原型上, 将 Service 通过参数的方式传递给每个 Controller 方法, Config 则直接在 KOA 实例中 app 挂载, 在动态加载的 Router 中将 KOA 实例化的 app 传入 Router, 此时直接调用 Controller 中的方法即可。
启动时即挂载,不会对性能有任何损耗。
在 router.js
中定义,为了加以区分,原则上请求方法需要大写GET POST PUT DELETE
,后面跟上 path。(ps: 小写其实也不会出错)。
module.exports = app => {
return {
"POST /api/create": app.controller.home.create,
"GET /api/result/:tid": app.controller.home.getResult,
};
};
controller 即暴露出的 API,需要在 controller 目录下定义。模块对应的文件名即 router 中使用的对象作用域。例如 controller/highlight.js
{
"POST /api/create": app.controller.home.create,
}
service 是 controller 中每个处理函数的第二个参数。在 services 文件中定义的任何 services 都可以在 controller 的第二个参数中获取。
async create(ctx, services, app) {
const { metricsEvent } = app.config;
const { metrics } = services;
await metrics.emitCounter(xxx);
},
默认在 NODE_ENV=development 环境下只会使用 config.default.js 文件,除 development 环境外,可自定义其他环。
例如 production
,需要新建 config.production.js
文件,并启动时指明 NODE_ENV=production
, 服务在启动时会自动 config.production.js
中的配置会自动合并并覆盖 config.default.js
中的配置,注意:没有去做 friendly merge,制作了第一层对象的覆盖。
async create(ctx, services, app) {
const { metricsEvent } = app.config;
},
函数式编程并不是一个缺点,但是在该项目中有些捉襟见肘。虽然已经制约的很好了,但是每次新增一个扩展,我都要考虑是放在 app 实例下还是放在函数的参数中。如果在参数中,就必须去不停地给 controller 中的函数增加参数,扩展性很差,所以之后考虑的话会采用面向对象的方式,直接继承 KOA,这种方式,业界也早有人实现过。具体可以参考 Egg.js 的实现。
全局 logger- 增加 DAL
- extend koa
- 单元测试