{"id":15097874,"url":"https://github.com/dingchenaobo/koa-hostname","last_synced_at":"2026-01-07T00:05:22.195Z","repository":{"id":39980083,"uuid":"475523974","full_name":"dingchenaobo/koa-hostname","owner":"dingchenaobo","description":"koa hostname router","archived":false,"fork":false,"pushed_at":"2022-05-20T03:25:37.000Z","size":20,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-18T14:50:09.597Z","etag":null,"topics":["koa","koa-hostname","koa-router"],"latest_commit_sha":null,"homepage":"","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/dingchenaobo.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}},"created_at":"2022-03-29T16:16:27.000Z","updated_at":"2022-03-29T16:42:26.000Z","dependencies_parsed_at":"2022-08-27T13:23:30.797Z","dependency_job_id":null,"html_url":"https://github.com/dingchenaobo/koa-hostname","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/dingchenaobo%2Fkoa-hostname","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dingchenaobo%2Fkoa-hostname/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dingchenaobo%2Fkoa-hostname/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dingchenaobo%2Fkoa-hostname/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dingchenaobo","download_url":"https://codeload.github.com/dingchenaobo/koa-hostname/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245854399,"owners_count":20683346,"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":["koa","koa-hostname","koa-router"],"created_at":"2024-09-25T16:40:59.665Z","updated_at":"2026-01-07T00:05:22.169Z","avatar_url":"https://github.com/dingchenaobo.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# koa-hostname\nkoa hostname 路由，支持 middleware 配置，主要用于单应用对接多域名（多业务线）\n\n中间件机制可以结合 koa-router 完成 hostname + path 的路由\n\n# useage\n测试时需要修改本地 host 配置\n\n```host\n127.0.0.1 a.com x.a.com y.a.com b.com c.com\n```\n\n## basic\n基础用法\n```typescript\nimport Koa from 'koa';\n\nimport HRouter from '../src';\n\nconst app = new Koa();\nconst host = new HRouter();\n\nhost.use('a.com', ctx =\u003e ctx.body = 'a.com');\n\nhost.use('b.com', ctx =\u003e ctx.body = 'b.com');\n\napp.use(host.middleware());\n\napp.use(async ctx =\u003e {\n  ctx.body = '404';\n});\n\napp.listen(8080);\n```\n通过\n```bash\ncurl http://a.com:8080\ncurl http://b.com:8080\ncurl http://c.com:8080\n```\n可以得到返回\n```bash\na.com\nb.com\n404\n```\n\n## glob 匹配\n支持 glob 语法匹配\n```typescript\nimport Koa from 'koa';\n\nimport HRouter from '../src';\n\nconst app = new Koa();\nconst host = new HRouter();\n\nhost.use(['a.com', '*.a.com'], ctx =\u003e ctx.body = 'a.com');\n\napp.use(host.middleware());\n\napp.use(async ctx =\u003e {\n  ctx.body = '404 not found';\n});\n\napp.listen(8080);\n```\n通过\n```bash\ncurl http://a.com:8080\ncurl http://x.a.com:8080\ncurl http://y.a.com:8080\n```\n可以得到返回\n```bash\na.com\na.com\na.com\n```\n\n## 结合 koa-router\n结合 ```koa-router```，以及 koa 的中间件机制，可以完成完整的 hostname + path 路由匹配\n\n```typescript\nimport * as Koa from 'koa';\nimport * as Router from 'koa-router';\nimport { createReadStream } from 'fs';\n\nimport HRouter from '../src';\n\nconst app = new Koa();\nconst host = new HRouter();\nconst renderPage = (ctx: Koa.Context, pageName: string) =\u003e {\n  ctx.set('content-type', 'text/html');\n  ctx.body = createReadStream(__dirname + '/' + pageName + '.html');\n}\n\nconst routerA = new Router();\nrouterA\n  .get('/', ctx =\u003e renderPage(ctx, 'a'))\n  .get('/api', ctx =\u003e ctx.body = 'hello a');\nhost.use(['a.com', '*.a.com'], async (ctx, next) =\u003e {\n  console.log('site a.');\n  await next();\n}, routerA.routes());\n\nconst routerB = new Router();\nrouterB\n  .get('/', ctx =\u003e renderPage(ctx, 'b'))\n  .get('/api', ctx =\u003e ctx.body = 'hello b.');\nhost.use('b.com', async (ctx, next) =\u003e {\n  console.log('site b.');\n  await next();\n}, routerB.routes());\n\nconst routerC = new Router();\nrouterC\n  .get('/', ctx =\u003e renderPage(ctx, 'c'))\n  .get('/api', ctx =\u003e ctx.body = 'hello c.');\nhost.use('c.com', async (ctx, next) =\u003e {\n  console.log('site c.');\n  await next();\n}, routerC.routes());\n\napp.use(host.middleware());\n\napp.use(async ctx =\u003e {\n  ctx.body = '404 not found';\n});\n\napp.listen(8080);\n```\n访问：\n- a.com，x.a.com，y.a.com 渲染页面 a\n- b.com 渲染页面 b\n- c.com 渲染页面 c\n- a.com/api，x.a.com/api，y.a.com/api 路由到 a 的接口 /api\n- b.com/api 路由到 b 接口 /api\n- c.com/api 路由到 c 接口 /api\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdingchenaobo%2Fkoa-hostname","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdingchenaobo%2Fkoa-hostname","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdingchenaobo%2Fkoa-hostname/lists"}