Как вернуть массив объектов в GraphQL, возможно, используя ту же конечную точку, что и та, которая возвращает один объект? - PullRequest
0 голосов
/ 12 октября 2018

Я делаю GraphQL API, в котором я мог бы получить объект автомобиля по его идентификатору или получить все автомобили, если не указан параметр.

Используя приведенный ниже код, я успешно могу получить один объект автомобиля, указав в качестве параметра id.

Однако в случае, когда я ожидаю массив объектовто есть, когда я вообще не предоставляю никаких параметров, я не получаю результат на GraphiQL.

schema.js

let cars = [
  { name: "Honda", id: "1" },
  { name: "Toyota", id: "2" },
  { name: "BMW", id: "3" }
];

const CarType = new GraphQLObjectType({
  name: "Car",
  fields: () => ({
    id: { type: GraphQLString },
    name: { type: GraphQLString }
  })
});

const RootQuery = new GraphQLObjectType({
  name: "RootQueryType",
  fields: {
    cars: {
      type: CarType,
      args: {
        id: { type: GraphQLString }
      },
      resolve(parent, args) {
        if (args.id) {
          console.log(cars.find(car => car.id == args.id));
          return cars.find(car => car.id == args.id);
        }
        console.log(cars);
        //***Problem Here***
        return cars;
      }
    }
  }
});

Тестовые запросы и их соответствующие результаты:

Запрос 1

{
  cars(id:"1"){
    name
  }
}

Ответ на запрос 1 (успех)

{
  "data": {
    "cars": {
      "name": "Honda"
    }
  }
}

Запрос 2

{
  cars{
    name
  }
}

Ответ на запрос 2 (сбой)

{
  "data": {
    "cars": {
      "name": null
    }
  }
}

Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 12 октября 2018

Автомобиль и Список автомобилей - фактически два отдельных типа.Поле не может быть преобразовано в один объект Car один раз, а массив объекта Car - другой.

Ваш запрос возвращает значение NULL для name, поскольку вы сказали, что поле cars будет преобразовано в одинобъект, но вместо этого он разрешается в массив.В результате он ищет свойство с именем name в объекте массива, и поскольку он не существует, он возвращает ноль.

Вы можете справиться с этим несколькими различными способами.Чтобы оставить все в одном запросе, вы можете использовать filter вместо find и изменить тип запроса на List.

cars: {
  type: new GraphQLList(CarType), // note the change here
  args: {
    id: {
      type: GraphQLString
    },
  },
  resolve: (parent, args) => {
    if (args.id) {
      return cars.filter(car => car.id === args.id);
    }
    return cars;
  }
}

В качестве альтернативы, вы можете разделить его на два отдельных запроса:

cars: {
  type: new GraphQLList(CarType),
  resolve: (parent, args) => cars,
},
car: {
  type: CarType,
  args: {
    id: {
      // example of using GraphQLNonNull to make the id required
      type: new GraphQLNonNull(GraphQLString)
    },
  },
  resolve: (parent, args) => cars.find(car => car.id === args.id),
}

Проверьте документы для получения дополнительных примеров и опций.

...