【问题标题】:NestJs - How to get request body on interceptorsNestJs - 如何在拦截器上获取请求正文
【发布时间】: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
    }
}

【问题讨论】:

    标签: javascript node.js nestjs


    【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2013-01-11
        • 2018-10-31
        • 2020-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-03
        • 2020-04-24
        相关资源
        最近更新 更多