개발/Node & Javascript
Nest.js 탐험기 7 - microservice (grpc) 를 사용해보자 - 인터셉터
말고기
2022. 3. 6. 23:58
728x90
반응형
개요
- 공통된 로직을 처리해야 할 경우 interceptor를 활용할 수 있다.
- nest.js grpc의 경우에도 interceptor를 활용할 수 있게 제공이 되는데, 이를 활용해 보도록 하자.
예제
1. Interceptor 생성
아래와 같이 interceptor에 대한 code를 작성해준다.
@Injectable()
export class GrpcLoggingInterceptor implements NestInterceptor {
private readonly logger = new Logger(GrpcLoggingInterceptor.name);
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
this.logger.log('Before...');
const rpcContext = context.switchToRpc(); // context를 rpc로 변경한다.
const metadata: Metadata = rpcContext.getContext(); // context data를 가져온다. rpc의 경우 metadata를 반환한다.
const data = rpcContext.getData(); // data object를 반환한다.
this.logger.log(`${JSON.stringify(metadata.toJSON())}`);
this.logger.log(`${metadata.get('a')[0]}`); // metadata의 value는 array로 가져오게 된다.
this.logger.log(`${JSON.stringify(data)}`);
const now = Date.now();
return next
.handle()
.pipe(
tap(() => this.logger.log(`After... ${Date.now() - now}ms`)),
);
}
}
2. Interceptor 등록
interceptor의 경우 controller 레벨에서도 등록가능하고, application level 단위로 등록이 가능하다.
이번 예제에서는 controller에 등록을 해두도록 하자.
@UseInterceptors(GrpcLoggingInterceptor)
@Controller()
export class HeroesController {
@GrpcMethod('HeroesService', 'FindOne')
findOne(data: HeroById, metadata?: Metadata, call?: ServerUnaryCall<any,any>): Hero {
//...
}
// ...
//
3. 결과 확인
- 아래와 같이 로깅 데이터를 확인할 수 있다.
- 주의점은 metadata의 경우 array로 오는 것을 주의만 하면 된다.
[Nest] 19964 - 03/06/2022, 11:56:44 PM LOG [GrpcLoggingInterceptor] Before...
[Nest] 19964 - 03/06/2022, 11:56:44 PM LOG [GrpcLoggingInterceptor] {"a":["b"],"malgogi":["3"],"user-agent":["grpc-node/1.24.7 grpc-c/8.0.0 (osx; chttp2; ganges)"]}
[Nest] 19964 - 03/06/2022, 11:56:44 PM LOG [GrpcLoggingInterceptor] b
[Nest] 19964 - 03/06/2022, 11:56:44 PM LOG [GrpcLoggingInterceptor] {"id":1}
출처
728x90
반응형