阿波罗 "Subscription field must return Async Iterable. Received: undefined"
apollo "Subscription field must return Async Iterable. Received: undefined"
我有一个触发频道事件的突变 '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
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>
)
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
}
这是您 运行 通过 Readme.md
中的#getting started 说明后的服务日志
[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
更新
如果您尝试克隆存储库,但在 运行ning nps 之后它无法正常工作,因为 nps setup
中缺少一个步骤。我已将更新推送到堆栈,改进了 nps setup
。
更新 2
根据最新提交更新了相关代码和链接
更新 3
有人建议 pubsub
应该是单个导入。我已经更新了代码,但这会产生一个新错误:
Error: Apollo Server requires either an existing schema, modules or typeDefs
更新 4
试图追捕 import/export 错误(?)的许多小改动现在出现错误。我通过强化导入修复了此错误(索引文件未正确导出时存在一些问题)。
"message": "Subscription field must return Async Iterable. Received: undefined"
没有 TGRstack 的工作复制:https://github.com/Falieson/fullstack-apollo-subscription-example
更新 5
我 demodularized/decomposed 一堆东西可以更容易地跟踪发生了什么但仍然得到相同的错误
我在两个地方解决了这个问题
- ApolloServer.installSubscriptionHandler() 暂时 替换 middleware.apolloSubscriptions() 。我按照本指南配置订阅中间件:https://www.apollographql.com/docs/graphql-subscriptions/express 所以我猜这些包之一的版本或指南本身有问题。
ApolloServer.installSubscriptionHandlers(ws)
const listener = ws.listen({port: config.PORT}, () => {
middleware.apolloSubscriptions(ws)
// middleware.apolloSubscriptions(ws)
- 客户端需要 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,
)
我有一个触发频道事件的突变 '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
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>
)
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
}
这是您 运行 通过 Readme.md
中的#getting started 说明后的服务日志[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
更新
如果您尝试克隆存储库,但在 运行ning nps 之后它无法正常工作,因为 nps setup
中缺少一个步骤。我已将更新推送到堆栈,改进了 nps setup
。
更新 2
根据最新提交更新了相关代码和链接
更新 3
有人建议 pubsub
应该是单个导入。我已经更新了代码,但这会产生一个新错误:
Error: Apollo Server requires either an existing schema, modules or typeDefs
更新 4
试图追捕 import/export 错误(?)的许多小改动现在出现错误。我通过强化导入修复了此错误(索引文件未正确导出时存在一些问题)。
"message": "Subscription field must return Async Iterable. Received: undefined"
没有 TGRstack 的工作复制:https://github.com/Falieson/fullstack-apollo-subscription-example
更新 5
我 demodularized/decomposed 一堆东西可以更容易地跟踪发生了什么但仍然得到相同的错误
我在两个地方解决了这个问题
- ApolloServer.installSubscriptionHandler() 暂时 替换 middleware.apolloSubscriptions() 。我按照本指南配置订阅中间件:https://www.apollographql.com/docs/graphql-subscriptions/express 所以我猜这些包之一的版本或指南本身有问题。
ApolloServer.installSubscriptionHandlers(ws)
const listener = ws.listen({port: config.PORT}, () => {
middleware.apolloSubscriptions(ws)
// middleware.apolloSubscriptions(ws)
- 客户端需要 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,
)