在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請求方法的裝飾...