如何在NestJS中将Query参数传入自定义Pipe?
解决方案:在自定义Pipe中获取Query参数
你遇到的错误是因为装饰器在类初始化阶段就会执行,而方法里的@Query() query是请求处理时才会注入的变量,此时在@UploadedFile装饰器里引用query自然找不到这个变量。
要在自定义Pipe中获取Query参数,正确做法是通过Nest的依赖注入机制,直接在Pipe中注入Request对象,从而拿到请求的Query参数。具体步骤如下:
1. 修改自定义Pipe,注入Request对象
给你的ExcelToJsonPipe和JsonValidationPipe添加@Injectable()装饰器,并注入Express的Request对象:
import { Injectable, PipeTransform, BadRequestException, Inject } from '@nestjs/common'; import { Request } from 'express'; import { REQUEST } from '@nestjs/core'; @Injectable() export class ExcelToJsonPipe implements PipeTransform { // 注入Request对象 constructor(@Inject(REQUEST) private readonly request: Request) {} async transform(value: any, metadata: ArgumentMetadata) { if (!value) { throw new BadRequestException('No file uploaded'); } // 直接从request中获取已验证的Query参数 const queryParams = this.request.query; // 这里可以使用queryParams.gameFormat等参数执行转换逻辑 // 你的Excel转JSON逻辑... return transformedJson; } }
对JsonValidationPipe做同样修改,注入Request后在transform方法中获取Query参数即可。
2. 控制器中简化Pipe的使用
因为现在Pipe会自动注入Request,所以在@UploadedFile装饰器中只需要传入Pipe的类即可,不需要手动实例化:
@UsePipes( new JoiValidationPipe({ param: getByIdValidations, query: uploadExcelQueryValidation, }), ) @UseInterceptors(FileInterceptor('file')) @Post(':id/questions/uploadExcel') async createQuestionsByUploadExcel( @Param() params, @Query() query, // 直接传入Pipe类,Nest会自动处理依赖注入 @UploadedFile(ExcelToJsonPipe, JsonValidationPipe) file: Express.Multer.File, ) { return this._genieJourneyService.generateQuestionsByUploadExcel(params.id, file); }
方案说明
- Nest的DI容器会自动为标记了
@Injectable()的Pipe注入REQUEST对象,该对象包含当前请求的所有信息(包括Query参数)。 - 你已经通过
JoiValidationPipe验证了Query参数,所以在自定义Pipe中获取到的queryParams是经过校验后的合法数据,可以直接使用。
内容的提问来源于stack exchange,提问作者Ravi kant
相关产品推荐
相关产品推荐

