摘要:本文首發(fā)于用控制路由在中長這樣還有上的框架兩者都用來控制路由,這樣寫的好處是更簡潔更優(yōu)雅更清晰。反觀或上的路由完全差了一個檔次從開始就有了,只是瀏覽器和都還沒有支持。
本文首發(fā)于:用Decorator控制Koa路由
在Spring中Controller長這樣
@Controller public class HelloController{ @RequestMapping("/hello") String hello() { return "Hello World"; } }
還有Python上的Flask框架
@app.route("/hello") def hello(): return "Hello World"
兩者都用decorator來控制路由,這樣寫的好處是更簡潔、更優(yōu)雅、更清晰。
反觀Express或Koa上的路由
router.get("/hello", async ctx => { ctx.body = "Hello World" })
完全差了一個檔次
JS從ES6開始就有Decorator了,只是瀏覽器和Node都還沒有支持。需要用babel-plugin-transform-decorators-legacy轉(zhuǎn)義。
Decorator基本原理首先需要明確兩個概念:
Decorator只能作用于類或類的方法上
如果一個類和類的方法都是用了Decorator,類方法的Decorator優(yōu)先于類的Decorator執(zhí)行
Decorator基本原理:
@Controller class Hello{ } // 等同于 Controller(Hello)
Controller是個普通函數(shù),target為修飾的類或方法
// Decorator不傳參 function Controller(target) { } // Decorator傳參 function Controller(params) { return function (target) { } }
如果Decorator是傳參的,即使params有默認值,在調(diào)用時必須帶上括號,即:
@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" } }
類內(nèi)部方法的裝飾器是優(yōu)先執(zhí)行的,我們需要對方法重新定義
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進行格式統(tǒng)一
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) { // 排除類的構(gòu)造方法 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即可。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/95612.html
摘要:注解方式為應用動態(tài)生成文檔目前我司服務端應用程序框架主要采用了與,而因為今年有很多的調(diào)研階段的產(chǎn)品線發(fā)布,持續(xù)部署接口文檔以及線上質(zhì)量監(jiān)控這三個問題愈發(fā)突出。 swagger-decorator:注解方式為 Koa2 應用自動生成 Swagger 文檔 從屬于筆者的服務端應用程序開發(fā)與系統(tǒng)架構(gòu),記述了如何在以 Koa2 與 koa-router 開發(fā)服務端應用時,通過自定義 swagg...
摘要:即為裝飾器函數(shù)的這里主要為了獲取路由路徑的前綴,為請求方法,為請求路徑,為請求執(zhí)行的函數(shù)。下邊是設置路由路徑前綴和塞入內(nèi)容的裝飾器函數(shù)就不多說了,就是掛載前綴路徑到類的原型對象上,這里需要注意的是作用于類,所以是被修飾的類本身。 很多面對象語言中都有裝飾器(Decorator)函數(shù)的概念,Javascript語言的ES7標準中也提及了Decorator,個人認為裝飾器是和async/a...
摘要:前言今天閑來時看了看中的新標準之一,裝飾器。過程中忽覺它和中的注解有一些類似之處,并且當前版本的中已經(jīng)支持它了,所以,就動手在一個應用中嘗鮮初體驗了一番。另外,由于裝飾器目前還是中的一個提案,其中具體細節(jié)可能還會更改。 前言 今天閑來時看了看ES7中的新標準之一,裝飾器(Decorator)。過程中忽覺它和Java中的注解有一些類似之處,并且當前版本的TypeScript中已經(jīng)支持它了...
摘要:中基于的自動實體類構(gòu)建與接口文檔生成是筆者對于開源項目的描述,對于不反感使用注解的項目中利用添加合適的實體類或者接口類注解,從而實現(xiàn)支持嵌套地實體類校驗與生成等模型生成基于的接口文檔生成等等功能。 JavaScript 中基于 swagger-decorator 的自動實體類構(gòu)建與 Swagger 接口文檔生成是筆者對于開源項目 swagger-decorator 的描述,對于不反感使...
摘要:最近新開了一個項目,采用來開發(fā),在數(shù)據(jù)庫及路由管理方面用了不少的裝飾器,發(fā)覺這的確是一個好東西。在中的使用該裝飾器會在定義前調(diào)用,如果函數(shù)有返回值,則會認為是一個新的構(gòu)造函數(shù)來替代之前的構(gòu)造函數(shù)。函數(shù)參數(shù)裝飾器最后,還有一個用于函數(shù)參 最近新開了一個Node項目,采用TypeScript來開發(fā),在數(shù)據(jù)庫及路由管理方面用了不少的裝飾器,發(fā)覺這的確是一個好東西。 裝飾器是一個還處于草案中...
閱讀 2025·2023-04-25 14:50
閱讀 2907·2021-11-17 09:33
閱讀 2611·2019-08-30 13:07
閱讀 2838·2019-08-29 16:57
閱讀 908·2019-08-29 15:26
閱讀 3540·2019-08-29 13:08
閱讀 1990·2019-08-29 12:32
閱讀 3383·2019-08-26 13:57