用Decorator控制Koa路由

2021-09-13 16:27:51 字數 2082 閱讀 8903

在spring中controller長這樣

@controller

public class hellocontroller

}

還有python上的flask框架

def hello():

return "hello world"

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

反觀express或koa上的路由

router.get('/hello', async ctx => )
完全差了乙個檔次

js從es6開始就有decorator了,只是瀏覽器和node都還沒有支援。需要用babel-plugin-transform-decorators-legacy轉義。

首先需要明確兩個概念:

decorator只能作用於類或類的方法上

如果乙個類和類的方法都是用了decorator,類方法的decorator優先於類的decorator執行

decorator基本原理:

@controller

class hello

// 等同於

controller(hello)

controller是個普通函式,target為修飾的類或方法

// decorator不傳參

function controller(target)

// decorator傳參

function controller(params)

}

如果decorator是傳參的,即使params有預設值,在呼叫時必須帶上括號,即:

@controller()

class hello

我們可以對koa-router中介軟體進行包裝

先回顧一下koa-router基本使用方法:

var koa = require('koa');

var router = require('koa-router');

var router = new router();

router.get('/', async (ctx, next) => );

.use(router.routes())

.use(router.allowedmethods());

再想象一下最終目標

@controller()

class hellocontroller)

async hello(ctx)

}

類內部方法的裝飾器是優先執行的,我們需要對方法重新定義

function request() )}}

}

對requestmethod進行格式統一

const requestmethod =
controller裝飾器需將request方法新增到router例項並返回router例項

import koarouter from 'koa-router'

function controller()

return function (target)

}return router}}

至此,裝飾器基本功能就完成了,基本使用方法為:

import  from './decorator'

@controller()

export default class hellocontroller)

async hello(ctx)

}

我的部落格:bougie的部落格

koa 中介軟體流程控制

koa中介軟體的的執行順序是洋蔥模型,外層逐步向內,執行到最中間再逐步向外擴充套件,實現這個順序的模型需要依賴於generator函式,它可以暫停執行將控制權交出,等到執行next再得到執行權繼續執行,我們需要做的就是將generator串聯起來,將後面的generator函式跟在上一層函式的yie...

用decorator來裝飾動態的左側選單和內容部分

sitemmesh是乙個頁面裝飾框架,利用它可以很簡單的對整個系統進行統一架構裝飾,比如乙個應用系統的web層可能就是top left content footer四個部分組成 下圖 使用sitemesh定義好乙個統一的框架後,程式設計師只需要關注動態的內容部分就可以了,而不需要在每個頁面去單獨的i...

用裝飾器的語法寫koa路由

src constants.ts 常量 controller.ts controller 裝飾器 index.ts 入口檔案 injectable.ts injectable 裝飾器,宣告可被注入的類 injector.ts 注射器 inte ce ts request.ts http請求方法的裝飾...