提供了 http 模組用於監聽埠、處理 http 請求,返回響應,這也是它主要做的事情。
但是 http 模組的 api 太過原始,直接基於它來處理請求響應比較麻煩,所以我們會用 express 等庫封裝一層。
這一層做的事情就是給 request 和 response 新增了很多處理請求響應的方法,滿足各種場景的需求,並且對路由做了處理,而且,也提供了中介軟體的呼叫鏈便於複用一些程式碼,這種中介軟體的呼叫鏈叫做洋蔥模型。
但這一層沒有解決架構問題:當模組多了怎麼辦,怎麼管理?如何劃分 Model、View、Controller? 等等。
所以,用 Node.js 做後端服務時我們會再包一層,解決架構問題,這一層的框架有 eggjs(螞蟻的)、midwayjs(淘寶的)、nestjs(國外的)。
nestjs 是其中最優秀的一個:
這一層的底層還是 express、koa 等,它只是在那些 http 框架的基礎上額外解決了架構問題。
而且 nestjs 還有一點做的特別好,它不依賴任何一個 http 平臺,可以靈活的切換。
那麼 nestjs 是怎麼做到底層平臺的切換的呢?
想想 react 是怎麼做到把 vdom 渲染到 canvas、dom、native 的?
定義一層統一的介面,各種平臺的 render 邏輯實現這些介面。這種模式叫做介面卡模式。
介面卡模式是當用到第三方實現的某個功能時,不直接依賴,而是定義一層介面,讓第三方去適配這層介面。這樣任何一個適配了這層介面的方案都能整合,也能夠靈活的切換方案。
Nest.js 對底層的 http 平臺就是提供了一層介面(HttpServer),定義了一堆用到的方法:
因為 ts 的 interface 必須實現所有的方法才行,為了簡化,又繼承了一層抽象類 AbstractHttpAdapter,把需要實現的方法定義成 abstract 的。
然後 express 或者別的平臺比如 fastify 只要繼承這個介面卡的類,實現其中的抽象方法,就能接入到 Nest.js 裡:
比如 ExpressAdapter:
或者 FastifyAdapter:
這些邏輯分別放在 platform-express 和 platform-fastify 包裡:
Nest.js 第一行程式碼是呼叫 create:
create 裡就會選擇一種 httpAdapter 來建立服務:
預設是 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 的時候可以指定對應的型別引數,這樣就能做相應的型別提示和檢查了:
但是這樣就和特定平臺耦合了,除非是確定不會切換平臺,否則不建議這麼做。
http 平臺是這麼做的,同理,websocket 平臺也是這樣的:
定義了一層統一的介面,通過介面卡的方式分別接入 socketio 和 websocket,可以靈活的切換:
圖解下 Nest.js 關於 http 、websocket 平臺的處理:
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相關知識,請存取:!
以上就是聊聊node框架 Nest.js怎麼鬆耦合地整合 Express !的詳細內容,更多請關注TW511.COM其它相關文章!