精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧洲黄色一级视频| 精品久久久三级| 国产精品18在线| 久久久久久久久久久久电影| 亚洲一区二区视频在线观看| 免费看成人av| a级片免费视频| 国产精品呻吟| 精品国模在线视频| 中文字幕日韩三级片| 成人看片网页| 国产精品国产自产拍在线| 亚洲自拍在线观看| 久草手机在线视频| 欧美aa国产视频| 亚洲男人天堂网| 亚洲精品在线视频播放| 日韩脚交footjobhd| 国产精品美女一区二区| 精品福利影视| 精品国自产在线观看| 蜜桃久久av| 欧美国产精品人人做人人爱| 国产成人免费观看网站| 欧美成人一区在线观看| 欧美日韩不卡在线| 黄色a级片免费| 黄色成人在线网| 国产日韩欧美精品在线| 国产精品视频一区二区三区经| 中文字幕久久网| 国产日韩一区二区三区在线| 九九热r在线视频精品| 黄色裸体一级片| 久久99免费视频| 亚洲第一av在线| 欧美精品 - 色网| 一区二区视频免费完整版观看| 亚洲va欧美va天堂v国产综合| 这里只有精品66| 国产在线小视频| 2021国产精品久久精品| 国产主播一区二区三区四区| 99国产精品久久久久久久成人 | 欧美乱人伦中文字幕在线| 国产一区二区三区四区五区六区| 女仆av观看一区| 亚洲第一色中文字幕| wwwww在线观看| 精品一区二区三区亚洲| 欧美高清性hdvideosex| 蜜桃免费在线视频| 成人免费黄色| 在线观看区一区二| 欧美伦理片在线看| 精品三区视频| 欧美性三三影院| 香蕉视频禁止18| 欧美男男gaygay1069| 欧美区一区二区三区| 久久久久久久久久一区二区| 久草综合在线| 91麻豆精品国产91久久久久久久久| 国产主播中文字幕| 国产成人福利夜色影视| 欧美日韩中文精品| 九九九九九国产| 欧美另类中文字幕| 欧美精品一区二区三区四区 | 黄色免费观看视频网站| 中文日产幕无线码一区二区| 色一区在线观看| www.xxx亚洲| 国产成人a视频高清在线观看| 51午夜精品国产| 国产调教打屁股xxxx网站| aaa国产精品视频| 亚洲精品丝袜日韩| 成人一级片免费看| 欧美在线亚洲综合一区| 91精品国产高清自在线看超| 波多野结衣不卡| 久久成人免费网站| 国产精品9999久久久久仙踪林| 日韩在线观看视频网站| 久久精品夜色噜噜亚洲a∨ | 欧美成人亚洲| 97avcom| 国产免费www| 国产一区二区三区综合| 精品91免费| 日韩子在线观看| 亚洲一区二区精品久久av| 欧美a在线视频| 亚洲欧洲二区| 亚洲精品av在线播放| 日本午夜精品视频| 亚洲国内精品| 国产伦精品免费视频| 丰满人妻一区二区三区免费视频 | 久久久亚洲综合网站| 午夜激情视频在线观看| 亚洲成av人片| 亚洲精品在线网址| 久久综合欧美| 欧美日本高清一区| 小泽玛利亚一区二区三区视频| 国产精品一区二区在线观看不卡| 精品亚洲欧美日韩| 成视频免费观看在线看| 一本大道久久精品懂色aⅴ | 久久久久久久久久久久电影| 亚洲男女性事视频| 久久久国产精华液| 久久成人综合网| 欧美一区观看| av资源中文在线| 91精品国产综合久久久蜜臀图片 | 国内精品小视频| 亚洲资源在线播放| 久久综合狠狠综合久久激情 | 日韩免费一区二区| 女人裸体性做爰全过| 久久精品国语| 九九九九精品九九九九| 欧美1234区| 4438x亚洲最大成人网| 我不卡一区二区| 国产美女一区| 国产在线播放一区二区| 污污网站在线看| 欧美精品三级日韩久久| 国产18无套直看片| 久久男女视频| 久久免费视频1| 高清在线视频不卡| 亚洲精品一区二区三区精华液| 九九热只有精品| 国内外成人在线视频| 亚洲视频小说| 久久免费资源| 色多多国产成人永久免费网站| 中文字幕在线观看视频免费| 91美女福利视频| 国模无码视频一区二区三区| 久久aimee| 欧美亚洲在线播放| 亚欧在线观看视频| 精品高清一区二区三区| 精品无码人妻少妇久久久久久| 欧美视频成人| 国产精品久久久久久久久久久久午夜片 | jizz国产精品| 国内自拍欧美激情| 天天综合网在线观看| 欧美午夜精品久久久久久浪潮 | 国产精品家庭影院| 久久久久久久久久一区| 99久久夜色精品国产亚洲96 | 日韩亚洲在线视频| 欧美日韩国产一区二区三区不卡| 国产精品久久久久久亚洲影视| av在线天堂| 制服.丝袜.亚洲.另类.中文| 欧美国产日韩在线观看成人| 国产99精品国产| 免费成人午夜视频| 狠狠做深爱婷婷综合一区| 国产精品久久久久久av下载红粉 | 国产精品久久久久一区| 免费网站在线观看黄| 欧美高清不卡| 精品日韩欧美| 欧美97人人模人人爽人人喊视频| 另类色图亚洲色图| 少妇人妻偷人精品一区二区| 色综合天天视频在线观看| 亚洲最大成人综合网| 国产乱理伦片在线观看夜一区| 久久久久久久9| 九九久久电影| 亚洲永久在线观看| 伊人成综合网站| 久久精品91久久香蕉加勒比| 欧美视频一二区| 色屁屁一区二区| 丝袜美腿小色网| 91亚洲精品乱码久久久久久蜜桃| 欧美成人黑人猛交| 亚洲欧美在线专区| 欧美日韩国产高清视频| 久久av网站| 日韩av快播网址| 尤物视频在线看| 亚洲视频综合网| 精品人妻一区二区三区换脸明星 | 国产精品美女视频| 稀缺小u女呦精品呦| 蜜桃视频免费观看一区| 成人午夜免费在线| 国产精品久久占久久| 精品在线不卡| 精品国产一区二区三区性色av | 波多野结衣mp4| 亚洲自拍偷拍av| 青青青视频在线播放| 91在线视频观看| 精品国产午夜福利在线观看| 视频一区中文字幕国产| 国产一二三区在线播放| 99欧美视频| 日韩欧美亚洲区| 日本一区福利在线| www.久久久| 伦一区二区三区中文字幕v亚洲| 97视频免费看| 久久av色综合| 久久久国产91| 99青草视频在线播放视| 亚洲福利在线播放| 国产aⅴ爽av久久久久成人| 在线亚洲免费视频| 亚洲精品1区2区3区| 亚洲视频每日更新| 欧美性生给视频| 欧美激情一区三区| 国产成人无码精品久久二区三| 成人晚上爱看视频| 国产男女无遮挡猛进猛出| 麻豆久久一区二区| 亚洲五月天综合| 午夜在线精品偷拍| 97国产精东麻豆人妻电影| 国产精品地址| 国产一级大片免费看| 小说区亚洲自拍另类图片专区| 日韩欧美一区二区三区四区五区 | 久久久国产精品网站| 国产精品久久97| 韩国精品主播一区二区在线观看| 欧美中文在线字幕| 老牛影视精品| 欧美有码在线视频| 手机在线理论片| 欧洲永久精品大片ww免费漫画| 在线男人天堂| 欧美中文字幕在线| 欧美三区四区| 国产精品自产拍在线观| 中文成人在线| 亚洲一区二区三区在线视频| 国产精品欧美一区二区三区不卡 | 欧美激情一二区| 毛片在线导航| 91sao在线观看国产| 伊人成综合网站| 国产精品高潮视频| 日韩五码电影| 亚洲综合色av| 国产精品天天看天天狠| 久99久在线| 成人无号精品一区二区三区| 一本一道久久a久久精品综合 | 国产精品白浆| 欧美h视频在线| 日本一区二区在线看| 国产卡一卡二在线| 精品电影一区| aa免费在线观看| 久久国产精品72免费观看| 第一页在线视频| 91啪九色porn原创视频在线观看| 美女爆乳18禁www久久久久久| 中文字幕日韩av资源站| 欧美黄片一区二区三区| 欧美特黄级在线| 自拍偷拍福利视频| 日韩精品影音先锋| 欧美色18zzzzxxxxx| 色爱av美腿丝袜综合粉嫩av| 日韩成人伦理| 国产精品444| 国产精选久久| 明星裸体视频一区二区| 国产精品久久久久久久久久10秀| 激情五月六月婷婷| 日日噜噜夜夜狠狠视频欧美人| 日韩在线不卡一区| 99视频有精品| 精品国产视频在线观看| 黑人欧美xxxx| 国产精品熟女久久久久久| 亚洲精品美女在线观看| 免费**毛片在线| 国产91精品青草社区| 亚洲成人a级片| 久久资源av| 欧美xxx在线观看| 成人羞羞国产免费网站| 国产精品亚洲成人| 在线观看亚洲大片短视频| 亚洲一区二区偷拍精品| 中文字幕在线观看精品| 亚洲二区中文字幕| 最新超碰在线| 国产精品国产三级国产专播精品人 | 色综合久久影院| 欧美一二三视频| 日韩精品一区国产| 亚洲精品9999| 国产美女诱惑一区二区| 国产裸体视频网站| 国产精品九色蝌蚪自拍| 一二三区免费视频| 亚洲成人av中文字幕| 国内精品久久久久久野外| 国产a级全部精品| 红杏一区二区三区| 欧美与动交zoz0z| 蜜桃av一区二区三区电影| yy6080午夜| 亚洲影院在线观看| 国产精品久久久久久免费| 一本色道久久综合狠狠躁篇怎么玩| 波多一区二区| 波多野结衣久草一区| 久久久久久影院| 国产三级国产精品国产专区50| 久久女同性恋中文字幕| 日本少妇xxxx动漫| 精品日韩在线观看| 在线三级中文| **亚洲第一综合导航网站| 手机亚洲手机国产手机日韩| 妞干网在线免费视频| 26uuu久久综合| 国产做受高潮漫动| 亚洲国产精品福利| 9999在线视频| 国产一区二区久久久| 国产精品s色| 欧美一级大片免费看| 亚洲男人天堂av网| 国产av无码专区亚洲av麻豆| 欧美成人免费在线观看| 老司机亚洲精品一区二区| 国产又粗又爽又黄的视频| 国产中文字幕精品| 欧美人禽zoz0强交| 日韩写真欧美这视频| 污视频在线免费观看网站| 91成人在线看| 黄色日韩精品| 男生裸体视频网站| 色哟哟国产精品| 在线观看麻豆蜜桃| 91亚洲精品视频| 欧美日韩国产成人精品| 99免费观看视频| 天天综合色天天综合色h| 欧美日韩国产综合视频| 国产精品第100页| 俺要去色综合狠狠| 在线免费观看av网| 一区二区成人在线观看| 污污网站在线免费观看| 日韩**中文字幕毛片| 第一会所亚洲原创| 搡的我好爽在线观看免费视频| 亚洲精品视频在线| 香蕉视频免费看| 国产精品揄拍500视频| 一区二区三区在线| 中文字幕影片免费在线观看| 色婷婷激情久久| 黄视频在线观看网站| 国产精品亚洲一区| 日日夜夜精品视频免费| 性生交大片免费全黄| 欧美mv和日韩mv的网站| 欧美成人a交片免费看| 综合网五月天| jlzzjlzz亚洲日本少妇| av手机天堂网| 欧美成人午夜视频| 蜜桃一区二区| 国产永久免费网站| 精品欧美国产一区二区三区| 香蕉视频在线播放| 国产精品一区二区三区四区五区| 天堂久久久久va久久久久| 黄色一级片中国| 亚洲欧美日韩高清| 日韩免费精品| 一级特黄性色生活片| 亚洲福利国产精品| av播放在线| 久久久久久久久久久一区| 精品写真视频在线观看| 日韩 欧美 综合|