{"_id":"@anfo/koa-decorators","_rev":"3-29ad9fb02a5496549b5f0d9b4ca96950","name":"@anfo/koa-decorators","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@anfo/koa-decorators","version":"1.0.0","description":"- route\r - param\r - query\r - loginCheck\r - 基于`stage-1`的decorator，使用`@babel/plugin-proposal-decorators`插件时需要设置`{\"legacy\": true}`","main":"src/index.js","dependencies":{"decorator-manager":"^1.0.10","jsonwebtoken":"^8.5.1","koa-compose":"^4.1.0","koa-router":"^8.0.8","require-all":"^3.0.0","uuid":"^7.0.2","validator-biang":"^1.0.4"},"devDependencies":{"koa":"^2.11.0","koa-body":"^4.1.1","@babel/cli":"^7.8.4","@babel/core":"^7.8.7","@babel/plugin-proposal-decorators":"^7.8.3","typescript":"^3.8.3"},"scripts":{"test:server":"babel src -d dist && node dist/example/server.js","test:decoratorManager":"babel src -d dist && node dist/example/decoratorManagerTest.js"},"keywords":[],"author":"","license":"MIT","repository":{"type":"git","url":"git+https://github.com/longjiahui/koa-serve-decorator.git"},"gitHead":"6e7f438773d708cfb7798051d1bc8571afed13fe","bugs":{"url":"https://github.com/longjiahui/koa-serve-decorator/issues"},"homepage":"https://github.com/longjiahui/koa-serve-decorator#readme","_id":"@anfo/koa-decorators@1.0.0","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-nMoD6Wt3dsshL6NAMdqiAX5Hn6aLst2BCr+tcRq+yw0q/5jDaVEExxkwGt1dRxE7F5EcT1Fgyod9IPI9gK3X7w==","shasum":"887ad02b4a842a58d9c8fd80ecffae0293617d09","tarball":"https://registry.npmjs.org/@anfo/koa-decorators/-/koa-decorators-1.0.0.tgz","fileCount":10,"unpackedSize":16335,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeyVVqCRA9TVsSAnZWagAAeSMP/R2rUKc7BUqArigMmS0O\nmkgxIF7FaTGEh+Lc8pY44++4A7JsPvV+y5EthMpyanjV4vTTJE84Ujjrxiyq\nmDJ1o0oo3A+0rBOtCu0xbLnOHm5Dp6ljfC7Hwi9WCF/2hAxO20Of+YTA5vVS\nbN89xDLmxWs6IRVWWhOE5uDiSYKDiF7lGKwk9XlSgoKDtxYCHjpSvDLV+vuG\nX9V6ZkUbOpxXLohksBCZ+BVrocEXIUmC0Odf2BRM6vhcEFNNFj9XeYKGODnE\nD4YZj+q6iZvuF6RZ6eNIu/5wOrpIy1wBhgjphU0fTtL6d1a96AWDAoXgMgpy\n3xW3HWdzjdKPimKsqVEj5s/M4y8NrW1zyoiPe71dImrkmBmUZygHbdhuqCBh\neO7I2buE+jitwkmujaRqDFPIDJGmYbhkNdUuJmMBL8tnjIxILFzAuUbN/UN/\nISJ4Muoedu4+os7d3PdM+d5gJFT/uEx0n91fIYqopsTFlCQZvuapUvZa6/ul\nkoXIq6oDZdDOpMtN8QaaSCd8RXxwAUq+RJ7hrBl/JMMwUCIRdfzblY5LOeFY\nhxLuGNKeydgO317aRgh103ENpugMhHsanhFSYB+u3ccdNAI//EBxSKjfhxHb\n9/oKDfS+nwzhhQuDvZrpmJ+VCEZaxO5h6kQj0WFGe1eLnZIU3UXaI0l7wIHn\nzp8p\r\n=l8W+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5hyFosgIHgWbWEX4osl9EF+KYV/jEdFhy8kZp6wgEPAIhAOkT/+omigW14VhoSgG6sVs5Y+WdWw6I15na9A1xbj+Q"}]},"maintainers":[{"name":"longjiahui","email":"longjiahui@hotmail.com"}],"_npmUser":{"name":"longjiahui","email":"longjiahui@hotmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/koa-decorators_1.0.0_1590252905837_0.47148354479381815"},"_hasShrinkwrap":false},"1.0.1":{"name":"@anfo/koa-decorators","version":"1.0.1","description":"- route\r - param\r - query\r - loginCheck\r - 基于`stage-1`的decorator，使用`@babel/plugin-proposal-decorators`插件时需要设置`{\"legacy\": true}`","main":"src/index.js","dependencies":{"@anfo/decorator-manager":"^1.0.0","@anfo/validator":"^1.0.0","jsonwebtoken":"^8.5.1","koa-compose":"^4.1.0","koa-router":"^8.0.8","require-all":"^3.0.0","uuid":"^7.0.2"},"devDependencies":{"koa":"^2.11.0","koa-body":"^4.1.1","@babel/cli":"^7.8.4","@babel/core":"^7.8.7","@babel/plugin-proposal-decorators":"^7.8.3","typescript":"^3.8.3"},"scripts":{"test:server":"babel src -d dist && node dist/example/server.js","test:decoratorManager":"babel src -d dist && node dist/example/decoratorManagerTest.js"},"keywords":[],"author":"","license":"MIT","repository":{"type":"git","url":"git+https://github.com/longjiahui/koa-serve-decorator.git"},"gitHead":"6e7f438773d708cfb7798051d1bc8571afed13fe","bugs":{"url":"https://github.com/longjiahui/koa-serve-decorator/issues"},"homepage":"https://github.com/longjiahui/koa-serve-decorator#readme","_id":"@anfo/koa-decorators@1.0.1","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-UJc1k/8g81HE0R6tTgyhV9p4UsbA9OD1+xlZHGsgTyWKAbI5EAOFQ+3RSb59Umk2Iyo2enTa//pk7gN4CybDIw==","shasum":"753b15ba6a1b61741f4e2c352b5dba3534674920","tarball":"https://registry.npmjs.org/@anfo/koa-decorators/-/koa-decorators-1.0.1.tgz","fileCount":10,"unpackedSize":16356,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeyVfpCRA9TVsSAnZWagAAddYP/jw+Oj1+piJDW/zeEHGL\nvgglm9lPJcBfMnNNTlvCu0j9nigPk5bNO8SYT73OQaEVlcnLFt9o09lhSVuf\nJhyd/QOaGdQwBKCyT/LOVdicRKjEpC6W4JYrOjl0Tth7s+iRZjCiQ0maTgp8\ntAbJbwx6paeBHNM/pv3N5sgFg8iZib6SROeFcDV79WHEHNJSGh9UTfnZ8z7h\nQa0SKemrkGLt/VBtYgj3XytmBvdFYlilU0QxMADCdk62OUvH+y1oZBMi7ist\nzr/d9uT09w6fTvkJK7upQTdh3XnAZBD4BVbM/LQBJgCEA+HG73qpnBdac9eJ\nPargo7qIdU4dSJvUlp6L4Y5vBIrhqnfZcvu+iatn3CiU7r8l1RaH+ywcLwtG\n4BH+gcK1ipnqcoUTeTDTV3cnmtTKdzfbrDVcCN8jtwbbFxNMQeQ0tHKqKtOY\nr2VSLxpR7LaWK/116m+waPwmWVnrEDrsSfFGnmsQjYfoxHGkJykN7ZtkVYPo\n44PZRcO5XbyOZnKifWR1p88CZ0CPY5RvE2556Jbwg1/4t9Lc7J4EPfvs8qkY\npEJ3jQESLm0HjpIRN19VrZBtHFPRy/Z+VDueZaCp7mhQjihHPvTIHgdnNiHk\ny4zqoyXV+AtRMpHVi0IR/vtHZSBs2jYsvfZoZemmMM99d9VhKjn9NYL0Fx6K\nAPDw\r\n=SvDC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDz0oFXC+c4rLabWrV/nvlRWXij6SPqqDKcRyLuvD2JnwIgLnVV/W6mUYHbqZbtg/JmYI2VqUbd1mI2U9NrqDohPpo="}]},"maintainers":[{"name":"longjiahui","email":"longjiahui@hotmail.com"}],"_npmUser":{"name":"longjiahui","email":"longjiahui@hotmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/koa-decorators_1.0.1_1590253545004_0.29849815660697376"},"_hasShrinkwrap":false},"1.0.2":{"name":"@anfo/koa-decorators","version":"1.0.2","description":"- route\r - param\r - query\r - loginCheck\r - 基于`stage-1`的decorator，使用`@babel/plugin-proposal-decorators`插件时需要设置`{\"legacy\": true}`","main":"src/index.js","dependencies":{"@anfo/decorator-manager":"^1.0.0","@anfo/validator":"^1.0.0","jsonwebtoken":"^8.5.1","koa-compose":"^4.1.0","koa-router":"^8.0.8","require-all":"^3.0.0","uuid":"^7.0.2"},"devDependencies":{"koa":"^2.11.0","koa-body":"^4.1.1","@babel/cli":"^7.8.4","@babel/core":"^7.8.7","@babel/plugin-proposal-decorators":"^7.8.3","typescript":"^3.8.3"},"scripts":{"test:server":"babel src -d dist && node dist/example/server.js","test:decoratorManager":"babel src -d dist && node dist/example/decoratorManagerTest.js"},"keywords":[],"author":"","license":"MIT","repository":{"type":"git","url":"git+https://github.com/longjiahui/koa-serve-decorator.git"},"gitHead":"d14ebba46b7362961d8b8fd5bcd5d6fa64249fd4","bugs":{"url":"https://github.com/longjiahui/koa-serve-decorator/issues"},"homepage":"https://github.com/longjiahui/koa-serve-decorator#readme","_id":"@anfo/koa-decorators@1.0.2","_nodeVersion":"14.3.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-s0aD+Mh2bod70xh6SUBdKv89V0R4mq1bMxAphyMfnCYezeBk1nkeJxPY7JWxWXXn8T5+33fFDGmE6LP8e3sYYg==","shasum":"956000390eeabf3a39b14a2b299ed8fb4e9d17a0","tarball":"https://registry.npmjs.org/@anfo/koa-decorators/-/koa-decorators-1.0.2.tgz","fileCount":10,"unpackedSize":16406,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeyieYCRA9TVsSAnZWagAA3HMP/3sTyeDvEsrBQu9RAMPJ\nJV0WA7bevpiImOMuLKOSit4FyTf2UQD2dB1vz2qtJPhU5Y4wLkTxJ6p/NJzp\nEIIFZaxmiHXxfI9qwKo5vOcIQiv1V38eEv8IFWY/A2qlGXWl9+ItI9yTiz8x\nbPrSd3iVk5FDNJOxsrJZ0Dma7DCjX44vyXiU13yqgifVYg+1G8MRdF4dZ6Xg\n9WzhIQi2YEBpqcfHuRWJ2IQq3deuV5zBtPFv1rxQ163SjSt57bcsYcegvN5V\nW3T7hrJ6DXw2irLaSeVgztPt+nzRL+4/4/Y7U0JgLo8eAa2WnlPq8nzVDrg0\nxmaGIQJVJhAqD1Dz4iEWz69LIzGKPlYOjnwhXIlckxNe8cbkW8s3s6xBgDLR\nwmaUWunGCEqP7TTEAtDhuNR+f+MZdwivVPVE5O6m7JQvRSF10MP5eG3icjzS\nCmwJSRiZaalsj/iV9Ee3KETd6KH5ztrP7ncnJM04EYiqgREbnTNVYBO/24wj\nxyCUKEEBtFykisbXvMzPExHkrI6WEXdAzC8NH+8SY2yKkkTt5Wfc4APxlr4Q\nCZQKhNtjbJ3upeXyX/cjHYSgfQx17r8/kSICcOWJiiKjLJDKQb9C7QUulpsU\nZHkgipybi6uMlOy4DJzDeLXB7yVYBHmrjAsLHlVPbjnGJ/UXEcWqLhuLbQAT\nhsS1\r\n=OtuO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD7d6gtvlIxt517FB8eIgAlDl6LePleJUANUUE4UR08ugIhAL5OU5UZVayeGK4QYcOYC1LrMf2lNRRh6/2PrCKXhAmv"}]},"maintainers":[{"name":"longjiahui","email":"longjiahui@hotmail.com"}],"_npmUser":{"name":"longjiahui","email":"longjiahui@hotmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/koa-decorators_1.0.2_1590306711372_0.581304208726128"},"_hasShrinkwrap":false}},"time":{"created":"2020-05-23T16:55:05.573Z","1.0.0":"2020-05-23T16:55:06.002Z","modified":"2022-04-04T14:05:32.061Z","1.0.1":"2020-05-23T17:05:45.136Z","1.0.2":"2020-05-24T07:51:51.551Z"},"maintainers":[{"name":"longjiahui","email":"longjiahui@hotmail.com"}],"description":"- route\r - param\r - query\r - loginCheck\r - 基于`stage-1`的decorator，使用`@babel/plugin-proposal-decorators`插件时需要设置`{\"legacy\": true}`","homepage":"https://github.com/longjiahui/koa-serve-decorator#readme","keywords":[],"repository":{"type":"git","url":"git+https://github.com/longjiahui/koa-serve-decorator.git"},"bugs":{"url":"https://github.com/longjiahui/koa-serve-decorator/issues"},"license":"MIT","readme":"# feature\r\n\r\n- route\r\n- param\r\n- query\r\n- loginCheck\r\n- 基于`stage-1`的decorator，使用`@babel/plugin-proposal-decorators`插件时需要设置`{\"legacy\": true}`\r\n\r\n# Install\r\n\r\n`npm i koa-serve-decorator`\r\n\r\n# API\r\n\r\n### `@route(path: string, method?: string)`\r\n\r\n声明一个路由，可以装饰到类/方法上，可以在`routeAll`时提供`base: String`来设置baseURL\r\n\r\n### `@param(param: Object)`\r\n\r\n声明body参数的校验规则，如果不满足会抛出异常，会对`ctx.request.body`和`ctx.params`的内容进行校验，不能出现相同的变量名，因为是合在一起校验的\r\n\r\n### `@query(param: Object)`\r\n\r\n声明query参数的校验规则，如果不满足会抛出异常\r\n\r\n> 参数校验依赖于 [`validator-biang`](https://github.com/longjiahui/validator-biang)\r\n\r\n### `@loginCheck`\r\n\r\n声明是否需要检查用户是否登录，依赖[`jsonwebtoken`]([https://](https://www.npmjs.com/package/jsonwebtoken))，使用时需要在`routeAll`时提供`jwtSecret: String`, `getToken: Function`两个值\r\n\r\n解密的登陆数据会放在`ctx.request.user`中\r\n\r\n### `@service`\r\n\r\n装饰一个类，会在类中注入ctx成员，同时创建一个该类的对象挂载在ctx中，且不同的service之间可以互相调用。\r\n\r\n### `@beforeRoute`\r\n\r\n装饰service的类成员函数，此service的成员函数会在每次用户请求时被调用\r\n\r\n### `@afterRoute`\r\n\r\n装饰service的类成员函数，此service的成员函数会在每次用户请求后被调用\r\n\r\n### `routeAll(options: Object)`\r\n\r\n因为`@loginCheck`, `@route`, `@param`, `@query`之间在实现的层面存在顺序问题，所以他们的初始化都使用同一个`routeAll函数`，当然，**使用的顺序是不会影响结果的**，`serviceAll`应该在`routeAll`前被注册\r\n\r\n- `options`\r\n  - `jwtSecret: string` 提供`jsonwebtoken`库所需要的`jwtSecret`\r\n  - `getToken: Function` 提供`@loginCheck`所需要的`token`来源。\r\n  - `base: [0: path, 1?: method]` 提供所有`@route`标记的控制器的根路径\r\n    - e.g. `base: ['/api', 'all']`\r\n    - e.g. 只设置`method` `base: ['/', 'all']`\r\n    - e.g. 只设置`path` `base: ['/']`\r\n  \r\n### `serviceAll()`\r\n\r\n初始化所有的`@service`，实现service标记的功能，`serviceAll`应该在`routeAll`前被注册\r\n\r\n### `initAll(options: Object)`\r\n\r\n初始化全部decorators，会顺序调用`serviceAll`与`routeAll`\r\n\r\n- `options: Object`\r\n  - `route: Object` `routeAll`的参数\r\n  - `dirs: [[string]]` 指定该参数可以自动include所有的路由类和Service类，基于[`require-all`](https://github.com/felixge/node-require-all)\r\n    - e.g. 后面recursive部分的其它配置参考require-all的配置\r\n        ```javascript\r\n        initAll({\r\n            dirs: [\r\n                [`${__dirname}/controller`, {recursive: true}],\r\n                //...\r\n            ]\r\n        })\r\n        ```\r\n    - 当前默认的配置是 `filter: /.js$/` \r\n  - service还没有相关参数，所以位置如此预留了\r\n\r\n```javascript\r\n\r\nconst Koa = require('koa');\r\nconst {route, param, query, loginCheck, service, initAll} = require('koa-serve-decorator');\r\n\r\n@route('/post', 'get')\r\nclass A{\r\n\r\n    @route('/:id')\r\n    //id必须存在，同时为非空字符串\r\n    //详细规则参考 https://github.com/longjiahui/validator-biang\r\n    @param({\r\n        id: 'truthyString'\r\n    })\r\n    async a(ctx, next){\r\n        //路由是 get /post/:id\r\n    }\r\n\r\n    @loginCheck\r\n    @query({\r\n        content: 'truthyString',\r\n        title: 'truthyString',\r\n    })\r\n    @route('/save', 'put')\r\n    async b(ctx, next){\r\n        //路由是 put /post/save\r\n        //这里可以访问service\r\n        ctx.bService;\r\n        ctx.aService;\r\n    }\r\n}\r\n\r\n@service\r\nclass AService{\r\n    a(){\r\n        console.log('a');\r\n        //service可以访问service 或者ctx的其它内容\r\n        this.ctx.bService.b();\r\n    }\r\n}\r\n@service\r\nclass BService{\r\n    b(){\r\n        console.log('b');\r\n    }\r\n}\r\n\r\nlet app = new Koa();\r\napp.use(initAll({\r\n    route:{\r\n        // 设置baseURL 则@route监听的路由都会设置在/api下\r\n        base: ['/api', 'post'],\r\n        // 设置loginCheck所需要的参数\r\n        jwtSecret: 'secret',\r\n        getToken: ctx=>ctx.headers.authorization,\r\n    }\r\n}));\r\napp.listen(3000);\r\n```\r\n\r\n# 错误捕获\r\n\r\n已经错误会以错误码提供，详细信息参考`err.msg`字段\r\n\r\n```javascript\r\n//一个middleware\r\nconst {errno} = require('koa-serve-decorator');\r\n\r\nmodule.exports = async (ctx, next)=>{\r\n    try{\r\n        await next();\r\n    }catch(err){\r\n        if(err.code === errno.ERR_ARG){\r\n            //参数校验错误\r\n            console.log(err.msg);\r\n        }\r\n}\r\n```\r\n\r\n### 错误码 `errno`\r\n\r\n- `ERR_ARG`  参数错误\r\n- `ERR_NOTOKEN`  loginCheck时没获得token\r\n- `ERR_VERIFY_ERROR`  loginCheck校验失败\r\n- `ERR_GETTOKEN_ERROR`  获取token失败,\r\n- `ERR_GETJWTSECRET_ERROR`  获取jwtScret失败","readmeFilename":"README.md"}