我正在尝试设置元数据以响应来自 Nestjs 拦截器的 Grpc 请求。 但我找不到在哪里设置它。有谁知道这是如何工作的?这是我到目前为止尝试过的。
Injectable()
export class SomeInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const ctx = context.switchToRpc();
console.log(ctx.getContext());
// ctx.getResponse().Metadata.set(key,value)
return next.handle().pipe(tap((t) => console.log(t)));
}
}
这是我在 NATS 上下文中的实现。它应该是可转让的,因为它们都是
RPCs
。
export class MetadataInterceptor implements NestInterceptor {
intercept(
context: ExecutionContext,
next: CallHandler<any>,
): Observable<any> | Promise<Observable<any>> {
if (context.getType() === 'rpc') {
const message = context.getArgByIndex(0);
const natsContext = context.switchToRpc().getContext<NatsContext>();
message.metadata.info = natsContext.getArgs();
}
return next.handle();
}
}
记下
if(context.getType() === 'rpc')
检查以确保它是 rpc 操作。您可以通过装饰控制器来注入拦截器,如下所示:@UseInterceptors(MetadataInterceptor)
。或者,作为 main.ts 中的全局拦截器:app.useGlobalInterceptors(new MetadataInterceptor());