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

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 15:33:09
字體:
來源:轉載
供稿:網友

前言

在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 }}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 晋中市| 合作市| 廊坊市| 桐庐县| 穆棱市| 新密市| 比如县| 迁西县| 舞钢市| 蓬莱市| 开封市| 鄯善县| 麻江县| 大邑县| 南康市| 沅陵县| 岑溪市| 曲沃县| 长阳| 仲巴县| 寻乌县| 荣昌县| 内江市| 栾城县| 如皋市| 海丰县| 巴林右旗| 黑水县| 青海省| 沽源县| 平遥县| 股票| 博野县| 清镇市| 杭州市| 齐齐哈尔市| 西昌市| 腾冲县| 元谋县| 葵青区| 腾冲县|