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

首頁 > 開發(fā) > JS > 正文

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

2024-05-06 16:45:03
字體:
供稿:網(wǎng)友

前言

在Spring中Controller長這樣

@Controllerpublic class HelloController{ @RequestMapping("/hello") String hello() { return "Hello World";  }}

還有Python上的Flask框架

@app.route("/hello")def hello(): return "Hello World"

兩者都用decorator來控制路由,這樣寫的好處是更簡潔、更優(yōu)雅、更清晰。

反觀Express或Koa上的路由

router.get('/hello', async ctx => { ctx.body = 'Hello World'})

完全差了一個檔次

JS從ES6開始就有Decorator了,只是瀏覽器和Node都還沒有支持。需要用babel-plugin-transform-decorators-legacy轉(zhuǎn)義。

Decorator基本原理

首先需要明確兩個概念:

  • Decorator只能作用于類或類的方法上
  • 如果一個類和類的方法都是用了Decorator,類方法的Decorator優(yōu)先于類的Decorator執(zhí)行

Decorator基本原理:

@Controllerclass Hello{}// 等同于Controller(Hello)

Controller是個普通函數(shù),target為修飾的類或方法

// Decorator不傳參function Controller(target) {}// Decorator傳參function Controller(params) { return function (target) { }}

如果Decorator是傳參的,即使params有默認值,在調(diào)用時必須帶上括號,即:

@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' }}

類內(nèi)部方法的裝飾器是優(yōu)先執(zhí)行的,我們需要對方法重新定義

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進行格式統(tǒng)一

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) {  // 排除類的構(gòu)造方法  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即可。

總結(jié)

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 锡林浩特市| 洪洞县| 灵山县| 鹰潭市| 青阳县| 理塘县| 五寨县| 凤城市| 湘潭县| 天祝| 翁牛特旗| 莎车县| 鄱阳县| 南昌县| 新乡县| 连平县| 恩平市| 沂南县| 永康市| 遂平县| 信丰县| 阳朔县| 清水县| 栖霞市| 时尚| 长泰县| 当阳市| 永平县| 油尖旺区| 南陵县| 邯郸市| 石嘴山市| 阿图什市| 大埔区| 云霄县| 汶川县| 中西区| 文化| 温宿县| 酉阳| 横峰县|