欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

在Spring中Controller長(zhǎng)這樣

@Controller
public class HelloController{
 @RequestMapping("/hello")
 String hello() {
 return "Hello World"; 
 }
}

還有Python上的Flask框架

@app.route("/hello")
def hello():
 return "Hello World"

兩者都用decorator來(lái)控制路由,這樣寫的好處是更簡(jiǎn)潔、更優(yōu)雅、更清晰。

反觀Express或Koa上的路由

router.get('/hello', async ctx => {
 ctx.body = 'Hello World'
})

完全差了一個(gè)檔次

JS從ES6開始就有Decorator了,只是瀏覽器和Node都還沒(méi)有支持。需要用babel-plugin-transform-decorators-legacy轉(zhuǎn)義。

Decorator基本原理

首先需要明確兩個(gè)概念:

  • Decorator只能作用于類或類的方法上
  • 如果一個(gè)類和類的方法都是用了Decorator,類方法的Decorator優(yōu)先于類的Decorator執(zhí)行

Decorator基本原理:

@Controller
class Hello{

}

// 等同于

Controller(Hello)

Controller是個(gè)普通函數(shù),target為修飾的類或方法

// Decorator不傳參
function Controller(target) {

}

// Decorator傳參
function Controller(params) {
 return function (target) {

 }
}

如果Decorator是傳參的,即使params有默認(rèn)值,在調(diào)用時(shí)必須帶上括號(hào),即:

@Controller()
class Hello{

}

如何在Koa中使用Decorator

我們可以對(duì)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í)行的,我們需要對(duì)方法重新定義

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)
  })
 }
 }
}

對(duì)RequestMethod進(jìn)行格式統(tǒng)一

const RequestMethod = {
 GET: 'get',
 POST: 'post',
 PUT: 'put',
 DELETE: 'delete'
}

Controller裝飾器需將Request方法添加到Router實(shí)例并返回Router實(shí)例

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實(shí)例中同路由一樣use即可。

總結(jié)

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

相關(guān)文章

  • 基于nodejs+express(4.x+)實(shí)現(xiàn)文件上傳功能

    基于nodejs+express(4.x+)實(shí)現(xiàn)文件上傳功能

    通過(guò)一段時(shí)間的查閱資料發(fā)現(xiàn)實(shí)現(xiàn)上傳的方式有:1.express中間件multer模塊2.connect-multiparty模塊(但現(xiàn)在 官方不推薦 )3.使用multiparty模塊實(shí)現(xiàn)4.使用formidable插件實(shí)現(xiàn),本文給大家介紹nodejs+express(4.x+)實(shí)現(xiàn)文件上傳功能,需要的朋友參考下
    2015-11-11
  • Node.js操作Firebird數(shù)據(jù)庫(kù)教程

    Node.js操作Firebird數(shù)據(jù)庫(kù)教程

    這篇文章主要為大家分享了Node.js操作Firebird數(shù)據(jù)庫(kù)教程,思路清晰便于大家理解,感興趣的小伙伴們可以參考一下
    2016-03-03
  • Node.js?與并發(fā)模型的詳細(xì)介紹

    Node.js?與并發(fā)模型的詳細(xì)介紹

    這篇文章主要介紹了Node.js?與并發(fā)模型的詳細(xì)介紹,Node.js?現(xiàn)在已成為構(gòu)建高并發(fā)網(wǎng)絡(luò)應(yīng)用服務(wù)工具箱中的一員,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,需要的朋友可以參考一下
    2022-07-07
  • nodejs判斷文件、文件夾是否存在及刪除的方法

    nodejs判斷文件、文件夾是否存在及刪除的方法

    這篇文章主要介紹了nodejs判斷文件、文件夾是否存在及刪除的方法,結(jié)合實(shí)例形式分析了nodejs基于文件模塊針對(duì)文件與文件夾的存在判斷、刪除等操作技巧,需要的朋友可以參考下
    2017-11-11
  • node.js express cors解決跨域的示例代碼

    node.js express cors解決跨域的示例代碼

    在Web開發(fā)中,當(dāng)一個(gè)網(wǎng)頁(yè)的源與另一個(gè)網(wǎng)頁(yè)的源不同時(shí),就發(fā)生了跨域,本文就來(lái)介紹一下node.js express cors解決跨域的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 詳解用node-images 打造簡(jiǎn)易圖片服務(wù)器

    詳解用node-images 打造簡(jiǎn)易圖片服務(wù)器

    本篇文章主要介紹了詳解用node-images 打造簡(jiǎn)易圖片服務(wù)器,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • nodejs 中模擬實(shí)現(xiàn) emmiter 自定義事件

    nodejs 中模擬實(shí)現(xiàn) emmiter 自定義事件

    這篇文章主要介紹了Nodejs中自定義事件實(shí)例,比較簡(jiǎn)單的一個(gè)例子,需要的朋友可以參考下。
    2016-02-02
  • Node.js編程中客戶端Session的使用詳解

    Node.js編程中客戶端Session的使用詳解

    這篇文章主要介紹了Node.js編程中客戶端Session的使用詳解,是Node.js入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-06-06
  • Nest.js環(huán)境變量配置與序列化詳解

    Nest.js環(huán)境變量配置與序列化詳解

    這篇文章主要給大家介紹了關(guān)于Nest.js環(huán)境變量配置與序列化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 詳解如何修改 node_modules 里的文件

    詳解如何修改 node_modules 里的文件

    這篇文章主要介紹了詳解如何修改node_modules里的文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05

最新評(píng)論