javascript - Nest.js 自定义管道验证器不适用于带有 @Req() 和 @Res() 参数的方法
问题描述
我在 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 查询方法参数,因为我需要根据查询参数发回不同的标头。
解决方案
管道仅适用于 REST 上下文中的 、@Body()
和自定义装饰器。这里有一个简短的提及,但这绝对应该添加到文档中。@Param()
@Query()
从技术上讲,您可以为它们制作一个自定义装饰器,req
并res
让管道为它们运行。
export const ReqDec = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
return request;
},
);
然后将其用作@ReqDec()