Схема динамического GraphQL?

У меня есть мутация, которая отправляет данные формы, эти данные могут варьироваться в зависимости от формы, которую вы заполняете.

Форм будет много, и они будут иметь одни и те же «шаги» (каждая форма состоит из 1 или более страниц / шагов).

Итак, у нас могут быть эти многоразовые шаги:

  • Любимые фрукты
  • Дата рождения
  • Имя и фамилия

И эти две формы:

  • Общая информация (genericInfo): имя и фамилия + дата рождения
  • Что ты ешь? (whatYouEat): имя и фамилия + избранный фрукт

Мне нужен способ иметь единственную мутацию, которая позволяет определить имя формы и принимает объект data, который необходимо проверить на основе такого имени формы.

Например, если я назову эту мутацию:

submitForm(formName: $formName, formData: $formData) {
  resultMessage
}

с formName, установленным на genericInfo, и formData, установленным на { nameAndSurname: 'Foo Bar', favFruit: 'apple' }, он должен выдать ошибку, потому что genericInfo не ожидает favFruit, а dateOfBirth.

Можно ли этого добиться с помощью GraphQL? Может быть, есть лучшие способы добраться сюда?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
4
0
4 955
2

Ответы 2

GraphQL не допускает этого напрямую. Типы входных объектов имеют фиксированную структуру и не имеют условной проверки (встроенной; ваша функция распознавателя может выдавать ошибки на основе собственных проверок, которые более обширны, чем в схеме).

Самый распространенный шаблон, который я видел, использует Соглашения о мутации Relay GraphQL (даже если вы не ожидаете, что ваши клиенты будут использовать Relay). У этого есть одна мутация для каждого возможного действия (в вашем случае одна мутация для каждой отправленной формы) и отдельный тип входного объекта для каждой мутации.

Также обратите внимание, что типы входных объектов могут быть вложенными, поэтому в вашем примере вы можете написать

input Name {
  givenName: String!
  surname: String!
}

input Fruit {
  name: String!
}

input WhatYouEatInput {
  name: Name!
  fruit: Fruit!
}

mutation {
  whatYouEat(input: WhatYouEatInput!): WhatYouEatPayload!
}

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

Спасибо, это текущая реализация, которую я использую ... Но она не масштабируется, если у меня будет 100 форм :-(

Fez Vrasta 09.07.2018 20:22

Это можно было бы сделать, если бы GraphQL предоставил тип Union, который можно было бы использовать в качестве входных данных. Это было предложено раньше, но, похоже, нет планов по его реализации в ближайшем будущем.

Итак, поскольку у вас будут десятки возможных комбинаций данных формы, я думаю, что лучшим вариантом будет просто отправить строку в формате JSON с данными и выполнить проверку самостоятельно, используя некоторую структуру, которая определяет все возможные formName и его разрешенные поля.

Но таким образом вы не воспользуетесь преимуществами системы набора текста GraphQL.

Даже если мы используем тип JSON для хранения. Так сложно фильтровать данные.

Prathamesh More 27.11.2020 05:37

Другие вопросы по теме