站長資訊網
        最全最豐富的資訊網站

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        本篇文章帶大家聊聊node框架 Nest.js是如何松耦合地整合 Express 的,希望對大家有所幫助!

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        Node.js 提供了 http 模塊用于監聽端口、處理 http 請求,返回響應,這也是它主要做的事情。

        但是 http 模塊的 api 太過原始,直接基于它來處理請求響應比較麻煩,所以我們會用 express 等庫封裝一層。

        這一層做的事情就是給 request 和 response 添加了很多處理請求響應的方法,滿足各種場景的需求,并且對路由做了處理,而且,也提供了中間件的調用鏈便于復用一些代碼,這種中間件的調用鏈叫做洋蔥模型。

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        但這一層沒有解決架構問題:當模塊多了怎么辦,怎么管理?如何劃分 Model、View、Controller? 等等。

        所以,用 Node.js 做后端服務時我們會再包一層,解決架構問題,這一層的框架有 eggjs(螞蟻的)、midwayjs(淘寶的)、nestjs(國外的)。

        nestjs 是其中最優秀的一個:

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        這一層的底層還是 express、koa 等,它只是在那些 http 框架的基礎上額外解決了架構問題。

        而且 nestjs 還有一點做的特別好,它不依賴任何一個 http 平臺,可以靈活的切換。

        那么 nestjs 是怎么做到底層平臺的切換的呢?

        想想 react 是怎么做到把 vdom 渲染到 canvas、dom、native 的?

        定義一層統一的接口,各種平臺的 render 邏輯實現這些接口。這種模式叫做適配器模式。

        適配器模式是當用到第三方實現的某個功能時,不直接依賴,而是定義一層接口,讓第三方去適配這層接口。這樣任何一個適配了這層接口的方案都能集成,也能夠靈活的切換方案。

        Nest.js 對底層的 http 平臺就是提供了一層接口(HttpServer),定義了一堆用到的方法:

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        因為 ts 的 interface 必須實現所有的方法才行,為了簡化,又繼承了一層抽象類 AbstractHttpAdapter,把需要實現的方法定義成 abstract 的。

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        然后 express 或者別的平臺比如 fastify 只要繼承這個適配器的類,實現其中的抽象方法,就能接入到 Nest.js 里:

        比如 ExpressAdapter:

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        或者 FastifyAdapter:

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        這些邏輯分別放在 platform-express 和 platform-fastify 包里:

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        Nest.js 第一行代碼是調用 create:

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        create 里就會選擇一種 httpAdapter 來創建服務:

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        默認是 express:

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        這樣,之后調用的 request 和 response 的方法最終就都是 express 的了。

        比如在 controller 里可以用 @Request 裝飾器來注入 reqeust 對象,就可以調用 reqeust 的各種方法。

        import { Controller, Get, Request } from '@nestjs/common';  @Controller('cats') export class CatsController {   @Get()   findAll(@@Request() request: Request): string {     return 'This action returns all cats';   } }

        如果你想調用一些接口之外的特定平臺的方法的話,Nest.js 也支持,那就換用 @Req 來注入:

        import { Controller, Get, Req } from '@nestjs/common';  @Controller('cats') export class CatsController {   @Get()   findAll(@@Req() request: Request): string {     return 'This action returns all cats';   } }

        這樣注入的就是特定平臺比如 express 的原生 request 對象,就可以直接用它的所有方法。

        此外,如果真的要用 Express 平臺的特定 api 的話,在 NestFactory.create 的時候可以指定對應的類型參數,這樣就能做相應的類型提示和檢查了:

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        但是這樣就和特定平臺耦合了,除非是確定不會切換平臺,否則不建議這么做。

        http 平臺是這么做的,同理,websocket 平臺也是這樣的:

        定義了一層統一的接口,通過適配器的方式分別接入 socketio 和 websocket,可以靈活的切換:

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        圖解下 Nest.js 關于 http 、websocket 平臺的處理:

        聊聊node框架 Nest.js怎么松耦合地整合 Express !

        總結

        Node.js 提供了 http 模塊用來監聽端口、處理請求響應,但是它的 api 過于原始,所以我們會包一層,在 express 這一層提供

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 欧美日韩精品系列一区二区三区| 久久精品国产亚洲精品2020 | 国产精品99久久久久久宅男| 亚洲国产一成人久久精品| 国产精品麻豆入口| 国产一区二区三区久久精品| 无码人妻精品一区二区三18禁 | 久久久精品2019免费观看| 欧美日韩成人精品久久久免费看| 永久免费精品视频| 国产亚洲精品a在线无码| 亚洲欧美国产∧v精品综合网 | 青草青草久热精品视频在线观看| www夜片内射视频日韩精品成人| 91视频国产精品| 国产精品无码久久久久久| 色一乱一伦一图一区二区精品| 四虎亚洲国产成人久久精品| 国产偷伦精品视频| 国产A√精品区二区三区四区| 九九热在线精品视频| 国产成人精品精品欧美| 国产精品视频第一区二区三区| 精品无码AV一区二区三区不卡| 无码国产精品一区二区免费模式| 亚洲国产人成精品| 亚洲一日韩欧美中文字幕欧美日韩在线精品一区二 | 欧美人与性动交α欧美精品| 国内精品国产成人国产三级| 国产精品自产拍在线观看花钱看 | 欧美精品亚洲精品日韩专区| 久草热久草热线频97精品| 狠狠色伊人久久精品综合网| 国产精品亚洲高清一区二区| 国产精品无码国模私拍视频 | 欧美精品欧美人与动人物牲交| 婷婷国产成人精品视频| 日产精品99久久久久久| 蜜国产精品jk白丝AV网站| 久久久精品人妻一区二区三区蜜桃 | 91精品国产人成网站|