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

报错:字段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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:02:55