成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Nest.js 用了 Express 但也沒完全用,那怎么辦?

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

Node.js 提供了 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 也不完全對,因為可以靈活的切換別的。這就是適配器模式的魅力。

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2021-06-18 06:48:54

前端Nest.js技術熱點

2017-12-21 20:01:38

潤乾報表

2022-03-18 21:51:10

Nest.jsAOP 架構后端

2024-05-06 08:48:18

nestjava?MVC?

2022-02-02 20:21:24

短信驗證碼登錄

2022-12-27 09:22:06

Nest.js框架

2021-12-22 06:56:06

MySQCrudjs

2012-11-22 10:39:37

漏洞PDF文件

2024-02-04 19:15:09

Nest.js管理項目

2022-04-22 10:30:07

框架JavaScript前端

2021-10-28 17:40:22

Nest.js前端代碼

2020-12-18 09:23:41

KubernetesDocker

2024-05-21 10:35:34

2021-12-27 20:29:21

機制PipeExceptionFi

2021-12-01 09:31:13

安全

2024-03-15 09:26:59

2021-06-16 06:14:29

React17Toast組件React bug

2021-06-29 06:25:22

Nest.jsTypeORM數據庫

2023-01-30 09:01:34

DecoratorsJS語法

2021-06-04 10:56:32

分庫數據庫查詢
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区四区在线视频 | 天天干.com | 亚洲综合在 | 国产日产精品一区二区三区四区 | 日韩免费在线 | 超碰在线97国产 | www.99热这里只有精品 | 麻豆久久 | 天堂亚洲| 国产剧情一区 | 国产午夜精品一区二区三区 | 一区中文| 99reav| 免费不卡视频 | 成人在线免费av | 久久国产精品亚洲 | 久久精品欧美视频 | 日本在线精品视频 | 亚洲精品视频导航 | 成人性生交大片免费看r链接 | 亚洲男女视频在线观看 | 一道本在线 | 日本精品久久久久 | 久久久久国产一区二区三区四区 | 青娱乐一区二区 | 在线天堂免费中文字幕视频 | 国产精品美女www | a免费在线| 狠狠综合久久av一区二区老牛 | 午夜精品久久 | 国产精品视频一区二区三区四蜜臂 | 国产主播第一页 | 欧美一区二区在线观看视频 | 久久综合影院 | 成人精品在线观看 | 综合五月 | 免费在线观看成人av | www.日韩 | 国产精品视频网址 | 国产精品a级 | 黄色国产在线视频 |