apollo "Поле подписки должно возвращать Async Iterable. Получено: undefined" - PullRequest
8 голосов
/ 10 мая 2019

У меня есть мутация, которая запускает событие канала 'countIncr', но я не вижу активную соответствующую подписку с полезной нагрузкой события.

ОБНОВЛЕНИЕ: я сделал несколько обновлений дляэта публикация, и теперь я меняю название, чтобы оно было более репрезентативно, где я нахожусь.

Я получаю ошибку graphqlPlayground

"Subscription field must return Async Iterable. Received: undefined"

Воспроизведение TGRstack У меня возникли проблемы с: https://github.com/TGRstack/tgr-apollo-subscription-example-microservice/

Рабочее воспроизведение без TGRstack: https://github.com/Falieson/fullstack-apollo-subscription-example

enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here Внешний интерфейс: https://github.com/TGRstack/tgr-apollo-subscription-example-microservice/blob/master/counter-ui/src/app/routes/Home/HomePage.tsx

const COUNTER_SUBSCRIPTION = gql`
subscription onCountIncr {
  count
}
`

const Counter = () => (
  <Subscription
    subscription={COUNTER_SUBSCRIPTION}
  >
    {({ data, loading }) => {
      console.log({loading, data})
      return loading
        ? <h1>Loading ...</h1>
        : data.count
          ? <h2>Counter: {data.count}</h2>
          : <h1>Counter Subscription Not Available</h1>
    }}
  </Subscription>
)

BE Resolvers: https://github.com/TGRstack/tgr-apollo-subscription-example-microservice/blob/master/counter-service/src/gql/Resolvers.ts

BE Схема: https://github.com/TGRstack/tgr-apollo-subscription-example-microservice/blob/master/counter-service/src/gql/Schema.ts

BE Контроллер: https://github.com/TGRstack/tgr-apollo-subscription-example-microservice/blob/master/counter-service/src/gql/Counter.ts

const count = {
  resolve: data => {
    console.log('CounterSub>', {data})
    return data
  },
  subscribe: () => pubsub.asyncIterator(['countIncr'])
}

const CounterSubscriptions = {
  count
}
async function countIncr(root: any, args: any, context: any) {
  const count = Counter.increment()
  await pubsub.publish('countIncr', count )
  console.log('countIncr', '>>>', { count })
  return count
}

Вот журнал обслуживания после того, как вы выполните инструкции #getted в Readme.md

[FE] GET /favicon.ico 200 2.465 ms - 1551                   # WEBCLIENT LOADED
[BE] CounterSub> { data: undefined }                        # SUBSCRIPTION REQUEST
[BE] { data: [Object: null prototype] { count: null } }     # SUBSCRIPTION RESULT
[BE] POST / 200 21.254 ms - 24
[BE] 2019-05-10 11:37:20 [info]:     HELLO                  # APOLLO CLIENT CONNECTED AGAIN (why always 2?)
[BE] countIncr >>> { count: 1 }                             # MUTATION REQUEST
[BE] { data: [Object: null prototype] { countIncr: 1 } }    # MUTATION RESPONSE
[BE] POST / 200 13.159 ms - 25
[BE] countIncr >>> { count: 2 }                             # MUTATION REQUEST
[BE] { data: [Object: null prototype] { countIncr: 2 } }    # MUTATION RESPONSE
[BE] POST / 200 4.380 ms - 25

UPDATE

В случае, если вы пытались клонировать репо и послеr работает nps, он не работает, потому что в nps setup отсутствует шаг.Я поместил обновление в стек с улучшенным nps setup.

ОБНОВЛЕНИЕ 2

обновленный код и ссылки, о которых идет речь, за последнюю фиксацию

ОБНОВЛЕНИЕ 3

Некоторые люди считают, что pubsub должен быть единственным импортом.Я обновил код, но это создает новую ошибку:

Error: Apollo Server requires either an existing schema, modules or typeDefs

ОБНОВЛЕНИЕ 4

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

"message": "Subscription field must return Async Iterable. Received: undefined"

Рабочее воспроизведение без TGRstack: https://github.com/Falieson/fullstack-apollo-subscription-example

Обновление 5

Я демодулировал / разложил кучу вещей, чтобы упростить отслеживание происходящего, но все еще получаю ту же ошибку

1 Ответ

4 голосов
/ 14 мая 2019

Я решил эту проблему в 2 местах

  1. ApolloServer.installSubscriptionHandler () ВРЕМЕННО замена middleware.apolloSubscription (). Я настраиваю промежуточное ПО для подписок, следуя этому руководству: https://www.apollographql.com/docs/graphql-subscriptions/express, поэтому я собираюсь догадаться, что что-то напутано с версией одного из этих пакетов или самого руководства.

    ApolloServer.installSubscriptionHandlers(ws)

    const listener = ws.listen({port: config.PORT}, () => {
      middleware.apolloSubscriptions(ws)
      // middleware.apolloSubscriptions(ws)
  1. terminatingLink и getMainDefinition необходимы клиенту https://github.com/TGRstack/tgr-apollo-subscription-example-microservice/commit/75b6165f2dc1d035a41f1129f7386a1e18c7ba53#diff-2c47ef33b8ed0e4c893cbc161bcf7814R37
  private _terminatingLink = split(
    ({ query }) => {
      const { kind, operation } = getMainDefinition(query)
      return (
        kind === 'OperationDefinition' && operation === 'subscription'
      )
    },
    this._wsLink,
    this._httpLink,
  )
...