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

时间:2020-07-21 20:09:56

标签: javascript node.js nestjs

我在Nest.js中定义了自定义管道

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

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

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

它工作正常,对于每个请求,管道都将测试消息记录到控制台。现在,在控制器B中,我使用相同的装饰器,但是对于具有基本req和res对象作为参数的方法:

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

在这里不起作用。尽管通过上述方法接收到请求,但未调用管道变换方法。这可能是什么原因?在方法中使用@Req和@Res参数时,我在文档中找不到任何有关管道无法正常工作的信息。

如果是这种情况(看来是这样),我该如何解决?我不能只使用@Query查询方法参数,因为我需要根据查询参数发送回不同的标头。

1 个答案:

答案 0 :(得分:1)

在REST上下文中,管道仅适用于@Body()@Param()@Query()和自定义装饰器。 There's a brief mention here,但这绝对应该添加到文档中。

从技术上讲,您可以为reqres创建一个自定义装饰器,并为它们运行管道。

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

然后将其用作@ReqDec()