NestJs - 如何在拦截器上获取请求正文

Posted

技术标签:

【中文标题】NestJs - 如何在拦截器上获取请求正文【英文标题】:NestJs - How to get request body on interceptors 【发布时间】:2019-01-25 01:46:56 【问题描述】:

我需要在我的拦截器上获取请求正文,然后它才能到达我的控制器:

import  Injectable, NestInterceptor, ExecutionContext, HttpException, HttpStatus  from '@nestjs/common';
import  Observable  from 'rxjs';
import  map  from 'rxjs/operators';

@Injectable()
export class ExcludeNullInterceptor implements NestInterceptor 
    intercept(context: ExecutionContext, call$: Observable<any>): Observable<any> 
        // How can I get the request body here?
        // Need to be BEFORE the Controller exec
    

【问题讨论】:

【参考方案1】:

在你的拦截器中你可以这样做:

async intercept(context: ExecutionContext, stream$: Observable<any>): Observable<any> 
    const body = context.switchToHttp().getRequest().body;
    // e.g. throw an exception if property is missing

或者,您可以使用可以直接访问请求的中间件:

(req, res, next) => 

【讨论】:

【参考方案2】:

如果您的interceptor 用于休息端点,我认为Kim Kern completely covered this part in his answer。

还有其他使用interceptorcontrollers 的可能性。 例如,controller 可以是您的微服务的入口点,例如监听 kafka 消息(或任何不同的消息):

@Controller()
export class DemoConsumerController 
  private readonly logger = new Logger(DemoConsumerController.name);

  @UseInterceptors(LogInterceptor)
  @EventPattern('demo-topic')
  async listenToKafkaMessage (
    @Payload() payload,
    @Ctx() context: KafkaContext,
  ) 
    this.logger.debug(`payload: $payload`)
    this.logger.verbose(`Topic: $context.getTopic()`);
    this.logger.verbose(`KafkaContext: $JSON.stringify(context)`);
  

在这种情况下,要获取正文,或者更好地说消息,您需要稍作修改:

    intercept(context: ExecutionContext, next: CallHandler): Observable<any> 
        const value = context.switchToHttp().getRequest().value

        // default rest part of code
        return next.handle()
    

因此,为避免误解,您可以验证您的请求以弄清楚该值包含您的有效负载:

console.log('getRequest: ', context.switchToHttp().getRequest())
// or 
console.log('context: ', context)

【讨论】:

以上是关于NestJs - 如何在拦截器上获取请求正文的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NestJS 拦截器中获取处理程序路由(对于 Express 和 Fastify)

如何在 NestJS 中记录所有 Axios 外部 http 请求

如何使用 NestJS 将纯文本作为我的请求正文传递?

nestjs 文件上传

如何在 swagger nestjs 中手动添加摘要和正文

如何拦截特定请求