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 客户端订阅必须提供模式的主要内容,如果未能解决你的问题,请参考以下文章

Apollo 订阅服务器返回“必须提供文件”。

如何使用订阅和 AWS AppSync 高效同步 Apollo 的缓存

测试 Apollo 客户端订阅

Apollo 订阅未在客户端监听新数据

如何在客户端 NextJS 中使用 Apollo GraphQL 订阅?

在 nextJS 上配置 apollo 客户端以进行订阅的问题