Nestjs 早期 return 在拦截器中发送 [ERR_HTTP_HEADERS_SENT]

Nestjs early return in interceptor sends [ERR_HTTP_HEADERS_SENT]

如果用户在 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() 但它没有改变任何东西。

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

提前谢谢你们!!

与其在拦截器内部调用 res.send(),为什么不直接 return 一个包含您想要的数据的可观察对象 return?

@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 仍然处理响应,而不会妨碍实际 运行 您的服务代码。