{"_id":"@4a/koa-api-router","_rev":"4-96c9a2838f6215ca74db2649f2b5e32b","name":"@4a/koa-api-router","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@4a/koa-api-router","version":"0.1.0","description":"koa-api-router","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/gavinning/koa-api-router.git"},"keywords":["koa","koa-router","koa-api-router"],"author":{"name":"gavinning"},"license":"MIT","bugs":{"url":"https://github.com/gavinning/koa-api-router/issues"},"homepage":"https://github.com/gavinning/koa-api-router#readme","dependencies":{"debug":"^4.1.1","koa-router":"^8.0.8"},"gitHead":"c26fe9b193b8596e5fa1a3ba6530c01f1ad4befb","_id":"@4a/koa-api-router@0.1.0","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-Il8ten0I6+W3ZD5c5XI2SHtqSs99iRETauN3FWJDg8zgoPzPsA1Q6Ig4CaDVnoXQAiuocLmgKFXJaL8wG2iS5g==","shasum":"32e3e85c13b05321a1098b3c397599cb548b1d1e","tarball":"https://registry.npmjs.org/@4a/koa-api-router/-/koa-api-router-0.1.0.tgz","fileCount":3,"unpackedSize":7994,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeju/VCRA9TVsSAnZWagAAgfQP/1r4wUeRN2LIp0R537XD\nUo7j5wik5XHEnfRPNWEUbl9hO0dFLboRDNZ/lo3rLZ636qa8hUQWfER8I2fC\n+aZ79+MLLnoXo3JosHICez4hhq5VtYckRn2zFo/HsNzEWynfk6txLSf+Bl8u\nxAHDduJGUZ7SojiMBv/DfOV2527UkHs9N+TU+0cE13bXB0PF8BpM48ueS+p8\nNdeuGyDt4VwGTF7DSJrKe/vKsiZzHYZqURLz+x8zAYTIxx5ugGrA0aJtMaoc\nWa9Th8R7p3qNOs9ULxZiLN7RbSqTtC7y0fYmQH69wO1bQRsNy2PTSDrqgNRh\n17Y7nT2SF2YlLJHuAjIpPE4hq/d5d+mhVf0osPzNU98iT7tl/vzNcvlD3j0m\n7NNXX6QhgG5DFpVU0M3SlTuMcVDakiHq7GK6Q6Aj+7Vss6pXiaJearyUQtXm\nMXZ3atz+0GDMsd67ci9KA5OOe3NX2ijslzki8SpYPDgk7TB15CQnBwI5HpG0\nnJN2UvGrwjjvOoXkeuaV6u89cx3tmuxUCIcDjcdPaDMOFRw2E0gk9OAxkGla\nrOVe0zjnLG3h3eH9UqQOufpOgRLE2mgXjrgODdMWxKK06O7ht0x7KLB0C47R\n9iOKQOPOJo4mLcKfnS118nubpV7aJmrffWxXYX0lPE5zai0HYPjrwM9khijD\n6izg\r\n=eTIU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDEYwgbCtatB4S1tzPZG+n/4RDYCKSFuXJsbsmbElL7bAiAzT7sj/0s3atk3IYboPHCPhwxtP//aYYfMvE3H/Ob/NQ=="}]},"maintainers":[{"name":"gavinning","email":"gavinning@qq.com"}],"_npmUser":{"name":"gavinning","email":"gavinning@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/koa-api-router_0.1.0_1586425812836_0.3404227548425014"},"_hasShrinkwrap":false},"0.1.1":{"name":"@4a/koa-api-router","version":"0.1.1","description":"koa-api-router","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/gavinning/koa-api-router.git"},"keywords":["koa","koa-router","koa-api-router"],"author":{"name":"gavinning"},"license":"MIT","bugs":{"url":"https://github.com/gavinning/koa-api-router/issues"},"homepage":"https://github.com/gavinning/koa-api-router#readme","dependencies":{"@koa/router":"^8.0.8","debug":"^4.1.1"},"gitHead":"3d0cd522937e6ec59d159e1327a2b4e89a2c41b4","_id":"@4a/koa-api-router@0.1.1","_nodeVersion":"12.16.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-Cayha0aThnKFsQySWKzk/QwOwOZMwN9SQGFVNZTxKx9o/kLl7D4lXEurJlm5G4/K3ZotFGcx/g2jPB/DJH00kg==","shasum":"d3d43198eda92c82de6645e0a5161bcb78dcd94a","tarball":"https://registry.npmjs.org/@4a/koa-api-router/-/koa-api-router-0.1.1.tgz","fileCount":3,"unpackedSize":7995,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJepTCNCRA9TVsSAnZWagAAAAkQAJ3nIb+XF/fIsswS6ssW\nX+LxFkaV9BDOEkrjKh4XoxPLK+A9ZLDJwNt+kQNL7AgtL00uj1JK3EBcOP+O\nWG2HsDHooGvcx/C4W/cS6dD5XtbuC1RMQfVcxL55vSshFap1sK9bNeRQw/O5\n5CUVOXvB1LHJ7G5BjqyedIBAfe9OCJRh9xMMpJ5Tf8/b2pgtRfbzVht3rtI5\n9B0qNkERN6khi0C/eJ/Jf/PG3l0k46ZmJ+/UIF+SIZJ4rZ2HrrHcL1SIp8HU\nAF5uVyn9Tqhk/P0X13TiuwIyIkLhafu+sbJYc/og68/zMBwApvSWhoqUjhyM\nEfjw1ulfxs0R3ssrOm6opsnYs75ZTK9L53dPB46cnr2lNx61PsMmGFdwMo38\nAFKvmC2Z7ob5bDnNFl0ZmZn9N4qfS/v6Cl76b7BrjFPABfucZpI4DoXETe8n\n+MH4ht//J9ROaHp2ODfqy6g7Zpku7qMxEGEf6NCxLp07QF3oAzVcTAFRAXQv\ne0fKuJ0RTUSQ3Unsvjs3El/wAEMeaQEDgvy4nJUBcVYPC4GG2gYPb9JxGQAy\nELqQHhMzPqaAJTHKT2g0g+4lhy1qnfDknUYBUREx4dQ49j+chXpbsrdRGRuy\nINlDsOXWYE7oZxypIyWNlT/JcKIiZX3FYcHU8kKgZhrDk0Nh4dIG4kFb1+Mi\n7NXn\r\n=k8+S\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBe9YHbf1+r0+7paJDWpz2E72BnBVGpnOHDUrIVn1HJRAiEAqB8mU4c4/W95v7ggLkFkzTkv5ZYJfztWI2YIb5gmqcM="}]},"maintainers":[{"name":"gavinning","email":"gavinning@qq.com"}],"_npmUser":{"name":"gavinning","email":"gavinning@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/koa-api-router_0.1.1_1587884172544_0.108165947568299"},"_hasShrinkwrap":false},"0.1.2":{"name":"@4a/koa-api-router","version":"0.1.2","description":"koa-api-router","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/gavinning/koa-api-router.git"},"keywords":["koa","koa-router","koa-api-router"],"author":{"name":"gavinning"},"license":"MIT","bugs":{"url":"https://github.com/gavinning/koa-api-router/issues"},"homepage":"https://github.com/gavinning/koa-api-router#readme","dependencies":{"@koa/router":"^8.0.8","debug":"^4.1.1"},"gitHead":"a22a35157c1798b4dfd8cc5fdf3ce2798eff1f1d","_id":"@4a/koa-api-router@0.1.2","_nodeVersion":"12.16.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-UkEEuWzF27unEOsmZGcQ6XBPUPKVcUOBVYGZ2HycoUK24bWUOkAiupILub/LVZp4EG+xA9Ol0HpmqJSg5UgwXg==","shasum":"7a8dd7ab864b5c3415ea1e6915328cbada623a50","tarball":"https://registry.npmjs.org/@4a/koa-api-router/-/koa-api-router-0.1.2.tgz","fileCount":3,"unpackedSize":8010,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJevNHpCRA9TVsSAnZWagAAUtIP/0CeXuqP4p0SoF5lTTum\nl0zFvvM9CtCrVU6nhV7+8SfChcuy5BfJTyV3jY/MhiNwlMKkn6bVuiYZ3ASx\nZh2Pna45PnvJd8Z5+h5mx/SlnFwdUmZoLkiNfIvn1DfVGzvyvqKCYVG4wLuG\ncrzsKe9Qehu1i1QDP4VHrvzt1KhiGMK04xGFnumDFd8PxExEVzdFcQe7KfGw\nKW+yQPeR0uoLEeJ3s60xrpW9ALQj6QCqwNJ8HumxO45vejq48OEDZs2yKTYW\ncvzTlvOUrLv8HoOUaOeb38Owfi2eu72gxDaywJr2Yi69u0HX2/bzvvEKU5kC\nsWUU5y8qXvo7dsoM0VNX4RtkYdn+5yEvDx5TixXapfjkw59bWza5fYJevhgt\ntB+DRqaFBERv7QlrAN8vJPc3bwyr26w3tmNt8HfMRtc5TZbqY7dqOlZq4wvY\nzCWuYsCgS+zNIHnt1V8RSqowfTKsTzGhjoVNd+Ir9kdWSbHxaKVOwCtebrCx\nJx5u9xcVU52YxhWmb5D/q2+CGMrd+wNKlM4BszinO06fOJsKvfCuHtAk3/V8\nU5ujNef+M226LVOhRn2pSOZTY6dcLzgSrULV1tMcEtPJVt2svEEt+99keLx/\neQ332NfzalUFv36IXZLARFjYLis2wigVchcp/yOSP7xyrFJKxbWphfZTolHB\nOf4R\r\n=g9GG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDv9WxbC2jafnncrUfbfhdIkvhVC5zZJ2InmxKJGzjkrAiAsEEh0OEKYQTUrJCenYuYV83FqdDBFt0gMEAqTlmX0CQ=="}]},"maintainers":[{"name":"gavinning","email":"gavinning@qq.com"}],"_npmUser":{"name":"gavinning","email":"gavinning@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/koa-api-router_0.1.2_1589432808570_0.049730866013320885"},"_hasShrinkwrap":false},"0.1.3":{"name":"@4a/koa-api-router","version":"0.1.3","description":"koa-api-router","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/gavinning/koa-api-router.git"},"keywords":["koa","koa-router","koa-api-router"],"author":{"name":"gavinning"},"license":"MIT","bugs":{"url":"https://github.com/gavinning/koa-api-router/issues"},"homepage":"https://github.com/gavinning/koa-api-router#readme","dependencies":{"@koa/router":"^8.0.8","debug":"^4.1.1"},"gitHead":"52e0249fe2bd4594a0dc3e1d5490f836ab5cf49f","_id":"@4a/koa-api-router@0.1.3","_nodeVersion":"12.16.1","_npmVersion":"6.14.5","dist":{"integrity":"sha512-X3LMNrbP6759kT7RnCUnCOhhqQkrLL/bJEbnn04bIhfml5E7t8klWRFBnBXCcBfEMYZ7kbLEV6NAXTvfi8H2Ng==","shasum":"ee9eb071482f4b24e27972c9e9e436c899894716","tarball":"https://registry.npmjs.org/@4a/koa-api-router/-/koa-api-router-0.1.3.tgz","fileCount":9,"unpackedSize":69008,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJewiwpCRA9TVsSAnZWagAAlD8P/jeTfc4QZYuPWNP5bBlH\npxj6clJD88pYAc3/WbRSlhqvVu+hQm4ipJXz+OY3+LWt59520lK76HDwagVq\nQdEnmQRPNn4WkZmrlYNHlv3DaFp0TMKOtc4mzO//L1aXWZ8zoas4UuAAQOBl\nf4inW7KTxAvJqHBhTstikyTgG7JUjBVr7WSloCNikTvh5JXHkGQAXiv64PC+\nKPcuR2uioqkNCCCkOQhzjv57WVLdKG8/U09jn4CZUKzpA6lsWMFpyarrp7aF\ncdxm/rHVuRXDD+vEWeLUYnpGNfranoEP3HhQGTmO95gsGLL3RrDlxGnE0u8O\n5rxfMb3lZ9APeso8ezCRFAx2qqVeRVJBkZ7JXOhlp0WkaeDTY5RfgjfKEUAQ\nkM8SLMGMPoAk/0I9SNQlm9CDWkoOBdfM/q+gY/jATI9BKfS/GsduCKq5AHke\n/wHWDe/FBfZ2lGd8um0/bkmeHpqGjI+qo/HBRfpNjkq+jw7zr2XKPiR8cZJv\nwm0FXyzgrK/NPppCuwL9sjIqos8EMuoH+DvmrqDUWfd8/cMamMN/8iCRVny2\nIsX2lCb3d8Knjk3GnQVB4EGdxfeWKObX32eq60SsEwVTgV0HPT7vMslHksMl\nEJ1ivoE6ub3PSi6DYE2t7ZDyv4VxFjQv5BLWYiayHanSxAIv8uzQUiAyav34\nssOz\r\n=Sjza\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEFy3/McENuE4gahf87i1vjpT6+ILH9MnKkUF2aaeHYKAiByevQVuNJ1yYPwR4dZURJcSzDJYTYHr9HVsFr36KoZcA=="}]},"maintainers":[{"name":"gavinning","email":"gavinning@qq.com"}],"_npmUser":{"name":"gavinning","email":"gavinning@qq.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/koa-api-router_0.1.3_1589783593252_0.458319171204832"},"_hasShrinkwrap":false}},"time":{"created":"2020-04-09T09:50:12.583Z","0.1.0":"2020-04-09T09:50:13.035Z","modified":"2022-04-04T10:46:00.624Z","0.1.1":"2020-04-26T06:56:12.686Z","0.1.2":"2020-05-14T05:06:48.683Z","0.1.3":"2020-05-18T06:33:13.410Z"},"maintainers":[{"name":"gavinning","email":"gavinning@qq.com"}],"description":"koa-api-router","homepage":"https://github.com/gavinning/koa-api-router#readme","keywords":["koa","koa-router","koa-api-router"],"repository":{"type":"git","url":"git+https://github.com/gavinning/koa-api-router.git"},"author":{"name":"gavinning"},"bugs":{"url":"https://github.com/gavinning/koa-api-router/issues"},"license":"MIT","readme":"koa-api-router\n---\n定义某种自定义规范，方便api开发，因为DEMO依赖[Enum](https://github.com/gavinning/enum) 所以接入过程会稍显复杂，实际使用起来比较爽  \n[Enum](https://github.com/gavinning/enum)  \n[EnumCodeMessage](https://github.com/gavinning/enum-code-message)  \n\n### Install\n```sh\nnpm i @4a/koa-api-router\n```\n\n### Usage\n```js\nconst assert = require('@4a/enum/assert')\nconst router = require('@4a/koa-api-router').default()\nconst ResultMessage = require('@4a/enum-code-message')\n\nrouter.append(resolver, {\n\n    // ROOT表示根路由，等同于 /\n    async get_ROOT(ctx, next) {\n        const params = ctx.query\n\n        // 参数合法性检查\n        // 此处不通过会直接抛出ResultMessage关联异常\n        // Response响应结果类似 { code: 400000, message: 'error message' }\n        // 如果ctx.ResponseId有值，则Response响应结果类似：\n        // { code: 400000, message: 'error message', ResponseId: '...' }\n        assert.ok(params.token, ResultMessage.PermissionDenied)\n\n        // 此处assert是@4a/enum模块下定制版的断言模块\n        // @4a/enum/assert断言模块仅支持由@4a/Enum创建的静态枚举类型创建的EnumError异常\n        // 当然也可以使用Nodejs官方提供的assert断言库，after方法稍加处理即可兼容\n        assert.ok(params.token.length >= 6, ResultMessage.ErrorToken)\n\n        assert.ok(params.email, ResultMessage.LossEmail)\n\n        // 参数检查通过之后，暂存到ctx.state属性之下\n        // 下游resolver会用到它\n        ctx.state.params = params\n\n        // 当然不仅仅是参数检查\n        // 任何你需要预处理程式都可以在这里定义\n        // 任意条件不通过，即可在此处抛出异常信息\n        // 所有预处理通过之后，即可执行await next() 交由下游resolver进一步处理\n\n        await next()\n    },\n\n    // 路由规则\n    // {Method}_{RoutePath}_{RouteResolverKey}\n    // 当 RoutePath == RouteResolverKey 时，RouteResolverKey可以省略\n    // 因为路由规则使用下划线作为分隔符，所以路由规则关键字中不能再使用额外的下划线\n    async 'get_app/:id_getApp'(ctx, next) {\n        const params = ctx.params\n\n        assert.ok(isNaN(params.id), ResultMessage.NotFound)\n\n        ctx.state.params = params\n\n        await next()\n\n        // 可根据需要在此执行某些收尾工作\n        // 接口响应异常收集、上报等通过程式建议放在after方法内\n        // after方法下文有介绍\n    },\n\n    // 当 RoutePath == RouteResolverKey 时，RouteResolverKey可以省略\n    async get_login(ctx, next) {\n        await next()\n    }\n})\n\n```\n\n#### resolver\n```js\n// 下游 Resolver\nclass HomeResolver {\n\n    ROOT(ctx) {\n        // 此时 ctx.state.params 是可信的\n\n        ctx.body = ctx.state.params\n    }\n\n    getApp(ctx) {\n        ctx.body = ctx.state.params\n    }\n\n    login(ctx) {\n        console.log(ctx.state.params)\n        ctx.body = 'ok'\n    }\n}\n\n```\n\n### After Response\n``Router``实现了一个``after``方法，用于处理通用异常，实现如下：  \n```js\n/**\n * router通用后处理函数\n * @param {Error?} err \n * @param {Koa.Context} ctx Koa上下文\n */\nfunction after(err, ctx) {\n    if (err) {\n        // DEBUG环境变量开启Koa-api-router即可显示此日志\n        // eg: DEBUG=Koa-api-router npm run dev\n        debug('Error:', err)\n\n        // 兼容处理由@4a/Enum创建的静态枚举类型创建的EnumError异常\n        // 可自定义Error子类，只要自定义的Error实例实现了Encode方法，即可被兼容处理\n        if (err.Encode && typeof err.Encode === 'function') {\n            return ctx.body = err.Encode({ ResponseId: ctx.ResponseId })\n        }\n        ctx.body = {\n            // 当error实例携带有魔改版的code，也可以被兼容处理\n            // 理论上来说所有可预见异常都应该在ResultMessage枚举实例中进行枚举\n            // 超出预期的异常code值应该是500xxx，这里默认值是500000\n            code: isNaN(err.code) ? 500000 : err.code,\n            message: err.message,\n            ResponseId: ctx.ResponseId,\n        }\n    }\n    // 此处可收集异常响应，或执行异常响应上报等操作\n    else if (!ctx.body || ctx.body.code !== 0) {\n        debug('Exception Response:', ctx.body)\n    }\n}\n```\n如果需要自定义异常处理，可以重写此方法，重写``after``示例\n```js\nclass CustomRouter extends Router {\n\n    after(err, ctx) {\n        // ... your code\n    }\n}\n```\n","readmeFilename":"readme.md"}