成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

一文聊聊node后端路由自動加載

一文聊聊node后端路由自動加載

本文適宜人群

有一定基礎(chǔ)的Node.js開發(fā)人員

難易程度

中等

背景

今天來談?wù)刵ode后端中路由的問題。【相關(guān)教程推薦:nodejs視頻教程】

我們前端同學或者是nodejs服務(wù)端的同學,在你們使用express和koajs寫接口的時候, 咱們是不都要寫路由 比如如下

登錄接口router.post('/user/login', user.login);

獲取用戶信息接口router.get('/user/info', checkAuth, user.xxx);

這種寫法很常見, 先注冊路由,再指定后續(xù)要執(zhí)行的中間件方法。

可是當接口越來越多,比如有1000個接口, 就得這樣注冊1000次,多了我認為是一件很麻煩且不優(yōu)雅的事情

koa&express 路由注冊示例

const express = require('express'); const router = express.Router(); const user = require('../../controllers/user'); const tokenCheck = require('../../middleware/token_check_api');  //用戶注冊 router.post('/user/register', user.register); //用戶登錄 router.post('/user/login', user.login); router.post('xxx', tokenCheck, user.xxx); ...假裝還有有1000個
登錄后復(fù)制

寫1000個接口就要在router.js里注冊1000次嗎?

eggjs路由注冊示例

'use strict';  // egg-router extends koa-router  import { Application } from 'egg';  export default (app: Application) => {   const { router, controller, middleware } = app;   router.get('/', middleware.special(), controller.home.index);   router.get('/1', middleware.special(), controller.home.index1);   ....   router.get('/error', controller.home.error); };
登錄后復(fù)制

**這種項目擴大時候, 我認為這種配置會顯得很冗余,所以就需要實現(xiàn)一種路由自動加載的機制來改善它優(yōu)化它。

1、提升效率

2、更優(yōu)雅的編寫

常見的路由自動加載

接觸下來, 我發(fā)現(xiàn)有幾個框架用不同方法實現(xiàn)了路由自動加載。

一、think系列

第一個是thinkPHP和thinkjs, 參考鏈接 thinkjs.org/zh-cn/doc/3…

他兩的關(guān)系屬于是thinkjs是后來按照thinkPHP的思想設(shè)計開發(fā)的。

他兩路由自動加載屬于基于文件的, 就是說你按控制器的名字和方法名寫好,直接就可以訪問路由,不需要額外的配置。

1、thinkphp的路由自動加載

tp是 按模塊/控制器/方法文件名 自動加載

module?/controller/Action
登錄后復(fù)制

比方下面這個Admin模塊下, AdlistController.class.php里 index方法 他的路由就會自動加載為 Admin/adList/index

一文聊聊node后端路由自動加載

2、thinkjs的路由自動加載

控制器文件文件自動加載邏輯

1)、應(yīng)用初始化,創(chuàng)建實例
….

2)、遍歷控制器目錄, 加載控制器

得到目錄文件對應(yīng)的導出class的 Map
例如 Controller目錄下 他會加載出來模塊、控制器、方法掛在他的app上。

一文聊聊node后端路由自動加載

{   '/order': [class default_1 extends default_1],   '/user': [class default_1 extends default_1] }
登錄后復(fù)制

3、控制器匹配部分

上一步是在thinkjs應(yīng)用啟動階段做的事情。

這一步 控制器匹配部分 是在當請求進來的時候做的事情。

就是當請求進來,會先進過,think-router 把module, controller, action ,解析出來掛在ctx上。

在這里拿ctx上本次請求的module, controller, action去和啟動時掛在app的 module, controller, action,列表去匹配, 如果有就執(zhí)行。

think-controller的匹配邏輯詳見 github.com/thinkjs/thi…

thinkjs和koa-router路由匹配的區(qū)別

1、 think think-router解析完, think-controller去匹配執(zhí)行, 他這個是動態(tài)匹配。
2、koa-router 匹配到路由后, 自己再用koa-compose組裝一個小洋蔥圈去執(zhí)行
! 這種我的理解是程序啟動就注冊好的順序image.png

一文聊聊node后端路由自動加載

一文聊聊node后端路由自動加載

總結(jié):thinkjs是先把你的控制器和方法加載出來, 最后當請求進來的時候,利用think-controller 去先匹配模塊/控制器,再匹配方法, 如果有的話就幫你執(zhí)行,沒有的話,就404

二、以egg改造版為例 裝飾器的路由自動加載

裝飾器的寫法類似于 java spring中的注解

node框架中 nestjsmidwayjs已經(jīng)全面擁抱了裝飾器路由。

  • 寫法比較優(yōu)雅
  • 建議控制器的文件名和控制器名字保持一致, 這樣你找api也比較好找 比如控制的文件名字叫 home.ts , 那你控制器注冊也寫 @controller('/home') 來保持一致。

1、 控制器裝飾器 @controller('/order')

'use strict';  import { Context } from 'egg'; import BaseController from './base'; import { formatDate } from '~/app/lib/utils'; import { SelfController, Get } from './../router'  @SelfController('/home') export default class HomeController extends BaseController {   [x: string]: any;   @validate()   @Get("/")   public async index(): Promise<void> {}    }
登錄后復(fù)制

2、方法裝飾器 @Get('/export')、 @Post('/list')

get接口 就是 @Get()

post的接口 就是 @Post()

  @Get("/")   public async index(): Promise<void> {}    @Post("/update")   public async update(): Promise<void> {}
登錄后復(fù)制

3、裝飾器路由統(tǒng)一注冊

這里統(tǒng)一按egg的方法循環(huán)注冊路由

'use strict';  import { Application, Context } from 'egg'; import 'reflect-metadata';  const CONTROLLER_PREFIX: string = ''; const methodMap: Map<string, any> = new Map<string, any>(); const rootApiPath: string = '';  interface CurController {   pathName: string;   fullPath: string; }  /**  * controller 裝飾器,設(shè)置api公共前綴  * @param pathPrefix {string}  * @constructor  */ export const SelfController = (pathPrefix?: string): ClassDecorator => (targetClass): void => {   // 在controller上定義pathPrefix的元數(shù)據(jù)   // https://github.com/rbuckton/reflect-metadata    (Reflect as any).defineMetadata(CONTROLLER_PREFIX, pathPrefix, targetClass); };  const methodWrap = (path: string, requestMethod: string): MethodDecorator => (target, methodName): void => {   // 路由裝飾器參數(shù)為空時,路由為方法名   const key = path ? `${requestMethod}·${path}·${String(methodName)}` : `${requestMethod}·${String(methodName)}·/${String(methodName)}`;   methodMap.set(key, target); };  // Post 請求 export const Post = (path: string = ''): MethodDecorator => methodWrap(path, 'post');  // Get 請求 export const Get = (path: string = ''): MethodDecorator => methodWrap(path, 'get');  export default (app: Application): void => {   const { router } = app;   // 遍歷methodMap, 注冊路由   methodMap.forEach((curController: CurController, configString: string) => {     // 請求方法, 請求路徑, 方法名      const [ requestMethod, path, methodName ] = configString.split(`·`);     // 獲取controller裝飾器設(shè)置的公共前綴     // 如果controller沒有添加SelfController裝飾器,則取文件名作為路徑     let controllerPrefix: string | undefined | null = (Reflect as any).getMetadata(CONTROLLER_PREFIX, curController.constructor);     if (!(Reflect as any).hasMetadata(CONTROLLER_PREFIX, curController.constructor)) {       controllerPrefix = `/${curController.pathName.split(`.`).reverse()[0]}`;     }     const func: (this: Context, ...args: any[]) => Promise<any> = async function (...args: any[]): Promise<any> {       return new (curController.constructor as any)(this)[methodName](...args);     };     // 注冊路由     router[requestMethod](rootApiPath + controllerPrefix + path, func);   }); };
登錄后復(fù)制

建議使用node寫服務(wù)直接上midwayjs或者nestjs

總結(jié)

通過如上比較,相信你對think系列框架堵文件的路由自動加載和裝飾器的路由加載,有了一定了解, 他們的這種設(shè)計思想值得學習吧, 希望對你有所啟發(fā)。

還有我認為裝飾器的路由寫起來,比較優(yōu)雅, 不知道各位小伙伴怎么看,評論區(qū)說說?

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
日本精品视频一区二区| 男男GAy作爱免费观看| 久久精品无码中文字幕| 久久99精品国产麻豆不卡| 久久久综合九色综合鬼色| 乱人伦精品视频在线观看| 男生把小j放进女人屁股视频狂躁 男生把手放进我内裤揉摸好爽 | 亚洲伊人五月丁香激情| 中文人妻AV大区中文不卡| AV无码国产在线看免费APP| 成人午夜视频精品一区| 国产精品特级毛片一区二区| 极品国产主播粉嫩在线| 老乞丐没完没了73节| 强行无套内谢大学生初次| XXXⅩ少妇少妇XXXX范冰冰| 纯肉无遮挡H肉动漫在线观看3D| 国产精品VA无码一区二区| 精品JAVAPARSER乱偷| 嫩小BBB揉BBB揉BBBB| 视频无码一区二区| 亚洲妇女行蜜桃AV网网站| 在线播放韩国A级无码片| 白白嫩嫩又小又紧| 国产人澡人澡澡澡人碰视| 久久久久精品日韩久久久| 奇米第四色777ME| 无遮挡亲胸捏胸免费视频| 亚洲综合小说另类图片五月天| AV无码AV天天AV天天爽| 国产成人乱色伦区| 久久精品亚洲中文无东京热| 欧洲亚洲国产成人综合色婷婷| 无码毛片内射白浆视频| 野花日本中文版免费观看| 波多野结衣456| 国内精品视频在线观看九九 | 中文无码热在线视频| 超薄肉色丝袜一二三四区| 好大好厉害我接了一个顾客| 男人扒开添女人下部免费视频| 他的舌头含有起了我的小豆豆| 亚洲日韩精品无码AV一区二区三| А√最新版资源在线官网| 国内精品久久久久精品| 欧美日韩精品人妻一区二区三区| 无码视频一区二区三区| 制服丝袜中文字幕在线| 国产AV国片精品一区二区| 久久精品无码中文字幕| 乳荡的小痍子免费播放| 亚洲色大18成人网站WWW在线| 波多野结衣AV一区二区全免费观 | 亚洲JLZZJLZZ少妇| www啪啪小白浆内射无码| 好儿子妈妈今后就是你的人| 欧美又粗又长XXXXBBBB疯| 亚洲不卡AV不卡一区二区| 把腿张开老子臊烂你在线观看| 精品人妻一区二区三区免费看| 日本人妻熟妇BBBBB| 亚洲熟妇无码乱码AV电影| 丰满年经的继拇6| 美女露 0的奶头无| 亚洲AⅤ永久无码中文字幕| JΑPΑNESEHD熟女熟妇伦| 精品国产一区二区三区香蕉| 色天使色偷偷色噜噜噜AV天堂| 又爽又黄又无遮挡的视频| 国产AV寂寞骚妇| 女人18毛片A级毛片视频| 亚洲国产精品久久久久蜜桃| 成人精品视频一区二区| 毛耸耸性XXXX毛耸耸| 亚洲AV无码成人精品区百度| 成人无码精品1区2区3区免费看| 久久久亚洲欧洲日产无码AV| 无码人妻精品一区二区三区蜜桃91 | 极品少妇被猛得白浆直流草莓| 日韩精品无码一区二区中文字幕| 在线观看韩国电影| 和老师做H无码动漫| 熟妇人妻久久中文字幕| A级毛片免费无码观看、、| 久久精品久久久久久久精品| 午夜AV无码福利免费看网站| 草莓视频IOS下载| 女人扒开的小泬高潮喷水小说| 亚洲日韩国产一区二区三区 | 久久午夜福利无码1000合集| 西西444WWW大胆无码视频| 边喂奶边中出的人妻| 蜜臀少妇人妻在线| 亚洲人交乣女BBW| 国产特级毛片AAAAAA视频| 色妞WW精品视频7777| PYTHON人马大战| 蜜桃国产乱码精品一区二区三区| 亚洲人成绝网站色WWW| 国产无遮挡18禁无码网站| 熟女少妇内射日韩亚洲| 超碰人人爽天天爽天天做| 内射少妇骚B一√| 伊人久久大香线焦AV色| 精品亚洲成AV人在线观看| 亚洲AV蜜桃无码精品无码| 国产交换配乱婬视频| 少妇久久久久久被弄到高潮| 被主人调教边C边打屁股作文| 欧美丰满少妇XXXXX| 中文在线А√在线天堂中文| 久久久久久精品免费免费WE| 亚洲成A人片在线观看无码3D | 麻豆国产尤物AV尤物在线观看| 亚洲日本一线产区二线产区| 精华液一区二区区别| 亚洲国产AV无码专区亚洲AV| 国产亚洲美女精品久久久| 无遮挡粉嫩小泬女视频| 国产精品免费久久久久久蜜桃 | 国产成人久久精品二区三区小说| 日韩精品无码一区二区三区免费 | 国产乱人伦AV在线麻豆A| 我的大胸继拇在线观看| 国产成人精品久久一区二区 | 亚洲中文字幕无码一久久区| 精品久久香蕉国产线看观看亚洲| 亚洲VA中文字幕无码毛片| 黑人大战中国AV女叫惨了| 亚洲VA国产日韩欧美精品| 狠狠躁夜夜躁人妻蜜臂AV| 亚洲精品性爱av| 久久久久国产精品熟女影院| 亚洲最大成人AV在线天堂网| 久久精品夜色噜噜亚洲A∨| 一下子挺进浓密的黑森林| 乱人伦中文视频在线| 做AJ的视频大全电视剧| 欧美成人看片黄A免费看| ZLJZLJZLJ日本人| 日日狠狠久久偷偷色综合96蜜桃 | 玩弄CHINESE丰满人妻VI| 国产精品视频一区国模私拍| 午夜人妻理论片天堂影院| 狠狠色噜噜狠狠狠狠色综合久| 亚洲精品无码AV人在线播放| 久久久久亚洲AV无码网站少妇| 又大又粗又爽A级毛片免费看| 免费污站18禁的刺激| ZOOM与人性ZOOM视频| 色欲狠狠躁天天躁无码中文字幕 | 东京无码熟妇人妻AV在线网址 | 欧美三级不卡在线播放| 差差差很疼30分钟视频| 熟妇人妻一区二区三区四区 | 成年美女黄网站色大片免费看 | 国产精品亚洲综合色区韩国| 亚洲VA中文字幕| 里番本子侵犯肉全彩无码| YSL千人千色YESE88网站| 熟妇女人妻丰满少妇中文字幕性生活| 国产精品久久久久久久久鸭无码 | 双乳被一左一右吃着的感觉 | 麻豆果冻传媒新剧国产短视频| WWW.国产白丝袜护士喷白浆| 色翁荡熄又大又硬又粗又视频 | 亚洲AVAV电影AV天堂18禁| 久久久噜噜噜久噜久久| JIZZJIZZ日本护士视频| 玩乡下黄花小处雏女| 精品国产乱码久久久软件下载| 涨乳催乳改造调教公主| 人物动物交互第LL0集| 国产精品亚洲А∨天堂免下载| 亚洲乱码国产一区三区| 女人高潮被爽到呻吟在线观看| 丰满性熟妇ⅩXXOOOZZX| 亚洲国产精品成人久久蜜臀| 男男av在线播放| 福利姬国产精品一区在线| 亚洲精品成人H在线观看| 女神被啪进深处娇喘在线观看| 国产成人乱色伦区| 夜里18款禁用B站大全| 日本亚洲色欲网站WWW| 国农村精品国产自线拍| 中文字幕无码成人片| 熟妇人妻久久中文字幕麻豆网| 警察被两个混混脱裤玩J视频| JIZZYOU中国少妇| 小蜜被两老头吸奶头在线观看| 狂性XXXX乱大交老女人 | 色欲久久久天天天综合网精品| 黑人入室强丰满人妻| 99在线精品一区二区三区| 无码国产精品一区二区免费式直播 | 亚洲AV无码久久精品蜜桃播放| 女儿的朋友3完有限中字木瓜| 国产粉嫩馒头无套内在线观看免费 | 8AV国产精品爽爽ⅤA在线观看 |