Nano Hash - криптовалюты, майнинг, программирование

Объединение GraphQL и конфликтующие типы

У меня проблема с моим проектом, и я не могу найти решение в Интернете. Вот такая ситуация.

  • У меня есть Союз (DataResult) двух типов (Teaser & Program)
  • У меня тип Zone с полем data (массив DataResult)
  • Teaser & Program имеют одинаковое поле title с другим типом (String против String!)

Вот части схем Zone, Teaser и Program:

type Program {
    title: String
}

type Teaser {
    title: String!
}

union DataResult = Teaser | Program

type Zone {
    (...)
    data: [DataResult!]
}

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

zones {
    ...zoneFieldsWithoutData
    data {
        ... on Program {
            ...programFields
        }
        ... on Teaser {
            ...teaserFields
        }
    }
}

Вот ошибка:

Error: GraphQL error: Fields \"title\" conflict because they return conflicting types String and String!. Use different aliases on the fields to fetch both if this was intentional

Я не могу использовать псевдоним, потому что в спецификации требуется одно и то же имя атрибута для всех сущностей DataResult. Что я могу сделать ?

Более того, даже если я установлю тот же Тип для title, я получу много предупреждений о «недостающих полях» в консоли ....

PS: я использую Vanilla Apollo в качестве клиента GraphQL (на стороне сервера)



Ответы:


1

Использование интерфейса решило эту проблему для меня, включая «отсутствующее поле» - ошибки (хотя это означает, что поля должны быть одного типа, я думаю).

Что-то вроде

interface DataResult {
    title: String!
}

type Program implements DataResult {
    // Not sure if this can be empty?
}

type Teaser implements DataResult {
    // Not sure if this can be empty?
}

type Zone {
    (...)
    data: [DataResult!]
}
14.09.2019

2

Это реализовано в соответствии со спецификацией: См. 3.a по адресу: http://facebook.github.io/graphql/draft/#SameResponseShape()

См. https://github.com/graphql/graphql-js/issues/1361#issuecomment-393489320 для получения дополнительных сведений.

02.08.2018

3

Я знаю, что вы не можете использовать псевдоним, но для всех, кто может (включая меня):

Простой ответ, взятый из github, - использовать псевдонимы полей:

zones {
    ... on Program {
        programTitle: title
    }
    ... on Teaser {
        teaserTitle: title
    }
}
12.06.2021
  • Я не могу использовать псевдоним, потому что в спецификации требуется одно и то же имя атрибута для всех сущностей DataResult. 12.06.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..