這篇文章帶大家了解一下Node後端框架Nest.js的AOP 架構,介紹一下Nest.js AOP 架構的好處,希望對大家有幫助!
Nest.js 是一個 Nodejs 的後端框架,它對 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:
- #ValidationPipe
# DefaultValuePipe
ParseFloatPipe
##同樣,Pipe 可以只對某個路由生效,也可以對每個路由都生效:
BadRequestException
UnauthorizedException
NotFoundException
#ForbiddenException
NotAcceptableException
RequestTimeoutException
ConflictException
GoneException
PayloadTooLargeException
UnsupportedMediaTypeException
#UnprocessableException
NotImplementedException
BadGatewayException
#ServiceUnavailableException
#ServiceUnavailableException
#ServiceUnavailableException
#ServiceUnavailableException
################ServiceUnavailableException###################ServiceUnavailableException###################S ####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 架構的好處,你感受到了麼? ######更多node相關知識,請造訪:###nodejs 教學###! ###以上是了解Node.js Nest.js的AOP 架構,聊聊其好處的詳細內容。更多資訊請關注PHP中文網其他相關文章!

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

SublimeText3 Linux新版
SublimeText3 Linux最新版

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器