国产探花免费观看_亚洲丰满少妇自慰呻吟_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 }}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 岢岚县| 峡江县| 翁源县| 越西县| 永靖县| 丰原市| 多伦县| 金塔县| 宁陵县| 翁牛特旗| 东乡族自治县| 吉木萨尔县| 神农架林区| 峡江县| 增城市| 峨眉山市| 稷山县| 客服| 伊吾县| 新龙县| 平利县| 武隆县| 建平县| 昭苏县| 扶沟县| 郸城县| 祁阳县| 赞皇县| 鲁山县| 崇信县| 安国市| 图木舒克市| 阿拉善盟| 泾阳县| 新源县| 华容县| 莲花县| 长阳| 武安市| 海盐县| 合川市|