最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Decorator如何控制Koa路由詳解

 更新時間:2018年06月26日 08:45:48   作者:Bougie  
最近學(xué)習(xí)了plover的底層框架koa,所以下面這篇文章主要給大家介紹了關(guān)于利用Decorator如何控制Koa路由的相關(guān)資料,,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來隨著小編一起學(xué)習(xí)學(xué)習(xí)吧

前言

在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有默認(rèn)值,在調(diào)用時必須帶上括號,即:

@Controller()
class Hello{

}

如何在Koa中使用Decorator

我們可以對koa-router中間件進(jìn)行包裝

先回顧一下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());

再想象一下最終目標(biāo)

@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進(jìn)行格式統(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即可。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 利用node.js啟動本地服務(wù)器的操作指南(超詳細(xì))

    利用node.js啟動本地服務(wù)器的操作指南(超詳細(xì))

    這篇文章主要介紹了利用node.js啟動本地服務(wù)器的操作指南(超詳細(xì)),有很多小伙伴制作網(wǎng)站或者小程序時,需要通過服務(wù)器來把前端和后端連接起來,那么我們今天學(xué)習(xí)啟動node.js服務(wù)器,文中有詳細(xì)的代碼示例和圖文供大家參考,具有一定的參考價值,需要的朋友可以參考下
    2024-05-05
  • 深入淺析Node.js 事件循環(huán)

    深入淺析Node.js 事件循環(huán)

    Node.js 是單進(jìn)程單線程應(yīng)用程序,但是通過事件和回調(diào)支持并發(fā),所以性能非常高,本文給大家介紹nodejs事件循環(huán)相關(guān)知識,對此感興趣的朋友快來學(xué)習(xí)吧
    2015-12-12
  • Nodejs開發(fā)grpc的實例代碼

    Nodejs開發(fā)grpc的實例代碼

    Nodejs開發(fā)grpc包含靜態(tài)和動態(tài)兩種代碼生成方式,靜態(tài)代碼生成需要提前通過.proto文件編譯生成JS源碼,而動態(tài)代碼生成則是在運行時指定IDL文件位置,實時生成源碼,兩者各有優(yōu)缺點,本文給大家介紹Nodejs開發(fā)grpc的實例代碼,感興趣的朋友一起看看吧
    2024-10-10
  • 從零揭秘npm install的黑科技

    從零揭秘npm install的黑科技

    通過npm package manager來安裝和管理包是我們最為常見的方式之一,本文將從淺入深地帶大家剖析一下npm install的執(zhí)行過程,感興趣的可以學(xué)習(xí)一下
    2023-05-05
  • nodejs模塊系統(tǒng)源碼分析

    nodejs模塊系統(tǒng)源碼分析

    這篇文章主要介紹了nodejs模塊系統(tǒng)源碼分析,對nodejs感興趣的同學(xué),可以參考下
    2021-05-05
  • Node.js重新刷新session過期時間的方法

    Node.js重新刷新session過期時間的方法

    在Node.js中,我們通常使用express-session這個包來使用和管理session,保存服務(wù)端和客戶端瀏覽器之間的會話狀態(tài)。那如何才能實現(xiàn)當(dāng)用戶刷新當(dāng)前頁面或者點擊頁面上的按鈕時重新刷新session的過期時間呢,接下來通過本文一起學(xué)習(xí)吧
    2016-02-02
  • nvm安裝步驟及使用方法

    nvm安裝步驟及使用方法

    nvm是一個管理nodejs版本的工具。在實際的開發(fā)中,有些項目的開發(fā)依賴需要低版本的nodejs運行環(huán)境,有些則需要高版本的nodejs,此時我們就需要使用nvm來切換nodejs版本,接下來通過本文給大家講解nvm安裝步驟及使用方法,感興趣的朋友一起看看吧
    2023-01-01
  • nodeJS代碼實現(xiàn)計算交社保是否合適

    nodeJS代碼實現(xiàn)計算交社保是否合適

    本文通過nodejs的一個具體示例來對比分析現(xiàn)階段我們交社保合不合適,主要是對nodejs的一個小的應(yīng)用,當(dāng)然大家也可以改成其他語言的,程序猿們,來算算吧。
    2015-03-03
  • Node.js中修改全局變量的方式及注意事項

    Node.js中修改全局變量的方式及注意事項

    本文詳細(xì)介紹了在Node.js中如何修改全局變量,包括全局變量的定義方式、正確的修改姿勢、潛在的隱患及其解決方案,以及推薦的替代方案,總結(jié)建議了在實際應(yīng)用中應(yīng)盡量避免使用全局變量,轉(zhuǎn)而采用模塊化、可維護(hù)性更高的方法,感興趣的朋友一起看看吧
    2025-02-02
  • 關(guān)于npm install過程失敗的幾種處理方式

    關(guān)于npm install過程失敗的幾種處理方式

    這篇文章主要介紹了關(guān)于npm install過程失敗的幾種處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評論

襄樊市| 稻城县| 广东省| 海城市| 南漳县| 和顺县| 黄浦区| 五大连池市| 潞西市| 应用必备| 杭锦后旗| 沙田区| 民县| 剑川县| 清涧县| 清徐县| 西乡县| 乌兰察布市| 乌兰浩特市| 博乐市| 玛多县| 凌源市| 大足县| 顺昌县| 砚山县| 巴南区| 新闻| 三亚市| 阿尔山市| 昭通市| 吕梁市| 蕉岭县| 英山县| 漠河县| 平原县| 东台市| 荆州市| 工布江达县| 绥芬河市| 黔西县| 娱乐|