직물! 프론트엔드 Nest.js의 핵심 원칙을 이해하는 데 도움이 되는 기사

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)。 下面是它的逻辑图。

MVC.png

(2)IOC

(1) IOC는 Inverse Of Control의 약자입니다. @Controller 및 @Injectable 데코레이터를 통해 선언된 클래스는 Nest.js에 의해 스캔되어 해당 객체가 생성되어 컨테이너에 추가됩니다. 이러한 객체는 생성자에서 선언된 종속성, 즉 DI( 의존성 주입), 이것이 IOC의 아이디어입니다.

(2) IOC 아키텍처의 장점은 객체를 수동으로 생성하고 종속성에 따라 다른 객체의 생성자에 전달할 필요가 없다는 것입니다.모든 것이 자동으로 스캔, 생성 및 주입됩니다.

컨트롤러.png

주입.png

(3) AOP

AOP架构又是什么呢?AOP是Aspect Oriented Program的简写。也就是面向切面编程。

Nest에서는 요청이 오면 왔다 Controller갔다 Service합니다 Repository. 즉, MVC의 프로세스입니다. 이것을 입력하기 전에 Controller하나 JWT이상의 예외 처리, 로그 처리 등을 수행합니다.

제어 계층의 코드를 직접 수정하는 경우 Controller이는 분명히 매우 부적절하며 컨트롤러를 제어할 수 없게 만들 수도 있습니다.

따라서 제어 계층(C)에 들어가기 전에 슬라이스가 만들어지고 Controller들어가기 전에 약간의 처리가 수행됩니다. 아래 그림과 같이:

AOP.png

Nest.js에서 AOP를 구현하는 방법에는 Gurad(가드), Pipe(파이프), Interceptor(인터셉터), ExceptionFilter(예외 필터), Middleware(미들웨어)의 5가지가 있습니다.

미들웨어의 구현 AOP은 특별 Express합니다. 미들웨어 양파 모델은 외부 계층을 투명하게 덮고 일부 논리를 추가할 수 있으며 내부 계층은 인식할 수 없기 때문입니다. Nest.js Middleware미들웨어는 Express 프레임워크에서 직접 상속됩니다.

下面是AOP的一个例子代码:   

AOP 예시.png

위의 코드는 두 개의 투명 로직 레이어(권한 제어 및 인터셉터)를 개별 경로 Gurad에 추가 하므로 이점이 있습니다 Interceptor.AOP

1. 思考:当AOP的五种创建方式同时存在的时候,是先执行哪种方式呢?

3. 소스 코드 읽기

우리가 어떤 언어를 배울 때, 우리는 특히 이 실행 순서의 관점에서 소스 코드를 살펴보아야 합니다. 우리는 종종 소스 코드에서 답을 찾을 수 있습니다. 이 문제에 대한 응답으로 github의 clone에서 소스 코드에 대한 대상 연구를 수행했습니다.

主要文件:`router-execution-context.ts`

create(1) 먼저, 함수가 반환하는 함수 를 살펴보자 . 실행 순서를 보면 그 함수가 먼저 판단되는 것을 알 수 있는데, fnCanActivate이 함수는 yes Guard즉, Guard권한이 있는지 판단하는데 사용된다.

AOP 실행 명령-1.png

(2) 함수 fnCanActivate를 호출 createGuardsFn하여 함수에 진입하여 권한이 있는지 확인하고 권한이 없으면 예외를 throw하고 예외를 ExceptionFilter처리합니다.

AOP 실행 순서-2.png

(3) 다음으로 Interceptor인터셉터 처리가 호출 Guard되며 체인 호출 처리와 동일합니다. Controller모든 처리 가 완료된 후 호출할 마지막 메서드 입니다. 즉, 진입 경로입니다.

AOP 실행 명령-3.png

(4) 경로에 진입하기 전, 즉 Controller메소드 를 호출하기 전에 Pipe이러한 매개변수를 처리하는 데 사용됩니다.

AOP 실행 명령-4.png

AOP 실행 명령-5.png

AOP 실행 명령-6.png

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的调用顺序可以由下面流程图表示:

AOP 실행 순서 흐름도.png

마지막으로 썩은 기간 동안 모든 수확을 기원합니다

추천

출처juejin.im/post/7118642542475739172