国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

利用Decorator如何控制Koa路由詳解

2019-11-19 13:36:27
字體:
來源:轉載
供稿:網友

前言

在Spring中Controller長這樣

@Controllerpublic 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基本原理:

@Controllerclass 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即可。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 夏津县| 桑日县| 河南省| 内黄县| 原平市| 惠州市| 新民市| 鄄城县| 社旗县| 吴川市| 康马县| 汉中市| 淮阳县| 满城县| 库伦旗| 密云县| 康马县| 瑞昌市| 上饶市| 合水县| 汝城县| 杭州市| 泾川县| 章丘市| 乡城县| 高邑县| 农安县| 封丘县| 咸丰县| 雅江县| 阿拉尔市| 潢川县| 海阳市| 洞头县| 肥西县| 文水县| 巴楚县| 通辽市| 营山县| 新宁县| 通榆县|