【问题标题】:Nestjs early return in interceptor sends [ERR_HTTP_HEADERS_SENT]拦截器中的 Nestjs 提前返回发送 [ERR_HTTP_HEADERS_SENT]
【发布时间】:2021-09-23 00:20:31
【问题描述】:

如果用户在 jwt 中被标记为演示用户,我将在控制器上使用拦截器来提供模拟数据

它工作正常,模拟数据被提供给客户端并且请求没有到达我的控制器,但我仍然在控制台中收到以下错误: UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

这是我的拦截器:

@Injectable()
export class UserPageStatsInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    // Let controller handle request
    if (!isDemo(context)) {
      return next.handle();
    }

    // Feed mock datas
    const res = context.switchToHttp().getResponse();

    res.status(200).send('Demo data');
  }
}

这是我的控制器:

@Get('statistics')
  @UseInterceptors(UserPageStatsInterceptor)
  getUsersGlobalStatistics(
    @Headers() headers: CustomHeaders,
    @Query() filters: BasicFiltersDTO,
    @Req() req,
  ): Promise<UserStatisticsDTO> {
    return 'Real data';
  }

我怀疑在我的UserPageStatsInterceptor 之后,请求继续在nestjs 框架内部的某个地方,但我无法找到在哪里。 我尝试在末尾添加returnres.end(),但它并没有改变任何东西。

请注意,这只发生在我的前端客户端上进行查询时,不会发生在邮递员中

提前谢谢你们!!

【问题讨论】:

    标签: express http-headers nestjs


    【解决方案1】:

    与其在拦截器中调用res.send(),不如只返回一个包含您想要返回的数据的可观察对象?

    @Injectable()
    export class UserPageStatsInterceptor implements NestInterceptor {
      intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
        // Let controller handle request
        if (!isDemo(context)) {
          return next.handle();
        }
    
        return of('Demo data');
      }
    }
    

    这将让 Nest 仍然处理响应,而不会妨碍实际运行您的服务代码。

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 2020-01-03
      • 2020-12-12
      • 2019-12-28
      • 2022-10-14
      相关资源
      最近更新 更多