国产探花免费观看_亚洲丰满少妇自慰呻吟_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即可。

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平南县| 沧州市| 拜城县| 广州市| 灵川县| 广南县| 明光市| 彩票| 云南省| 分宜县| 临洮县| 合阳县| 临夏市| 安西县| 澜沧| 宁明县| 项城市| 偃师市| 西华县| 山阴县| 高陵县| 横峰县| 依安县| 什邡市| 和静县| 凤山市| 新晃| 长岭县| 长春市| 丰顺县| 漯河市| 津市市| 怀远县| 牡丹江市| 霍邱县| 乐都县| 额济纳旗| 秭归县| 绥芬河市| 怀宁县| 任丘市|