繁体   English   中英

Nest.js 自定义 pipe 验证器不适用于带有 @Req() 和 @Res() 参数的方法

[英]Nest.js custom pipe validator not working for method with @Req() and @Res() parameters

我在 Nest.js 中定义了自定义 pipe

 @Injectable()
export class QueryValidationPipe implements PipeTransform<GetDto> {
    public transform(value: GetDto, metadata: ArgumentMetadata): GetDto {
      console.log('TEST');
      (...)
      return value;
}

我在 controller 中将它用于 controller A 中的某些 GET 方法。我正在使用 Nest.js @Query装饰器:

@Get()
@UsePipes(new QueryValidationPipe())
@UseFilters(new ExceptionFilters())
public async getMethod(@Query() query: GetDto) {
    (...)
}

它工作正常,对于每个请求,pipe 正在将测试消息记录到控制台。 现在在 controller B 我使用相同的装饰器,但是对于使用底层 req 和 res object 作为参数的方法:

@Get()
@UsePipes(new QueryValidationPipe())
@UseFilters(new ExceptionFilters())
public async getMethodTo(@Req() req: GetRequest, @Res() res: Response): Promise<Response> {
    (...)
}

在这里它不起作用。 尽管上述方法接收到请求,但未调用 Pipe 变换方法。 这可能是什么原因? 当在方法中使用@Req 和@Res 参数时,我在文档中没有找到任何关于管道不起作用的词。

如果是这样(似乎是这样),我该如何解决这个问题? 我不能只使用@Query 查询方法参数,因为我需要根据查询参数发回不同的标头。

管道仅适用于 REST 上下文中的@Body()@Param()@Query()和自定义装饰器。 这里有一个简短的提及,但这绝对应该添加到文档中。

从技术上讲,您可以为reqres制作自定义装饰器并让管道为它们运行。

export const ReqDec = createParamDecorator(
  (data: unknown, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    return request;
  },
);

然后将其用作@ReqDec()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM