開源 NodeJS仿WebApi路由

2021-07-31 14:00:41 字數 3482 閱讀 8191

用過webapi或asp.net mvc的都知道微軟的路由設計得非常好,十分方便,也十分靈活。雖然個人看來是有的太靈活了,team內的不同開發很容易使用不同的路由方式而顯得有點混亂。 不過這不是重點,我在做node專案的時候就覺得不停的用use(...)來指定路由路徑很煩人,所以用typescript寫了這個基於koakoa-router的路由外掛程式,可以簡單實現一些類似webapi的路由功能。

目標是和webapi一樣:

加入的controller會自動加入路由。

也可以通過path()手動指定路由。

可以定義http method, 如getpost等。

api的引數可以指定url裡的query param、path param以及body等。

包已經上傳到npm中,npm install webapi-router 安裝,可以先看看效果:

所有的controller都在這目錄下,這樣會根據物理路徑自動算出路由。 url的固定字首就是host和路由之間的,比如localhost/api/v2/user/nameapi/v2就是這個固定字首。

import  from 'webapi-router';
export class testcontroller extends basecontroller

@post('/user/:name')

postwithpathparam(@pathparam('name') name: string, @queryparam('id') id: string, @bodyparam body: any) , body: $`);

return 'ok';

}

@post裡的引數是可選的,空的話會用這個controller的物理路徑做為路由位址。

:name是路徑裡的變數,比如/user/brook,:name就是brook,可以在方法的引數裡用@pathparam得到

@queryparam可以得到url?後的引數

@bodyparam可以得到post上來的body

是不是有點webapi的意思了。

實現過程其實很簡單,從上面的目標入手,首先得到controllers的物理路徑,然後還要得到被裝飾器裝飾的方法以及它的引數。

裝飾器的目的在於要得到是get還是post等,還有就是指定的path,最後就是把node request裡的資料賦值給方法的引數。

核心**:

initrouterforcontrollers() 

});}

private buildcontrollerrouter(file: string)
裝飾器需要引入reflect-metadata

先看看方法的裝飾器,@get,@post之類的,實現方法是給裝飾的方法加乙個屬性routerrouter是個symbol,確保唯一。 然後分析裝飾的功能存到這個屬性中,比如methodpath等。

export function get(path?: string)  

function setmethoddecorator(target: basecontroller, name: string, method: string, path?: string);

target[router][name] = target[router][name] || {};

target[router][name].method = method;

target[router][name].path = path;

}

另外還有引數裝飾器,用來給引數賦上request裡的值,如body,param等。

export function bodyparam(target: basecontroller, name: string, index: number) );

}function setparamdecorator(target: basecontroller, name: string, index: number, value: ) ;

target[router][name] = target[router][name] || {};

target[router][name].params = target[router][name].params || ;

target[router][name].params[index] = ;

}

這樣裝飾的資料就存到物件的router屬性上,後面構建路由時就可以用了。

上面從物理路徑得到了路由,但是是以裝飾裡的引數路徑優先,所以先看看剛在存在原型裡的router屬性裡有沒有path,有的話就用這個作為路由,沒有path就用物理路由。

private setrouterforclass(exportclass: any, file: string) $` : `/$$/$`);

}}

給controller裡的方法引數賦上值並繫結路由到koarouter

private setrouterforfunction(method: string, controller: any, funcname: string, routerpath: string));

}private async execapi(ctx: koa.context, next: function, controller: any, funcname: string) : promise

catch(err)

}private buildfuncparams(ctx: any, controller: any, func: function) else }}

return params;

}private getparam(ctx: any, paramtype: paramtype, name: string)

}

Nodejs仿Apache的部分功能

1.載入模組 2.建立server 3.監聽server的request請求事件,設定請求處理函式 var wwwdir c users administrator desktop code 設定目錄 注意轉義符 1.載入模組 2.建立server 3.監聽server的request請求事件,設定...

NodeJS開源系統Mili簡介

mili是乙個開源的社群系統,介面優雅,功能豐富。已在公尺粒網 得到應用,你完全可以用它來搭建自己的社群。mili的前端使用vue iview等技術來開發,後端使用typescript nodejs nestjs typeorm等技術來開發。軟體版本 nginx 1.17.1 node.js 8.4...

ReactNative 開源專案 仿優購商城

開源動力,仿優購網 use rn and redux 本專案適合有rn基礎和redux基礎 暫時只適配ios 後期會持續更新適配安卓 如果暫時想適配安卓的可切換注釋 tabbarview.js 的 基本能執行 效果比較差 git clone git cd reactnative shopping n...