利用Decorator怎样控制Koa路由-创新互联
小编给大家分享一下利用Decorator怎样控制Koa路由,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
创新互联公司专注于企业网络营销推广、网站重做改版、谢通门网站定制设计、自适应品牌网站建设、H5页面制作、商城网站建设、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为谢通门等各大城市提供网站开发制作服务。前言
在Spring中Controller长这样
@Controller public class HelloController{ @RequestMapping("/hello") String hello() { return "Hello World"; } }
还有Python上的Flask框架
@app.route("/hello") def hello(): return "Hello World"
两者都用decorator来控制路由,这样写的好处是更简洁、更优雅、更清晰。
反观Express或Koa上的路由
router.get('/hello', async ctx => { ctx.body = 'Hello World' })
完全差了一个档次
JS从ES6开始就有Decorator了,只是浏览器和Node都还没有支持。需要用babel-plugin-transform-decorators-legacy转义。
Decorator基本原理
首先需要明确两个概念:
Decorator只能作用于类或类的方法上
如果一个类和类的方法都是用了Decorator,类方法的Decorator优先于类的Decorator执行
Decorator基本原理:
@Controller class Hello{ } // 等同于 Controller(Hello)
Controller是个普通函数,target为修饰的类或方法
// Decorator不传参 function Controller(target) { } // Decorator传参 function Controller(params) { return function (target) { } }
如果Decorator是传参的,即使params有默认值,在调用时必须带上括号,即:
@Controller() class Hello{ }
如何在Koa中使用Decorator
我们可以对koa-router中间件进行包装
先回顾一下koa-router基本使用方法:
var Koa = require('koa'); var Router = require('koa-router'); var app = new Koa(); var router = new Router(); router.get('/', async (ctx, next) => { // ctx.router available }); app .use(router.routes()) .use(router.allowedMethods());
再想象一下最终目标
@Controller({prefix: '/hello'}) class HelloController{ @Request({url: '/', method: RequestMethod.GET}) async hello(ctx) { ctx.body = 'Hello World' } }
类内部方法的装饰器是优先执行的,我们需要对方法重新定义
function Request({url, method}) { return function (target, name, descriptor) { let fn = descriptor.value descriptor.value = (router) => { router[method](url, async(ctx, next) => { await fn(ctx, next) }) } } }
对RequestMethod进行格式统一
const RequestMethod = { GET: 'get', POST: 'post', PUT: 'put', DELETE: 'delete' }
Controller装饰器需将Request方法添加到Router实例并返回Router实例
import KoaRouter from 'koa-router' function Controller({prefix}) { let router = new KoaRouter() if (prefix) { router.prefix(prefix) } return function (target) { let reqList = Object.getOwnPropertyDescriptors(target.prototype) for (let v in reqList) { // 排除类的构造方法 if (v !== 'constructor') { let fn = reqList[v].value fn(router) } } return router } }
至此,装饰器基本功能就完成了,基本使用方法为:
import {Controller, Request, RequestMethod} from './decorator' @Controller({prefix: '/hello'}) export default class HelloController{ @Request({url: '/', method: RequestMethod.GET}) async hello(ctx) { ctx.body = 'Hello World' } }
在App实例中同路由一样use即可。
以上是“利用Decorator怎样控制Koa路由”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联成都网站设计公司行业资讯频道!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网页标题:利用Decorator怎样控制Koa路由-创新互联
链接地址:http://cdiso.cn/article/ccddic.html