GraphQL Mutation接收参数为空问题排查求助
GraphQL Mutation请求参数为空问题排查
问题描述
我在GraphQL项目的Resolver类中编写了如下Mutation:
@Mutation((returns) => StyleOperationHead) async saveStyleOperationHead( @Args('styleOperationHeadData') styleOperationHeadData: StyleOperationHeadInputDto, ): Promise<StyleOperationHead> { console.log(styleOperationHeadData) return { operationId: 1, style: 'HSF222005A', color: 'RED', structureType: 1, baseTemplateId: 1, numberOfJobGroups: 3, totalSmv: 54, }; }
使用以下查询调用该端点:
# Write your query or mutation here mutation { saveStyleOperationHead(styleOperationHeadData: { style: "HSF222005A" color: "RED" structureType: 1 baseTemplateId: 1 numberOfJobGroups: 3 totalSmv: 54 } ) { operationId style color structureType baseTemplateId numberOfJobGroups totalSmv } }
但传入的请求参数始终为空,控制台输出为StyleOperationHeadInputDto {}。已检查模型和DTO与请求的一致性,未发现差异,请问哪里操作有误?
可能的原因及解决方法
1. DTO未正确添加GraphQL输入类型装饰器
如果使用TypeGraphQL或NestJS的GraphQL模块,StyleOperationHeadInputDto必须通过装饰器标记为GraphQL输入类型,并且每个字段都要声明为可解析字段:
import { InputType, Field } from 'type-graphql'; // 若使用NestJS内置GraphQL,导入@nestjs/graphql下的InputType和Field @InputType() export class StyleOperationHeadInputDto { @Field() style: string; @Field() color: string; @Field() structureType: number; @Field() baseTemplateId: number; @Field() numberOfJobGroups: number; @Field() totalSmv: number; }
缺少这些装饰器时,GraphQL无法识别DTO的字段结构,导致请求参数无法映射到DTO实例,最终输出空对象。
2. @Args装饰器未显式指定类型
在NestJS场景中,部分情况下TypeScript的类型元数据无法被自动提取,需要在@Args中显式指定DTO类型:
@Args('styleOperationHeadData', { type: () => StyleOperationHeadInputDto }) styleOperationHeadData: StyleOperationHeadInputDto,
显式声明类型可以帮助GraphQL正确解析并转换请求参数。
3. 字段命名大小写不匹配
确认请求中的字段名与DTO类中的字段名完全一致(包括大小写)。例如若DTO中定义的是structureType,而请求中写成structuretype,会导致字段映射失败。虽然你的请求看起来字段名匹配,仍建议再次仔细核对。
4. 未配置类转换器管道(NestJS场景)
如果项目依赖class-transformer和class-validator处理对象转换与验证,需要在全局启用验证管道并开启转换功能:
首先安装依赖:
npm install class-transformer class-validator
然后在main.ts中配置全局管道:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { ValidationPipe } from '@nestjs/common'; async function bootstrap() { const app = await NestFactory.create(AppModule); // 启用全局验证管道,开启自动转换请求数据为DTO实例 app.useGlobalPipes(new ValidationPipe({ transform: true })); await app.listen(3000); } bootstrap();
没有开启transform: true时,请求数据不会被转换为DTO类实例,可能导致空对象输出。
内容的提问来源于stack exchange,提问作者Sithija Piyuman Thewa Hettige
相关产品推荐
相关产品推荐

