GraphQL + Relay 现代片段给了我一系列空帖子

Posted

技术标签:

【中文标题】GraphQL + Relay 现代片段给了我一系列空帖子【英文标题】:GraphQL + Relay modern fragment gives me an array of null posts 【发布时间】:2018-02-04 23:07:51 【问题描述】:

我正在使用 Relay Modern、GraphQL 和 Graphcool 开发一个 React Native 应用程序。我正在尝试从数据库中获取帖子,我有 3 个文件,Post.js、PostList 和 index.js。

PostList.js:

export default createFragmentContainer(PostList, graphql`
  fragment PostList_viewer on Viewer 
    allPosts(last: 100, orderBy: createdAt_ASC) @connection(key: "PostList_allPosts", filters: []) 
      edges 
        node 
          ...Post_post
        
      
    
  
`)

Post.js

export default createFragmentContainer(Post, graphql`
  fragment Post_post on Post 
    id
    content
    createdAt
    author 
      id
      username
    
  
`)

index.js

const Feed = () => (
  <QueryRenderer
    environment=environment 
    query=AllPostQuery
    render=( error, props ) => 
      if (error) 
        return <div>error.message</div>
       else if (props) 
        return <PostList viewer=props.viewer />
      
      return <Text>Loading</Text>
    
  />
)

当我在 PostList.js 中控制台日志this.props.viewer.allPosts 时,我得到 edges: [ null, null, null ], ...。我在数据库中有 3 个帖子,所以它正在查找帖子,但为什么它们为空?请

【问题讨论】:

【参考方案1】:

首先,如果您遇到问题,请尝试记录“根”对象,它是 props,而不是其中的分支 - 这将使您更容易解开数据结构。

另外,据我所知,Relay 有一些魔力,它使数据仅在您定义片段的文件中对您可用,因此在 PostList.js 中您不会看到帖子的详细信息。尝试从 Post.js 打印数据。这可能是您看到 null 值打印的原因。

此外,来自 GraphQL 的数据将在从 _(下划线)之后的片段名称派生的变量名称下可供您使用,因此在您的示例中它将是 post 而不是 allPosts

【讨论】:

我知道这一切,这些都不是我的问题,.另外,allPosts 没有错,它是我从 Graphcool 得到的对象的一部分,我得到的对象是 viewer: allPosts: edges: node... 。没有什么对我有用,甚至没有使用post。我的问题最终是身份验证。

以上是关于GraphQL + Relay 现代片段给了我一系列空帖子的主要内容,如果未能解决你的问题,请参考以下文章

如何为 GraphQLObjectType 的 GraphQLList 定义 Relay 片段?

GraphQL / Relay - 是不是需要在主 QueryRenderer 中查询所有表?

从 Relay 中的动态组件获取片段

从外部存储中检索 Relay 查询片段的变量

AddMutation 使用中继现代 graphql

使用具有不同片段字段的相同中继根查询的多个 react-router-relay 路由