Nest.js 기사
다음 내용은 Nest.js 源码
와 图形
조합 방식으로 설명합니다. 5-10분 동안 그대로 두면 무언가를 얻을 수 있기를 바랍니다.
1. Nest.js는 무엇입니까?
Nest.js 是一个 Node.js 的后端框架,它是对Express上做了一层封装,解决了架构问题。
它提供了 Express 没有的 MVC、IOC、AOP 等架构特性,使得代码更容易维护、扩展。
2. Nest.js의 핵심 기술: MVC, IOC, AOP
MVC,IOC,AOP是Nest.js编程上最常用的核心技术,而这些技术类似于Java的Spring,
在社区上,有一句对它的描述: "JS版的Spring"。
(1) MVC
MVC是Model View Controller的简写。也就是模型层,视图层,控制层。
它跟MVVM架构不一样,MVC架构下,请求会先发送到控制层(C) ,再由它调度模型层(M)的Service来完成业务逻辑,
最后返回对应的视图层(V)。 下面是它的逻辑图。
(2)IOC
(1) IOC는 Inverse Of Control의 약자입니다. @Controller 및 @Injectable 데코레이터를 통해 선언된 클래스는 Nest.js에 의해 스캔되어 해당 객체가 생성되어 컨테이너에 추가됩니다. 이러한 객체는 생성자에서 선언된 종속성, 즉 DI( 의존성 주입), 이것이 IOC의 아이디어입니다.
(2) IOC 아키텍처의 장점은 객체를 수동으로 생성하고 종속성에 따라 다른 객체의 생성자에 전달할 필요가 없다는 것입니다.모든 것이 자동으로 스캔, 생성 및 주입됩니다.
(3) AOP
AOP架构又是什么呢?AOP是Aspect Oriented Program的简写。也就是面向切面编程。
Nest에서는 요청이 오면 왔다 Controller
갔다 Service
합니다 Repository
. 즉, MVC의 프로세스입니다. 이것을 입력하기 전에 Controller
하나 JWT
이상의 예외 처리, 로그 처리 등을 수행합니다.
제어 계층의 코드를 직접 수정하는 경우 Controller
이는 분명히 매우 부적절하며 컨트롤러를 제어할 수 없게 만들 수도 있습니다.
따라서 제어 계층(C)에 들어가기 전에 슬라이스가 만들어지고 Controller
들어가기 전에 약간의 처리가 수행됩니다. 아래 그림과 같이:
Nest.js에서 AOP를 구현하는 방법에는 Gurad
(가드), Pipe
(파이프), Interceptor
(인터셉터), ExceptionFilter
(예외 필터), Middleware
(미들웨어)의 5가지가 있습니다.
미들웨어의 구현 AOP
은 특별 Express
합니다. 미들웨어 양파 모델은 외부 계층을 투명하게 덮고 일부 논리를 추가할 수 있으며 내부 계층은 인식할 수 없기 때문입니다. Nest.js Middleware
미들웨어는 Express 프레임워크에서 직접 상속됩니다.
下面是AOP的一个例子代码:
위의 코드는 두 개의 투명 로직 레이어(권한 제어 및 인터셉터)를 개별 경로 Gurad
에 추가 하므로 이점이 있습니다 Interceptor
.AOP
1. 思考:当AOP的五种创建方式同时存在的时候,是先执行哪种方式呢?
3. 소스 코드 읽기
우리가 어떤 언어를 배울 때, 우리는 특히 이 실행 순서의 관점에서 소스 코드를 살펴보아야 합니다. 우리는 종종 소스 코드에서 답을 찾을 수 있습니다. 이 문제에 대한 응답으로 github의 clone에서 소스 코드에 대한 대상 연구를 수행했습니다.
主要文件:`router-execution-context.ts`
create
(1) 먼저, 함수가 반환하는 함수 를 살펴보자 . 실행 순서를 보면 그 함수가 먼저 판단되는 것을 알 수 있는데, fnCanActivate
이 함수는 yes Guard
즉, Guard
권한이 있는지 판단하는데 사용된다.
(2) 함수 fnCanActivate
를 호출 createGuardsFn
하여 함수에 진입하여 권한이 있는지 확인하고 권한이 없으면 예외를 throw하고 예외를 ExceptionFilter
처리합니다.
(3) 다음으로 Interceptor
인터셉터 처리가 호출 Guard
되며 체인 호출 처리와 동일합니다. Controller
모든 처리 가 완료된 후 호출할 마지막 메서드 입니다. 즉, 진입 경로입니다.
(4) 경로에 진입하기 전, 즉 Controller
메소드 를 호출하기 전에 Pipe
이러한 매개변수를 처리하는 데 사용됩니다.
4. 요약
MVC是Model View Controller的简写。请求先经过Controller,然后再调用Model进行Service、Repository完成业务逻辑,
最后返回对应的View。
IOC是Inverse Of Control的简写。IOC是指Nest.js会自动扫描带有@Controller、@Injectable装饰器的类,
创建他们的对象,并根据依赖关系自动注入它依赖的对象,免去了手动创建和组装对象的麻烦。
AOP是Aspect Oriented Program的简写。AOP是把通用的逻辑抽离出,通过切面编程的方式添加到某个方法,类上去,
可以复用其通用逻辑。Gurad(守卫)、Pipe(管道)、Interceptor(拦截器)、ExceptionFilter(异常过滤器)、
还有Middleware(中间件)。这些都是AOP思想的实现。其AOP在Nest.js的调用顺序可以由下面流程图表示:
마지막으로 썩은 기간 동안 모든 수확을 기원합니다