Interceptor에는 AOP기술에서 영감을 받았다.
AOP란 관점 지향 프로그래밍으로 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다.
cats.controller.ts
@Get()
getAllCat() {
// throw new HttpException('api is broken', 401); // === throw new Error("")
return { cats: `get all cat` };
}
success.interceptor.ts
import {
Injectable,
NestInterceptor,
ExecutionContext,
CallHandler,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { map, tap } from 'rxjs/operators';
@Injectable()
export class Successnterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
console.log('Before...'); // pre-controller , middleware와는 실행순서가 다르다
const now = Date.now();
return next.handle().pipe(
map((data) => ({
success: true,
data,
})),
); // post-request
}
} // AOP
Before…
은 controller가 시작하기 전 즉, pre-controller 단계다.
return
은 request 이후 즉, post-request 단계다.
cats.controller.ts
@Controller('cats')
@UseInterceptors(SuccessInterceptor)
@UseFilters(HttpExceptionFilter)
export class CatsController {
constructor(
private readonly catsService: CatsService,
private readonly authService: AuthService, // DI , cats.module에서 Authmodule을 import 해야 사용가능
) {}
...
}
cats.controller.ts
에 @UseInterceptors(SuccessInterceptor)
를 넣어주면 cats.controller.ts
로 들어가는 요청은 모두 interceptor
를 거치게 된다.
위와 같은 코드의 서버에 클라이언트 요청을 보낸 후 받은 응답(server response)은 다음과 같다.