You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:53:14