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

时间:2019-05-03 23:21:37

标签: graphql apollo-server

与我一起承担,我将尽我所能解释这一点。请让我知道是否需要更多信息,我正在尝试使信息尽可能简短。

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

有问题的字段是火箭类型内的“核心”字段,即launch.rocket.firstStage.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游乐场)

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

任何有关我在这里做错事情的建议将不胜感激。再说一次,让我知道是否需要更多信息。

谢谢!

1 个答案:

答案 0 :(得分:0)

缺少基本网址

应该有

等待this.get(this.baseURL +'启动'


恕我直言,map中应该使用launchReducer返回数组,例如:

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,
          })),
        },
      },
    };
}