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 框架内部的某个地方,但我一直无法找到位置。
我试过在最后添加 return
或 res.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 仍然处理响应,而不会妨碍实际 运行 您的服务代码。
如果用户在 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 框架内部的某个地方,但我一直无法找到位置。
我试过在最后添加 return
或 res.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 仍然处理响应,而不会妨碍实际 运行 您的服务代码。