91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

node框架中Nest.js如何松耦合地整合Express

發布時間:2022-03-03 13:43:31 來源:億速云 閱讀:220 作者:小新 欄目:web開發

這篇文章給大家分享的是有關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框架中Nest.js如何松耦合地整合Express”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

竹溪县| 怀宁县| 霍城县| 石门县| 汉阴县| 平乡县| 华亭县| 兴宁市| 永平县| 高唐县| 江达县| 仁化县| 景谷| 珠海市| 中阳县| 新晃| 乡宁县| 祁阳县| 中卫市| 娄底市| 外汇| 嘉祥县| 四川省| 苗栗市| 全椒县| 信宜市| 平度市| 秭归县| 梅河口市| 松阳县| 阿拉善右旗| 镶黄旗| 东台市| 井陉县| 磴口县| 祥云县| 龙岩市| 亚东县| 明光市| 兴仁县| 白城市|