精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Nest.js 是如何實現 AOP 架構的?

開發 架構
Nest.js 基于 express 這種 http 平臺做了一層封裝,應用了 MVC、IOC、AOP 等架構思想。

Nest.js 是一個 Node.js 的后端框架,它對 express 等 http 平臺做了一層封裝,解決了架構問題。它提供了 express 沒有的 MVC、IOC、AOP 等架構特性,使得代碼更容易維護、擴展。

這里的 MVC、IOC、AOP 都是啥意思呢?我們分別看一下:

MVC、IOC

MVC 是 Model View Controller 的簡寫。MVC 架構下,請求會先發送給 Controller,由它調度 Model 層的 Service 來完成業務邏輯,然后返回對應的 View。

Nest.js 提供了 @Controller 裝飾器用來聲明 Controller:

而 Service 會用 @Injectable 裝飾器來聲明:

通過 @Controller、@Injectable 裝飾器聲明的 class 會被 Nest.js 掃描,創建對應的對象并加到一個容器里,這些所有的對象會根據構造器里聲明的依賴自動注入,也就是 DI(dependency inject),這種思想叫做 IOC(Inverse Of Control)。

IOC 架構的好處是不需要手動創建對象和根據依賴關系傳入不同對象的構造器中,一切都是自動掃描并創建、注入的。

此外,Nest.js 還提供了 AOP (Aspect Oriented Programming)的能力,也就是面向切面編程的能力:

AOP

AOP 是什么意思呢?什么是面向切面編程呢?

一個請求過來,可能會經過 Controller(控制器)、Service(服務)、Repository(數據庫訪問) 的邏輯:

如果想在這個調用鏈路里加入一些通用邏輯該怎么加呢?比如日志記錄、權限控制、異常處理等。

容易想到的是直接改造 Controller 層代碼,加入這段邏輯。這樣可以,但是不優雅,因為這些通用的邏輯侵入到了業務邏輯里面。能不能透明的給這些業務邏輯加上日志、權限等處理呢?

那是不是可以在調用 Controller 之前和之后加入一個執行通用邏輯的階段呢?

比如這樣:

這樣的橫向擴展點就叫做切面,這種透明的加入一些切面邏輯的編程方式就叫做 AOP (面向切面編程)。

AOP 的好處是可以把一些通用邏輯分離到切面中,保持業務邏輯的存粹性,這樣切面邏輯可以復用,還可以動態的增刪

其實 Express 的中間件的洋蔥模型也是一種 AOP 的實現,因為你可以透明的在外面包一層,加入一些邏輯,內層感知不到。

而 Nest.js 實現 AOP 的方式更多,一共有五種,包括 Middleware、Guard、Pipe、Inteceptor、ExceptionFilter:

中間件 Middleware

Nest.js 基于 Express 自然也可以使用中間件,但是做了進一步的細分,分為了全局中間件和路由中間件:

全局中間件就是 Express 的那種中間件,在請求之前和之后加入一些處理邏輯,每個請求都會走到這里:

路由中間件則是針對某個路由來說的,范圍更小一些:

這個是直接繼承了 Express 的概念,比較容易理解。

再來看一些 Nest.js 擴展的概念,比如 Guard:

Guard

Guard 是路由守衛的意思,可以用于在調用某個 Controller 之前判斷權限,返回 true 或者 flase 來決定是否放行:

創建 Guard 的方式是這樣的:

Guard 要實現 CanActivate 接口,實現 canActive 方法,可以從 context 拿到請求的信息,然后做一些權限驗證等處理之后返回 true 或者 false。

通過 @Injectable 裝飾器加到 IOC 容器中,然后就可以在某個 Controller 啟用了:

Controller 本身不需要做啥修改,卻透明的加上了權限判斷的邏輯,這就是 AOP 架構的好處。

而且,就像 Middleware 支持全局級別和路由級別一樣,Guard 也可以全局啟用:

Guard 可以抽離路由的訪問控制邏輯,但是不能對請求、響應做修改,這種邏輯可以使用 Interceptor:

Interceptor

Interceptor 是攔截器的意思,可以在目標 Controller 方法前后加入一些邏輯:

創建 Inteceptor 的方式是這樣的:

Interceptor 要實現 NestInterceptor 接口,實現 intercept 方法,調用 next.handle() 就會調用目標 Controller,可以在之前和之后加入一些處理邏輯。

Controller 之前之后的處理邏輯可能是異步的。Nest.js 里通過 rxjs 來組織它們,所以可以使用 rxjs 的各種 operator。

Interceptor 支持每個路由單獨啟用,只作用于某個 controller,也同樣支持全局啟用,作用于全部 controller:

除了路由的權限控制、目標 Controller 之前之后的處理這些都是通用邏輯外,對參數的處理也是一個通用的邏輯,所以 Nest.js 也抽出了對應的切面,也就是 Pipe:

Pipe

Pipe 是管道的意思,用來對參數做一些驗證和轉換:

創建 Pipe 的方式是這樣的:

Pipe 要實現 PipeTransform 接口,實現 transform 方法,里面可以對傳入的參數值 value 做參數驗證,比如格式、類型是否正確,不正確就拋出異常。也可以做轉換,返回轉換后的值。

內置的有 8 個 Pipe,從名字就能看出它們的意思:

  • ValidationPipe。
  • ParseIntPipe。
  • ParseBoolPipe。
  • ParseArrayPipe。
  • ParseUUIDPipe。
  • DefaultValuePipe。
  • ParseEnumPipe。
  • ParseFloatPipe。

同樣,Pipe 可以只對某個路由生效,也可以對每個路由都生效:

不管是 Pipe、Guard、Interceptor 還是最終調用的 Controller,過程中都可以拋出一些異常,如何對某種異常做出某種響應呢?

這種異常到響應的映射也是一種通用邏輯,Nest.js 提供了 ExceptionFilter 來支持:

ExceptionFilter

ExceptionFilter 可以對拋出的異常做處理,返回對應的響應:

創建 ExceptionFilter的形式是這樣的:

首先要實現 ExceptionFilter 接口,實現 catch 方法,就可以攔截異常了,但是要攔截什么異常還需要用 @Catch 裝飾器來聲明,攔截了異常之后,可以異常對應的響應,給用戶更友好的提示。

當然,也不是所有的異常都會處理,只有繼承 HttpException 的異常才會被 ExceptionFilter 處理,Nest.js 內置了很多 HttpException 的子類:

  • BadRequestException。
  • UnauthorizedException。
  • NotFoundException。
  • ForbiddenException。
  • NotAcceptableException。
  • RequestTimeoutException。
  • ConflictException。
  • GoneException。
  • PayloadTooLargeException。
  • UnsupportedMediaTypeException。
  • UnprocessableException。
  • InternalServerErrorException。
  • NotImplementedException。
  • BadGatewayException。
  • ServiceUnavailableException。
  • GatewayTimeoutException。

當然,也可以自己擴展:

Nest.js 通過這樣的方式實現了異常到響應的對應關系,代碼里只要拋出不同的 HttpException,就會返回對應的響應,很方便。

同樣,ExceptionFilter 也可以選擇全局生效或者某個路由生效:

某個路由:

全局:

我們了解了 Nest.js 提供的 AOP 的機制,但它們的順序關系是怎樣的呢?

幾種 AOP 機制的順序

Middleware、Guard、Pipe、Interceptor、ExceptionFilter 都可以透明的添加某種處理邏輯到某個路由或者全部路由,這就是 AOP 的好處。

但是它們之間的順序關系是什么呢?

調用關系這個得看源碼了。

對應的源碼是這樣的:

很明顯,進入這個路由的時候,會先調用 Guard,判斷是否有權限等,如果沒有權限,這里就拋異常了:

拋出的 HttpException 會被 ExceptionFilter 處理。

如果有權限,就會調用到攔截器,攔截器組織了一個鏈條,一個個的調用,最后會調用的 controller 的方法:

調用 controller 方法之前,會使用 pipe 對參數做處理:

會對每個參數做轉換:

ExceptionFilter 的調用時機很容易想到,就是在響應之前對異常做一次處理。

而 Middleware 是 express 中的概念,Nest.js 只是繼承了下,那個是在最外層被調用。

這就是這幾種 AOP 機制的調用順序。把這些理清楚,就算是對 Nest.js 有很好的掌握了。

總結

Nest.js 基于 express 這種 http 平臺做了一層封裝,應用了 MVC、IOC、AOP 等架構思想。

MVC 就是 Model、View Controller 的劃分,請求先經過 Controller,然后調用 Model 層的 Service、Repository 完成業務邏輯,最后返回對應的 View。

IOC 是指 Nest.js 會自動掃描帶有 @Controller、@Injectable 裝飾器的類,創建它們的對象,并根據依賴關系自動注入它依賴的對象,免去了手動創建和組裝對象的麻煩。

AOP 則是把通用邏輯抽離出來,通過切面的方式添加到某個地方,可以復用和動態增刪切面邏輯。

Nest.js 的 Middleware、Guard、Interceptor、Pipe、ExceptionFileter 都是 AOP 思想的實現,只不過是不同位置的切面,它們都可以靈活的作用在某個路由或者全部路由,這就是 AOP 的優勢。

我們通過源碼來看了它們的調用順序,Middleware 是 Express 的概念,在最外層,到了某個路由之后,會先調用 Guard,Guard 用于判斷路由有沒有權限訪問,然后會調用 Interceptor,對 Contoller 前后擴展一些邏輯,在到達目標 Controller 之前,還會調用 Pipe 來對參數做驗證和轉換。所有的 HttpException 的異常都會被 ExceptionFilter 處理,返回不同的響應。

Nest.js 就是通過這種 AOP 的架構方式,實現了松耦合、易于維護和擴展的架構。

AOP 架構的好處,你感受到了么?

責任編輯:姜華 來源: 神光的編程秘籍
相關推薦

2021-06-18 06:48:54

前端Nest.js技術熱點

2022-02-02 20:21:24

短信驗證碼登錄

2021-12-22 06:56:06

MySQCrudjs

2022-12-27 09:22:06

Nest.js框架

2024-05-21 10:35:34

2022-03-02 14:00:46

Nest.jsExpress端口

2024-05-06 08:48:18

nestjava?MVC?

2024-02-04 19:15:09

Nest.js管理項目

2021-10-28 17:40:22

Nest.js前端代碼

2021-12-27 20:29:21

機制PipeExceptionFi

2021-06-29 06:25:22

Nest.jsTypeORM數據庫

2023-01-30 09:01:34

DecoratorsJS語法

2024-04-30 09:53:12

axios架構適配器

2024-03-15 09:26:59

2022-04-21 09:59:53

Nest參數校驗

2021-01-28 05:11:26

HDFS架構Hadoop

2021-08-16 15:49:31

開發框架單線程異步

2020-08-17 08:20:16

iOSAOP框架

2022-07-27 22:59:53

Node.jsNest

2019-05-06 14:51:46

Node框架前端
點贊
收藏

51CTO技術棧公眾號

久久91精品国产| 亚洲va天堂va国产va久| 亚洲第一av网| 亚洲一区二区三区精品视频| 一级黄色片免费看| 激情成人综合| 正在播放国产一区| 男人网站在线观看| 国产精品诱惑| 婷婷一区二区三区| 伊人久久大香线蕉精品| 日韩在线观看视频一区| 久久国产免费看| 国内精品小视频在线观看| 久操视频在线观看免费| jizz国产精品| 欧美日韩一级黄| 欧美日韩亚洲一区二区三区四区| 国产精品国产av| 欧美精品一区二区三区精品| 日韩一区二区在线看片| 免费大片在线观看| 日本不卡影院| 国产精品久久久久久久浪潮网站| 日韩av观看网址| 欧美成欧美va| 久久神马影院| 亚洲人成在线观看网站高清| 无码人妻一区二区三区免费n鬼沢| 亚洲不卡系列| 黄色成人在线播放| 国产精品va在线观看无码| 午夜免费福利在线观看| 久久久久久久久免费| 57pao精品| 国产性70yerg老太| 亚洲午夜精品一区 二区 三区| 亚洲一区www| 91精品国产自产| 美国成人xxx| 亚洲精品在线观| 亚洲精品乱码久久久久久9色| 国产精品99久久久久久董美香| 欧美性高潮在线| 欧美激情 国产精品| 色噜噜狠狠狠综合欧洲色8| 亚洲同性同志一二三专区| 亚洲无玛一区| 在线看的av网站| 中文字幕第一区二区| 日产中文字幕在线精品一区| 麻豆av电影在线观看| 久久人人超碰精品| 欧美精品免费观看二区| 黄色免费在线播放| 美国美女黄色片| 99热播精品免费| 91福利在线观看| 亚洲天堂电影网| 国产51人人成人人人人爽色哟哟| 久久嫩草精品久久久精品一| 欧美区高清在线| 国产在线视频你懂得| 国产欧美1区2区3区| 色噜噜狠狠一区二区三区| 成人影院免费观看| 国产精品99久久久久久久女警| 国模叶桐国产精品一区| 国产无遮挡又黄又爽又色| 精品91在线| 97在线观看视频| 国产成人无码一区二区在线播放| 天堂va蜜桃一区二区三区| 国产精品海角社区在线观看| 在线视频 91| 国产麻豆视频一区二区| 成人黄色在线免费观看| 天天舔天天干天天操| 国产午夜精品一区二区三区嫩草 | www.成人| 日韩欧美三级在线| 国产精品无码一区二区三区免费 | 国产.精品.日韩.另类.中文.在线.播放| 国产91社区| 欧美香蕉爽爽人人爽| 国产精品青草综合久久久久99| 成人性做爰片免费视频| 超碰资源在线| 欧美精品tushy高清| 久久久久亚洲AV成人网人人小说| 日韩深夜影院| 欧美一区二区视频在线观看2020 | 亚洲欧洲精品天堂一级 | 欧美一区国产一区| 免费看a在线观看| 午夜一区二区三区视频| 欧美三级理论片| 一区二区三区在线免费看| 欧美日韩在线综合| 国产亚洲精品成人a| 欧美极品在线观看| 欧美猛交免费看| 国产黄网在线观看| 99精品免费| 成人福利网站在线观看11| 欧美自拍第一页| 国产精品美女久久久久久久 | 日一区二区三区| 97国产一区二区精品久久呦| 中文字幕欧美人妻精品一区蜜臀| 久久久www| 51国偷自产一区二区三区的来源| 在线观看免费黄色小视频| 成人国产亚洲欧美成人综合网| 色涩成人影视在线播放| av中文字幕在线观看第一页| 欧美日韩国产综合一区二区| 9.1在线观看免费| 欧美超碰在线| 日韩av电影国产| 手机看片1024日韩| 亚洲欧美日韩系列| 999精品视频在线| 四虎5151久久欧美毛片| 欧美成人久久久| 亚洲天堂手机版| 久久综合九色综合久久久精品综合| 69精品丰满人妻无码视频a片| 成人在线黄色| 亚洲网址你懂得| 久热这里只有精品6| 国产成人免费xxxxxxxx| 中文精品一区二区三区| 日本肉肉一区| 国产一区二区三区丝袜| 黄色片中文字幕| 久久综合成人精品亚洲另类欧美| 日本男女交配视频| 秋霞一区二区三区| 久久精品视频免费播放| 中文字幕在线2018| 中文字幕不卡在线播放| 日本激情视频在线| 国产一区二区三区网| 日韩av电影免费观看高清| 日本ー区在线视频| 日韩欧美一区视频| 国产全是老熟女太爽了| 老司机午夜精品视频| 日本成人三级电影网站| 芒果视频成人app| 亚洲深夜福利网站| 亚洲 欧美 中文字幕| 久久九九久精品国产免费直播| 无码aⅴ精品一区二区三区浪潮 | 久久免费精彩视频| 国产mv日韩mv欧美| 人妻无码久久一区二区三区免费| 成人资源在线| 91超碰caoporn97人人| 免费av中文字幕| 国产在线观看免费一区| 日本黄色播放器| 久久国际精品| 久久久久久国产精品美女| 国产成人三级在线观看视频| 亚洲电影第三页| 日本肉体xxxx裸体xxx免费| 欧美日韩色图| 成人激情视频在线观看| 视频在线观看入口黄最新永久免费国产| 日韩欧美中文字幕公布| 国产一级做a爰片在线看免费| 91网站视频在线观看| 久热免费在线观看| 久久福利影院| 国产精品 日韩| 欧美aaaaa性bbbbb小妇| 在线播放日韩av| www.久久成人| 欧美日韩中国免费专区在线看| 午夜影院黄色片| 国产精品中文字幕日韩精品| 国产精品999视频| 欧美综合久久| 97夜夜澡人人双人人人喊| 女海盗2成人h版中文字幕| 中文字幕精品网| 国产小视频一区| 在线免费视频一区二区| 青青草手机在线视频| 久久亚洲二区三区| √天堂资源在线| 亚洲在线日韩| 六月婷婷激情网| 美女精品一区最新中文字幕一区二区三区 | 大桥未久在线播放| 在线免费看av不卡| 乱色精品无码一区二区国产盗| 在线一区二区三区四区| 激情五月婷婷小说| 欧美国产激情二区三区| 9.1在线观看免费| 精品在线一区二区| 国产精品97在线| 午夜欧美视频| 日本一区二区三不卡| 中文字幕一区日韩精品| 国产精品欧美久久久| 182在线播放| 久久不射电影网| 99青草视频在线播放视| 日韩国产高清视频在线| 99热这里只有精品66| 日本高清免费不卡视频| 日本视频www| 亚洲精品水蜜桃| 快灬快灬一下爽蜜桃在线观看| 不卡高清视频专区| 精品无码av一区二区三区不卡| 琪琪一区二区三区| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 日韩精品最新网址| 亚洲天堂自拍偷拍| 91成人在线免费观看| 日本熟伦人妇xxxx| 亚洲自拍偷拍av| 日b视频在线观看| 国产乱一区二区| 在线观看岛国av| 日韩电影免费在线| 免费高清在线观看免费| 一本久久综合| 亚洲 高清 成人 动漫| 在线成人h网| 老子影院午夜伦不卡大全| 久久人人爽人人爽人人片av不| 成人亲热视频网站| 日韩毛片免费视频一级特黄| 国产成人涩涩涩视频在线观看| 欧美一级鲁丝片| 欧美亚洲在线观看| 日韩脚交footjobhdboots| 久久免费视频网| 免费网站在线观看人| 欧美夫妻性生活视频| 国产丝袜精品丝袜| 高清欧美性猛交xxxx| 18video性欧美19sex高清| 欧美精品www| а√在线天堂官网| 4k岛国日韩精品**专区| 午夜精品久久久久久久久久蜜桃| 日韩美女免费观看| 成人a在线观看高清电影| 国产精品久久久久久久久久| 欧美男女视频| 91麻豆国产精品| 天堂精品在线视频| 国产综合动作在线观看| 午夜先锋成人动漫在线| 日韩电影免费观看在| 色喇叭免费久久综合网| 免费观看国产视频在线| 午夜精品免费| 免费看一级大黄情大片| 日日摸夜夜添夜夜添精品视频| 爆乳熟妇一区二区三区霸乳| 欧美黄在线观看| 精品成在人线av无码免费看| 国产欧美丝祙| japanese在线播放| 激情久久久久| www.日日操| 狠狠v欧美v日韩v亚洲ⅴ| 秋霞午夜鲁丝一区二区| jlzzjlzz国产精品久久| 国产精品嫩草99a| 国产又黄又粗又猛又爽的视频| 久久久久久久久久久久久女国产乱| 山东少妇露脸刺激对白在线| 亚洲三级在线播放| 日韩av综合在线| 欧美亚洲国产一区二区三区 | 黑人玩欧美人三根一起进| 久久久久久久91| 影音成人av| 成人综合av网| av一区二区在线播放| 青青草视频国产| 日日夜夜精品视频免费| 又色又爽又黄18网站| 国产日韩欧美一区二区三区综合| 动漫性做爰视频| 日韩欧美一区二区三区久久| 国产日韩一级片| 亚洲色无码播放| 狂野欧美激情性xxxx欧美| 国产精品日日摸夜夜添夜夜av| 日韩一区免费| 亚洲三区视频| 噜噜噜躁狠狠躁狠狠精品视频 | 88久久精品| 亚洲国产日韩综合一区| 日韩视频一区| 91香蕉视频在线观看视频| 久久青草国产手机看片福利盒子 | 日本高清视频在线观看| 8x海外华人永久免费日韩内陆视频| 香蕉久久一区| 日韩中文字幕av在线| 香蕉成人久久| 欧美图片自拍偷拍| 亚洲色图另类专区| 中文字幕理论片| 亚洲奶大毛多的老太婆| 国内老司机av在线| 91亚洲精品在线| 操欧美老女人| 欧美激情精品久久久久久小说| av一区二区三区在线| 欧美精品xxxxx| 777a∨成人精品桃花网| 春暖花开成人亚洲区| 欧美性受xxx| 欧美日韩大片免费观看| 无码熟妇人妻av在线电影| 国产一区二区网址| 中国毛片直接看| 91麻豆精品国产91久久久| 在线免费观看黄色av| 国产精品爽爽ⅴa在线观看| 免费短视频成人日韩| 国产中文字幕免费观看| 99久免费精品视频在线观看| 国产精品999久久久| 欧美xingq一区二区| 亚洲资源一区| 99久久精品久久久久久ai换脸| 91亚洲一区| 日韩在线一区视频| 中文字幕在线观看不卡视频| 在线观看一二三区| 日韩中文在线中文网在线观看| 人人草在线视频| 欧美人与物videos另类| 久久久人人人| 日本理论中文字幕| 欧美三级电影一区| 欧美猛烈性xbxbxbxb| 国产伊人精品在线| 久久精品青草| 香蕉视频1024| 无码av免费一区二区三区试看 | www.久久色.com| 亚洲tv在线| 国产欧美久久久久| av电影在线观看一区| 在线天堂中文字幕| 伊是香蕉大人久久| 99久久久成人国产精品| 超碰超碰超碰超碰超碰| 成人免费av网站| 在线观看 亚洲| 久久精品国产久精国产一老狼| 国产亚洲字幕| 国产亚洲情侣一区二区无| 亚洲美女黄网| 一级片视频免费看| 亚洲国产精品久久一线不卡| 四虎精品一区二区三区| 日韩美女在线播放| 五月天激情综合网| 久久久久久久久久久久国产精品| 欧美性xxxx在线播放| 亚洲s色大片| 国产精品一区在线播放| 久久精品人人| 在线免费观看亚洲视频| 亚洲国产精品国自产拍av秋霞| 欧美暴力调教| 精品无码av无码免费专区| 91丝袜高跟美女视频| 91尤物国产福利在线观看| 久久久免费精品| 色综合久久一区二区三区| 97人妻精品一区二区三区免费| 欧美午夜不卡在线观看免费| 日本高清在线观看视频| 日韩av一区二区三区在线| 国产一级精品在线| 一本一道无码中文字幕精品热| 久久在线视频在线| 精品中文一区| 日批视频免费看| 欧美性色欧美a在线播放| av美女在线观看| 在线观看欧美亚洲| 久久视频一区二区| 国产成人三级在线观看视频|