Apollo 客户端订阅必须提供模式
Posted
技术标签:
【中文标题】Apollo 客户端订阅必须提供模式【英文标题】:Apollo Client subscriptions must provide schema 【发布时间】:2017-08-26 18:44:54 【问题描述】:我不知道为什么会这样。
我正在收听订阅postAdded
,每次我使用突变创建帖子时都会发布该订阅。
import React, Component from 'react'
import graphql, gql from 'react-apollo'
class App extends Component
componentDidMount()
this.props.subscribeToNewPosts()
render()
return (
<div>
<h1>Hello world</h1>
console.log(this.props)
</div>
)
const Query = gql`
query Posts
posts
id
title
content
author
firstName
lastName
`
const Subscription = gql`
subscription postAdded
postAdded
id
title
content
author
firstName
lastName
`
App = graphql(Query,
name: 'posts',
props: props =>
return
subscribeToNewPosts: () =>
return props.posts.subscribeToMore(
document: Subscription,
updateQuery: (prev, subscriptionData ) =>
if(!subscriptionData.data)
return prev
const newPost = subscriptionData.data.postAdded
console.log(newPost)
return
...prev,
posts: [...prev.posts, newPost]
)
,
posts: props.posts
)(App)
export default App
错误:
【问题讨论】:
我认为错误来自服务器端实现。看起来怎么样? 【参考方案1】:首先,这很可能是服务器实现问题。该错误可能是由作为您的 graphql 端点的 graphql-tools 引发的。
在我关注官方博客上的Full-stack + GraphQL 教程的第二部分时发生了完全相同的事情。
虽然情况不一定相同,但发生在我身上的是教程导出架构对象为:export schema
,相当于export schema: schema
,而不是通常的默认导出,例如export default schema
在我的 graphql 服务器端点中,我使用 import schema from './src/schema'
导入这是错误的,因为架构是作为子对象导出的,而不是默认导出。我的案例的正确导入应该是import schema from './src/schema'
TL;DR 检查您的服务器代码,检查您的导出和导入语句。该错误消息确实具有误导性,但很可能与模块导入/导出有关。
如果我们使用 webpack 而不是像教程中那样使用 babel-node 进行编译,则可以避免或提供更明确的信息。
【讨论】:
以上是关于Apollo 客户端订阅必须提供模式的主要内容,如果未能解决你的问题,请参考以下文章
如何使用订阅和 AWS AppSync 高效同步 Apollo 的缓存