В запросе GraphQL пропущены пустые поля для объектов разных типов - PullRequest
0 голосов
/ 12 апреля 2020

Я использую Apollo Graphql для получения списка различных моделей или типов. Я пытался использовать inhirit, но я не получил его. Я пытался использовать весь объект, но я хочу пропустить поля, которые мне не нужны.

Я создал свой тип схемы с пустыми полями, потому что все объекты не имеют всех полей.

Я поясню лучше на следующем примере:

Это простой пример дизайна класса (OBJECT):

car {
    name: String
    wheelNumber: Integer
}

trunk extends car {
    cargoSize: Integer
}

Поэтому я создал свою схему Graphql следующим образом :

input vehicleInput {
    name: String,
    wheelNumber: Integer,
    cargoSize: Integer
}

type vehicle {
    name: String,
    wheelNumber: Integer,
    cargoSize: Integer
}

type Query {
    vehicles: [vehicle]
}

type Mutation {
    addVehicle(input: vehicleInput ): vehicle!
}

Пример резолвера:

import { vehicle } from "./model";

export const resolvers = {
  Query: {
    vehicles : () => {
        return vehicle.find({});
      },
  },
  Mutation: {
    addVehicle: (_, { input }) => {
      const inputResponse = vehicle.create(input);
      return inputResponse;
    },
  }
};

Когда я выполняю запрос транспортных средств, он возвращает все поля, даже если у объекта нет поля cargoSize, он возвращает cargoSize: null.

query {
  vehicles {
    name
    wheelNumber
    cargoSize
  }
}

Я хотел бы пропустить поле cargoSize, когда оно пустое. Вот так:

{
    vehicles: [
        {
            name: "car 1",
            wheelNumber: 4
        },
        {
            name: "car 2",
            wheelNumber: 4
        },  
        {
            name: "truck 1",
            wheelNumber: 8,
            cargoSize: 65
        },    
        {
            name: "car 3",
            wheelNumber: 4
        },                     
    ]
}

Вместо этого:

{
    vehicles: [
        {
            name: "car 1",
            wheelNumber: 4,
            cargoSize: null
        },
        {
            name: "car 2",
            wheelNumber: 4,
            cargoSize: null
        },  
        {
            name: "truck 1",
            wheelNumber: 8,
            cargoSize: 65
        },    
        {
            name: "car 3",
            wheelNumber: 4,
            cargoSize: null
        },                     
    ]
}

Есть ли способ сделать это? Я занимался исследованиями, но ничего об этом не нашел.

1 Ответ

0 голосов
/ 15 апреля 2020

Я понял. Я не видел Graphql имеет интерфейсы. Итак, я объявил интерфейс, а затем я реализую каждый тип.

interface vehicle {
    name: String,
    wheelNumber: Integer
}


type car implements vehicle {
    name: String,
    wheelNumber: Integer
}

type truck implements vehicle {
    name: String,
    wheelNumber: Integer,
    cargoSize: Integer
}

type Query {
    vehicles: [vehicle]
}

type Mutation {
    addVehicle(input: vehicleInput ): vehicle!
}

Файл резолвера:

import { vehicle } from "./model";

export const resolvers = {
  Query: {
    vehicles : () => {
        return vehicle.find({});
      },
  },
  Mutation: {
    addVehicle: (_, { input }) => {
      const inputResponse = vehicle.create(input);
      return inputResponse;
    },
  },
  vehicle: {
    __resolveType: (obj) => {
      if(obj.cargoSize){
        return 'truck';
      }
      else{
        return 'car'
      }      
  }
};

На этом я завершаю API. Затем для выполнения запроса мне просто нужно указать все общие поля, а затем использовать ключевое слово ... on и указать все поля соединительных линий:

query {
  vehicles {
    name
    wheelNumber
    ... on truck {
        cargoSize
    }
  }
...