用裝飾器的語法寫koa路由

2021-09-29 20:25:02 字數 4650 閱讀 7410

├── src

│ ├── constants.ts // 常量

│ ├── controller.ts // @controller 裝飾器

│ ├── index.ts // 入口檔案

│ ├── injectable.ts // @injectable 裝飾器,宣告可被注入的類

│ ├── injector.ts // 注射器

│ ├── inte***ce

.ts│ ├── request.ts // http請求方法的裝飾器, @get @post

│ ├── router.ts // 載入路由

│ └── utils.ts

├── package

-lock.json

├── package

.json

├── tsconfig.json

└── tslint.json

1. 定義http請求方法的裝飾器
// request.ts

import

'reflect-metadata'

;import

from

'./inte***ce'

;import

from

'./constants'

;export

const get =

createdecorator

('get');

export

const post =

createdecorator

('post');

export

const put =

createdecorator

('put');

export

const delete =

createdecorator

('delete');

export

const options =

createdecorator

('options');

export

const patch =

createdecorator

('patch');

// 裝飾器工廠構造器

function

createdecorator

(method: requestmethod)

, key: string, descriptor: propertydescriptor);}

;}

2. 定義controller裝飾器,宣告該類是乙個控制器,用於後面載入路由
/// controller.ts

import

'reflect-metadata'

;import

from

'./inte***ce'

;import

from

'./constants'

;export

function

controller

(path ='')

;}

3. 定義乙個注射器,依賴注入的容器
// injector.ts

import

'reflect-metadata'

;import

from

'./inte***ce'

;// 乙個單例注射器類

class

injector

// 獲取注射器例項

static

getinstance()

return injector.injector;

}// 新增依賴到注入容器

inject

(target: constructor)

elseif(

!this

.providermap.

has(p))}

this

.providermap.

set(target, target)

;// 依賴放入到容器中

}// 建立乙個例項化工廠,真正的為給定的類注入依賴

factory

(target: constructor)

else

if(item.length)

else})

;return

newtarget

(...dependencies)

;// 把所有的依賴注入的給定的類}}

// 獲取注射器例項並匯出

const rootinjector = injector.

getinstance()

;export

;

4. 定義可被注入類的裝飾器
// injectable.ts

import

from

'./injector'

;export

function

injectable()

;}

5. 構建路由,例項化控制器
// router.ts

import

'reflect-metadata'

;import

from

'./constants'

;import

*as router from

'koa-router'

;import

from

'./inte***ce'

;import

from

'./utils'

;import

from

'./injector'

;// 初始化路由

export

function

initrouter

(controller: constructor)

= item;

switch

(method)

}return router;

}// 自動載入給定路徑下面,*.controller.ts 檔案下的控制器,繫結路由

export

async

function

autorouter

(rootdir: string)

else})

.filter

(item => item)

;// 遍歷控制器,繫結合併路由

controllerclass.

foreach

(item =>);

}return router;

}// 獲取controller的路由對映

function

maproute

(controller: constructor)`;

// 如果沒有傳遞路徑,預設使用方法名

url = prefix + url;

// 合併路由

return

;// 返回乙個路由對映,bind重新繫結this})

;}

到這裡,所有的邏輯全部實現完畢。

├── src

│ ├── user.controller.ts

│ ├── user.service.ts

│ ├── user.model.ts

│ └── utils.ts

├── package

-lock.json

├── package

.json

├── tsconfig.json

└── tslint.json

// user.controller.ts

@contriller()

export

class

usercontroller

// 注入服務

@get()

async

userinfo

(ctx: context, next:()

=> promise

)= ctx.request.body

const info =

await

this

.userservuce.

getuserinfobyid

(id)

; ctx.body = info;}}

// user.service.ts

@injectable()

export

class

userservice

async

getuserinfobyid

(id: number)

}// user.model.ts

@injectable()

export

class

usermodel

async

findbyid

(id: number));

return user;

}}

**已上傳至github koa-route-decors, 完整的koa專案實現例子huzz-koa-template,也可以看我的另外一篇文章nodejs專案的正確開啟方式,typescript + koa

flask的路由配置,特殊裝飾器

1,flask中的路由 2,flask中的例項化配置 class debug object 4,blueprint 5,特殊裝飾器 def af1 response 正常 be1 be2 be3 af3 af2 af1 異常 be1 af3 af2 af1 def error404 args 基於藍...

python裝飾器 AOP的語法糖

python裝飾器是乙個很出名的設計模式,它主要的功能就是不改變函式已有功能的情況下對函式起到乙個錦上添花的作業,使函式的功能更加豐富,在插入日誌,效能測試,快取機制和許可權驗證都是比較好的左右。不同的函式可以使用同乙個裝飾器,所以它和函式本身不存在什麼必然的聯絡。def timeit func d...

mini web之裝飾器方式的新增路由

前面我們已經實現了路由列表,但是每次新增路由都需要手動新增來完成,接下來我們想要完成路由的自動新增,可以通過裝飾器來實現,在使用裝飾器對處理函式進行裝飾的時候我們需要知道裝飾的函式和那個請求路徑進行關聯,也就是說裝飾器需要接收乙個url引數,這樣我們定義的裝飾器是乙個帶有引數的裝飾器。framewo...