인터셉터
@Injectable()인터셉터는 데코레이터 로 주석이 달린 클래스 이며 NestInterceptor인터페이스를 구현합니다.
인터셉터에는 AOP( Aspect Oriented Programming ) 기술 에서 영감을 받은 유용한 기능 세트가 있습니다 . 이를 통해 다음을 수행할 수 있습니다.
- 메서드 실행 전후에 추가 논리 바인딩
- 함수에서 반환된 결과를 변환
- 함수에서 throw된 예외를 변환합니다.
- 기본 기능 동작 확장
- 특정 조건에 따라 함수를 완전히 재정의합니다(예: 캐싱 목적)
라이프 사이클
- Incoming request
- Globally bound middleware
- Module bound middleware
- Global guards
- Controller guards
- Route guards
- Global interceptors (pre-controller)
- Controller interceptors (pre-controller)
- Route interceptors (pre-controller)
- Global pipes
- Controller pipes
- Route pipes
- Route parameter pipes
- Controller (method handler)
- Service (if exists)
- Route interceptor (post-request)
- Controller interceptor (post-request)
- Global interceptor (post-request)
- Exception filters (route, then controller, then global)
- Server response
위 라이프 사이클을 보면 미들웨어랑 인터셉터랑 차이점은 실행 순서다. 미들웨어 같은경우 요청이 들어오고 바로 실행되
고 인터셉터는 pre ,post로 나눠저 실행된다.
import {
Injectable,
NestInterceptor,
ExecutionContext,
CallHandler,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Injectable()
export class SuccessInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
return next.handle().pipe(
map((data) => ({
success: true,
data,
})),
);
}
}
요청에 성공했을때 찍어주는 인터셉터 로그 코드다.
@Controller('cats')
@UseInterceptors(SuccessInterceptor)
@UseFilters(HttpExceptionFilter)
export class CatsController {
constructor(private readonly catsService: CatsService) {}
@UseInterceptors(SuccessInterceptor) 를 사용하여 사용하고 싶은 클래스에 달아주면 된다.
'node.js' 카테고리의 다른 글
Nest.js - validation (0) | 2022.08.29 |
---|---|
Nest.Js - mongoDB 연결 (0) | 2022.08.29 |
Nest.js - pipes (0) | 2022.08.20 |
Nest.js - 예외 필터 (0) | 2022.08.20 |
Nest.js - 미들웨어 (0) | 2022.08.20 |