У меня есть мутация, которая запускает событие канала "countIncr", но я не вижу, чтобы активная соответствующая подписка срабатывала с полезной нагрузкой события.
ОБНОВЛЕНИЕ: я внес несколько обновлений в эту публикацию, и теперь я меняю заголовок, чтобы он лучше отражал то, где я нахожусь.
Я получаю ошибку graphqlPlayground
"Subscription field must return Async Iterable. Received: undefined"
Воспроизведение TGRstack, с которым у меня проблемы:https://github.com/TGRstack/tgr-apollo-subscription-example-microservice/
Рабочая репродукция без TGRstack:https://github.com/Falison/fullstack-apollo-subscription-example






Внешний интерфейс:
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.info({loading, data})
return loading
? <h1>Loading ...</h1>
: data.count
? <h2>Counter: {data.count}</h2>
: <h1>Counter Subscription Not Available</h1>
}}
</Subscription>
)
BE-преобразователи: https://github.com/TGRstack/tgr-apollo-subscription-example-microservice/blob/master/counter-service/src/gql/Resolvers.ts
ВЕ-контроллер: https://github.com/TGRstack/tgr-apollo-subscription-example-microservice/blob/master/counter-service/src/gql/Counter.ts
const count = {
resolve: data => {
console.info('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.info('countIncr', '>>>', { count })
return count
}
Вот журнал обслуживания после выполнения инструкций #gettingstarted в файле 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
ОБНОВИТЬ
Если вы пытались клонировать репозиторий, и после запуска 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/Falison/fullstack-apollo-subscription-example
Обновление 5
Я демодулировал/декомпозировал кучу вещей, чтобы было легче отслеживать, что происходит, но все равно получаю ту же ошибку.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я решил эту проблему в 2 местах
ApolloServer.installSubscriptionHandlers(ws)
const listener = ws.listen({port: config.PORT}, () => {
middleware.apolloSubscriptions(ws)
// middleware.apolloSubscriptions(ws)
private _terminatingLink = split(
({ query }) => {
const { kind, operation } = getMainDefinition(query)
return (
kind === 'OperationDefinition' && operation === 'subscription'
)
},
this._wsLink,
this._httpLink,
)
Этот ответ здесь решил мою проблему.