Apollo Server / GraphQL - 返回 Null 的嵌套数组的属性

Apollo Server / GraphQL - Properties of Nested Array Returning Null

请耐心等待,我会尽我所能解释这一点。如果需要更多信息,请告诉我,我尽量保持简短。

我正在使用 Apollo Server 和 'apollo-datasource-rest' 插件来访问 REST API。当尝试从嵌套的对象数组中获取 属性 值时,我对每个 field/property 都得到了空响应。此外,被查询的数组在多个可用时仅显示单个迭代。

相关字段是 Rocket 类型中的 'cores' 字段,即 launch.rocket.firstStage.cores

我尝试了多种方式通过 'cores' 进行映射(认为这就是它想要的)但没有成功。

为了简单起见,我只包含特定问题的代码。查询的所有其他部分均按预期运行。

您可以在此处查看我点击的 API 回复:https://api.spacexdata.com/v3/launches/77

schema.js

const { gql } = require('apollo-server');

const typeDefs = gql`
  type Query {
    singleLaunch(flightNumber: Int!): Launch
  }

  type Launch {
    flightNumber: Int!
    rocket: Rocket
  }

  type Rocket {
    firstStage: Cores
  }

  type Cores {
    cores: [CoreFields]
  }

  type CoreFields {
    flight: Int
    gridfins: Boolean
    legs: Boolean
    reused: Boolean
    landingType: String
    landingVehicle: String
    landingSuccess: Boolean
  }
`;

module.exports = typeDefs;

数据源 - launch.js

const { RESTDataSource } = require('apollo-datasource-rest');

class LaunchAPI extends RESTDataSource {
  constructor() {
    super();
    this.baseURL = 'https://api.spacexdata.com/v3/';
  }

  async getLaunchById({ launchId }) {
    const res = await this.get('launches', {
      flight_number: launchId,
    });
    return this.launchReducer(res[0]);
  }

launchReducer(launch) {
    return {
      flightNumber: launch.flight_number || 0,
      rocket: {
        firstStage: {
          cores: [
            {
              flight: launch.rocket.first_stage.cores.flight,
              gridfins: launch.rocket.first_stage.cores.gridfins,
              legs: launch.rocket.first_stage.cores.legs,
              landingType: launch.rocket.first_stage.cores.landing_type,
              landingVehicle: launch.rocket.first_stage.cores.landing_vehicle,
              landingSuccess: launch.rocket.first_stage.cores.landing_success,
            },
          ],
        },
    };
  }
}

module.exports = LaunchAPI;

resolvers.js

module.exports = {
  Query: {
    singleLaunch: (_, { flightNumber }, { dataSources }) =>
      dataSources.launchAPI.getLaunchById({ launchId: flightNumber }),
  },
};

查询

query GetLaunchById($flightNumber: Int!) {
  singleLaunch(flightNumber: $flightNumber) {
    flightNumber
    rocket {
      firstStage {
        cores {
          flight
          gridfins
          legs
          reused
          landingType
          landingVehicle
          landingSuccess
        }
      }
    }
  }
}

预期结果

{
  "data": {
    "singleLaunch": {
      "flightNumber": 77,
      "rocket": {
        "firstStage": {
          "cores": [
            {
              "flight": 1,
              "gridfins": true,
              "legs": true,
              "reused": true,
              "landingType": "ASDS",
              "landingVehicle": "OCISLY",
              "landSuccess": true,
            },
            {
              "flight": 1,
              "gridfins": true,
              "legs": true,
              "reused": false,
              "landingType": "RTLS",
              "landingVehicle": "LZ-1",
              "landSuccess": true
            },
            {
              "flight": 1,
              "gridfins": true,
              "legs": true,
              "reused": false,
              "landingType": "RTLS",
              "landingVehicle": "LZ-2",
              "landSuccess": true
            },
          ]
        }
      },
    }
  }
}

实际结果(通过 GraphQL Playground)

{
  "data": {
    "singleLaunch": {
      "flightNumber": 77,
      "rocket": {
        "firstStage": {
          "cores": [
            {
              "flight": null,
              "gridfins": null,
              "legs": null,
              "reused": null,
              "landingType": null,
              "landingVehicle": null,
              "landingSuccess": null
            }
          ]
        }
      },
    }
  }
}

任何关于我在这里做错的建议将不胜感激。如果需要更多信息,请再次告诉我。

谢谢!

缺少碱基url

应该有

等待 this.get( this.baseURL + 'launches'


恕我直言,应该在 launchReducer 到 return 数组中使用 map,例如:

launchReducer(launch) {
    return {
      flightNumber: launch.flight_number || 0,
      rocket: {
        firstStage: {
          cores: launch.rocket.first_stage.cores.map(core => ({
            flight: core.flight,
            gridfins: core.gridfins,
            legs: core.legs,
            landingType: core.landing_type,
            landingVehicle: core.landing_vehicle,
            landSuccess: core.land_success,
          })),
        },
      },
    };
}  

.map(core => ({ 用于 returning 对象 [文字],与 .map(core => { return {

相同的 as/shorter 版本