Написать динамическую схему для возврата того же результата в Graphql - PullRequest
0 голосов
/ 17 апреля 2019

В настоящее время эта схема работает правильно и дает требуемый результат

  type Personal{
    userId:String
    name: String
    email: String
  }
  type Contact{
    mobile_no:String
    email:String
  }
  type Address{
    address:String
    lat:String
    long:String
  }
  getContact(userId: String): Contact
  getPersonal(userId: String): Personal
  getAddress(userId: String): Address

Но я хочу вернуться

 type Response {
    status: Boolean
    message: String
    data: []
  }

Возвращает данные со статусом и ключом сообщения, где данные содержат массив объектов Контакт, Личный и Адрес.

без записи ResponseContact, ResponsePersonal и ResponseAddress

У меня есть идея вернуть scalar JSON в таких данных, как это

 scalar JSON
 type Response {
   status: Boolean
   message: String
   data: [JSON]
 }

Но проблема с этой схемой, я не могу использовать graphql второй основной пункт "Спроси, что ты хочешь" Требуемый результат

type ResponseAddress {
    status: Boolean
    message: String
    data: [Address]
}
type ResponsePersonal {
    status: Boolean
    message: String
    data: [Personal]
}
type ResponseContact {
    status: Boolean
    message: String
    data: [Contact]
}
getContact(userId: String): ResponseContact
getPersonal(userId: String): ResponsePersonal
getAddress(userId: String): ResponseAddress

без записи ResponseAddress, ResponsePersonal и ResponseContact.

Нечто подобное

type Response {
    status: Boolean
    message: String
    data: [Address|Personal|Contact]
}
getContact(userId: String): Response
getPersonal(userId: String): Response
getAddress(userId: String): Response

Конечно, приведенный выше синтаксис неверен.

Почему : - Потому что я хочу, чтобы этот Ответ возвращал больше мест и не хочу длинную схему.

Точка : - Это возможно или нет?

1 Ответ

3 голосов
/ 18 апреля 2019

Присвоение нескольких типов одному полю возможно с помощью интерфейса или объединения:

union ResponseData = Address | Personal | Contact

type Response {
    status: Boolean
    message: String
    data: ResponseData
}

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

query {
  getContact {
    status
    message
    data {
      ... on Address {
        # Address field here
      }
      ... on Personal {
        # Personal field here
      }
      ... on Contact {
        # Contact field here
      }
    }
  }
}

Вы можете проверить документы для подробного объяснения того, как реализовать как объединения, так и интерфейсы. Помните, что вы можете создать только объединение типов объектов, поэтому, если вам нужен ответ, который возвращает список, вам нужно определить как минимум два типа для ваших ответов:

type Response {
  status: Boolean
  message: String
  data: ResponseData
}

type ListResponse {
  status: Boolean
  message: String
  data: [ResponseData]
}

Примечание. Использование союзов таким способом добавляет некоторую сложность на стороне клиента, и я бы сказал, что в общем случае не стоит просто иметь меньшую схему. Такие инструменты, как GraphiQL и GraphQL Playground, упрощают работу с большими схемами для потребителя. Наличие большой схемы с избыточными типами - неплохая вещь, если это то, что вам нужно.

...