报错:字段Query.launches未找到可迭代对象问题求助
问题解决:Expected Iterable, but did not find one for field "Query.launches"
问题根源
你的GraphQL Resolver和Controller直接返回了API请求的完整响应对象(包含data、headers、status等字段),而不是GraphQL Schema要求的[Launch]数组。SpaceX的GraphQL API返回的结构是{ data: { launches: Launch[] } },当前返回的响应对象不符合Query.launches字段的迭代类型要求,因此触发报错。
解决方案
1. 修正Service文件,提取正确的返回数据
修改getlaunches方法,从API响应中提取data.launches数组:
async getlaunches(): Promise<Launch[]> { this.logger.info('Demonstrate masking of logged data:'); const response = await this.apiClient.post(this.launchEndpoint, { query: '{ launches { id, mission_name } }', }); // 提取API返回的launches数组 return response.data.data.launches; }
2. 调整接口定义(可选,增强类型安全)
将launch接口重命名为复数形式,并确保类型匹配:
export interface LaunchesResponse { launches: Launch[]; } export interface Launch { id: string; mission_name: string; }
此时Service的返回类型可以改为Promise<Launch[]>,和接口保持一致。
3. 确认Resolver和Controller的返回类型
Resolver和Controller无需额外修改,只要Service返回正确的数组,它们就能传递符合要求的数据给GraphQL引擎:
// Resolver文件 @Query('launches') async getLaunches(): Promise<Launch[]> { return this.apiclientService.getlaunches(); } // Controller文件 @Get('launches') async getlaunches(): Promise<Launch[]> { return this.apiclientService.getlaunches(); }
验证逻辑
调用SpaceX的GraphQL API后,响应结构大致如下:
{ "data": { "launches": [ { "id": "1", "mission_name": "Demo-1" }, ... ] } }
你的原代码直接返回了整个外层响应对象,而GraphQL期望Query.launches返回内层的launches数组,所以必须提取该字段才能满足Schema的类型要求。
内容的提问来源于stack exchange,提问作者Krish909
相关产品推荐
相关产品推荐

