тип объединения по результатам подписок - PullRequest
0 голосов
/ 05 августа 2020

нет информации о том, как смонтировать тип объединения graphql в подписках. возможно ли это?

type Subscription {
   joinRequest(id: UUID!): MemberUnion!
}

type User { ... }
type Guest { ... }

union MemberUnion = User | Guest

и он отлично работает с моими запросами или изменениями, просто нужна любая информация о том, как реализовать с моей подпиской. joinRequest ключ - это userId и role. role должно означать преобразователь, где информация user или guest должна быть получена с помощью переданного аргумента userId.

ошибка, которую я вижу после попытки запуска кода, как сейчас:

"Абстрактный тип" MemberUnion "должен преобразовываться в тип объекта во время выполнения для поля" Subscription.joinRequest "со значением {userId:" 3bdb0eb5-f237-40a7-beb c -6263cc18dba5 ", имя:" trolololo3 ", полезная нагрузка: {...}}, получено" null ". Либо тип" MemberUnion "должен предоставлять функцию" resolveType ", либо каждый возможный тип должен предоставлять функцию" isTypeOf "."

мои файлы преобразователей, которые экспортируют запросы, мутации и подписки:

import ....

export default {
  Query: {
    ...User,
    ...Listing,
    ...Products
  },
  Mutation: {
    ...ListingMutations,
    ...ProductsMutations
  },
  Subscription: {
    ...ProductsSubscription,
    ...ListingSubscription
  },
Products: {
    items: ({ id: itemId }) => method({ itemId })
  },
 MemberUnion: {
    // eslint-disable-next-line no-underscore-dangle
    __resolveType: obj => {
      if (obj.role === USER_ROLE.GUEST) {
        return 'Guest';
      }

      if (obj.role === USER_ROLE.USER) {
        return 'User';
      }

      return null;
    }
  },
....

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

1 Ответ

1 голос
/ 05 августа 2020

Подписки могут возвращать абстрактные типы (объединения и интерфейсы) точно так же, как запросы и мутации. Нет ничего другого в том, как вы обрабатываете абстрактные типы с помощью подписок.

Если вы видите эту конкретную ошибку, то проблема обычно связана с вашей реализацией функции resolveType для рассматриваемого абстрактного. Например, если вы изначально не предоставили функцию resolveType или если она написана таким образом, что не всегда возвращает строку с именем типа объекта.

В зависимости от значения, указанного в ошибке ({ userId: "3bdb0eb5-f237-40a7-bebc-6263cc18dba5", name: "trolololo3", payload: { ... } }), проблема также может заключаться в том, как вы разрешаете поле joinRequest. Возможно, у вас вообще нет преобразователя для поля или, по крайней мере, форма объекта, который возвращает преобразователь, не соответствует форме, ожидаемой GraphQL (например, User или Guest).

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

...