{"id":17640882,"url":"https://github.com/beace/koa-scripts","last_synced_at":"2026-05-19T04:31:55.921Z","repository":{"id":98536114,"uuid":"224663500","full_name":"Beace/koa-scripts","owner":"Beace","description":"koa-scripts","archived":false,"fork":false,"pushed_at":"2019-12-10T02:42:08.000Z","size":18,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-05T07:31:07.952Z","etag":null,"topics":["koajs"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Beace.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-11-28T13:50:37.000Z","updated_at":"2023-03-04T03:25:53.000Z","dependencies_parsed_at":null,"dependency_job_id":"faa2c1c6-2110-4974-85e3-3be3651d6980","html_url":"https://github.com/Beace/koa-scripts","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Beace%2Fkoa-scripts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Beace%2Fkoa-scripts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Beace%2Fkoa-scripts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Beace%2Fkoa-scripts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Beace","download_url":"https://codeload.github.com/Beace/koa-scripts/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246279663,"owners_count":20751982,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["koajs"],"created_at":"2024-10-23T06:24:35.106Z","updated_at":"2026-05-19T04:31:55.871Z","avatar_url":"https://github.com/Beace.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# KOA-SCRIPTS\n\nKOA-SCRIPTS 主要实现了启动时动态挂载 Controller，Service，Config。\n\n## 结构\n\n```\n.\n├── index.ts\n├── interfaces\n│   └── App.ts\n├── loadConfig.ts\n├── loadController.ts\n├── loadRouter.ts\n├── loadService.ts\n└── loader.ts\n```\n\n## Feature\n\n- 启动时检查\n- 规范化路由与业务逻辑\n- 灵活的配置\n\n\n## 原理\n将 Controller 中的业务逻辑函数动态挂载到 KOA 原型上，\n将 Service 通过参数的方式传递给每个 Controller 方法，\nConfig 则直接在 KOA 实例中 app 挂载，\n在动态加载的 Router 中将 KOA 实例化的 app 传入 Router，\n此时直接调用 Controller 中的方法即可。\n\n启动时即挂载，不会对性能有任何损耗。\n\n## router\n在 `router.js` 中定义，为了加以区分，原则上请求方法需要大写`GET POST PUT DELETE`，后面跟上 path。（ps: 小写其实也不会出错）。\n\n\n### 示例\n```js\nmodule.exports = app =\u003e {\n  return {\n    \"POST /api/create\": app.controller.home.create,\n    \"GET /api/result/:tid\": app.controller.home.getResult,\n  };\n};\n```\n\n## Controller\ncontroller 即暴露出的 API，需要在 controller 目录下定义。模块对应的文件名即 router 中使用的对象作用域。例如 `controller/highlight.js`\n```js\n{\n  \"POST /api/create\": app.controller.home.create,\n}\n```\n\n## Service\nservice 是 controller 中每个处理函数的第二个参数。在 services 文件中定义的任何 services 都可以在 controller 的第二个参数中获取。\n```js\nasync create(ctx, services, app) {\n  const { metricsEvent } = app.config;\n  const { metrics } = services;\n  await metrics.emitCounter(xxx);\n},\n```\n\n## config\n\n### 规则\n默认在 NODE_ENV=development 环境下只会使用 config.default.js 文件，除 development 环境外，可自定义其他环。\n\n例如 `production`，需要新建 `config.production.js` 文件，并启动时指明 `NODE_ENV=production`, 服务在启动时会自动 `config.production.js` 中的配置会自动合并并覆盖 `config.default.js` 中的配置，**注意：没有去做 friendly merge，制作了第一层对象的覆盖**。\n\n### 示例\n```js\nasync create(ctx, services, app) {\n  const { metricsEvent } = app.config;\n},\n```\n\n## 缺点\n函数式编程并不是一个缺点，但是在该项目中有些捉襟见肘。虽然已经制约的很好了，但是每次新增一个扩展，我都要考虑是放在 app 实例下还是放在函数的参数中。如果在参数中，就必须去不停地给 controller 中的函数增加参数，扩展性很差，所以之后考虑的话会采用面向对象的方式，直接继承 KOA，这种方式，业界也早有人实现过。具体可以参考 [Egg.js](https://github.com/eggjs/egg-core/blob/40250e0baf746f6a3a6216884848d70b2982fca9/lib/egg.js#L21) 的实现。\n\n\n## TODO\n- ~~全局 logger~~\n- 增加 DAL\n- extend koa\n- 单元测试\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeace%2Fkoa-scripts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbeace%2Fkoa-scripts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeace%2Fkoa-scripts/lists"}