首頁  >  文章  >  web前端  >  聊聊node框架 Nest.js怎麼鬆耦合地整合 Express !

聊聊node框架 Nest.js怎麼鬆耦合地整合 Express !

青灯夜游
青灯夜游轉載
2022-03-02 19:54:302463瀏覽

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

聊聊node框架 Nest.js怎麼鬆耦合地整合 Express !

Nodejs 提供了 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 來建立服務:

1聊聊node框架 Nest.js怎麼鬆耦合地整合 Express !

預設是express:

1聊聊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 的時候可以指定對應的類型參數,這樣就能做相應的類型提示和檢查了:

1聊聊node框架 Nest.js怎麼鬆耦合地整合 Express !

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

http 平台是這麼做的,同理,websocket 平台也是這樣的:

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

1聊聊node框架 Nest.js怎麼鬆耦合地整合 Express !

圖解下Nest.js 關於http 、websocket 平台的處理:

1聊聊node框架 Nest.js怎麼鬆耦合地整合 Express !

##總結

#Node.js 提供了http 模組用來監聽埠、處理請求回應,但它的api 太原始,所以我們會包一層,在express 這一層提供更多好用的request、response 的api,但這層沒解決架構問題,要引進MVC、IOC 等架構,需要再包一層,用Egg.js、Midway.js、Nest.js 這種更上層的後端框架,其中Nest.js 是最優秀的。

Nest.js 在和底層http 平台的整合上做了特殊的設計,利用適配器模式,提供一層接口,讓底層平台去適配,這樣就可以靈活的切換不同的http 平台了。

但它也同樣支援用特定平台的 api,例如 controller 裡可以用 @Req 注入底層的 request 對象,創建容器的時候也可以傳入對應平台的類型參數。

Nest.js 預設使用的是 Express,但說用了 Express 也不完全對,因為可以靈活的切換別的。這就是適配器模式的魅力。

更多node相關知識,請造訪:

nodejs 教學

以上是聊聊node框架 Nest.js怎麼鬆耦合地整合 Express !的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除