如何将两个依赖的 GraphQL 查询与“compose”结合起来?

Posted

技术标签:

【中文标题】如何将两个依赖的 GraphQL 查询与“compose”结合起来?【英文标题】:How to combine two dependent GraphQL queries with 'compose'? 【发布时间】:2019-05-07 23:01:10 【问题描述】:

解决了!

我正在尝试组合两个相关的 GraphQL 查询。

第一个应该得到一个 ID,第二个应该得到那个 ID。我读到 compose 的行为类似于 flowRight(),但无论我以什么顺序放置查询,如果 queryId 低于 queryDetails,则始终跳过 queryDetail(如预期的那样)。无论我如何将代码放在一起,变量都是未定义的。

import  graphql, compose  from 'react-apollo'
import gql from 'graphql-tag'

class Home extends Component 
  constructor(props) 
    super(props)
    console.log("Where's my data?")
    console.log(props)
  

  render() 
    return(
      <div />
    )
  


export const queryIdConst = gql`
  query IdQuery 
    account(name:"SuperAccount") 
    
      lists 
        edges 
          id
        
      
     
  
`

export const queryDataConst = gql`
  query DataQuery($id: ID!) 
    account(name:"SuperAccount") 
    
      list(id: $id) 
        displayTitle
      
     
  
`

export default compose(
  graphql(queryIdConst, 
    name: 'listId',
  ),
  graphql(queryDataConst,  
    name: 'data',
    skip: ( listId ) => !listId.data,
    options: ( listId ) => (
      variables: 
        id: list.data.account.lists.edges[0].id
      
    )
  )
)(Home)

我已经尝试更改撰写函数的顺序,但无论如何这不起作用,正如我所期望的那样。

感谢您的帮助!

编辑:将 compose() 中的两个 graphql() 切换为与 AbsoluteSith's 注释 link 内联

解决方案

在Daniel Rearden 和AbsoluteSith 的提示和帮助下,我实现了以下解决方案:

改变了 compose():

export default compose(
  graphql(queryIdConst, 
    name: 'listId',
  ),
  graphql(queryDataConst,  
    name: 'dataHome', // changed to 'dataHome' to avoid confusion
    skip: ( listId ) => !listId.account,
    options: ( listId ) => (
      variables: 
        id: listId.account.lists.edges[0].id
      
    )
  )
)(Home)

还有我的渲染():

return(
  <div>
     dataHome && !dataHome.loading && 
      <div>dataHome.account.list.displayTitle</div> 
    
  </div>
)

【问题讨论】:

你试过this解决方案 感谢您的回复!是的,我就是从那里来的。但是我在第二个查询中的变量始终未定义。我得到了具有所有功能的查询对象,但数据未定义。在您的链接中,变量是用“firstQuery.data.someQuery.someValue”定义的,我应该“调用”查询还是“list.data.account.lists.edges[0].id”有权访问数据? 是的,尝试传递正确的数据,即; list.data.account.lists.edges[0].id。查看进行的网络调用,检查是否执行了两个查询及其顺序。但更好的解决方案是为第二个查询创建一个单独的组件 另外this 也可能有帮助。实际上,您可能没有以正确的格式/层次结构访问数据。 抱歉看到了您的架构,因此您应该以 listId.account.lists.edges[0].id && 仅检查 listId 值来访问数据 【参考方案1】:

使用graphql HOC 时,默认情况下,被包装的组件会接收一个名为data 的道具(如果传入突变,则为mutate)。给定一个类似的查询

query IdQuery 
  account(name:"SuperAccount") 
    lists 
      edges 
        id
      
    
   

一旦查询加载,查询结果在this.props.data.account 下可用。当您使用 name 配置选项时,您是在告诉 HOC 使用 data 以外的其他名称作为道具名称。因此,如果您将名称设置为listId,那么您的查询结果将在

this.props.listId.account

这意味着 compose 中的第二个 HOC 应该看起来更像这样:

graphql(queryDataConst,  
  skip: ( listId ) => !listId.account, // <--
  options: ( listId ) => (
    variables: 
      id: listId.account.lists.edges[0].id // <--
    
  )
)

【讨论】:

完美!谢谢你的帮助!我想我对之后的重命名和访问感到困惑。第二个警告是,我认为第二个查询应该在我的 compose 函数中列为第一个,因为 Doc 声明它被称为 flowRight(),但第一个查询必须高于第二个,否则第二个不会知道'listId'。混乱......无论如何,这很好,现在正在工作!

以上是关于如何将两个依赖的 GraphQL 查询与“compose”结合起来?的主要内容,如果未能解决你的问题,请参考以下文章

具有循环依赖的 GraphQL 设计

如何在graphql中的两个日期之间进行查询

如何在graphql中查询两个日期

GraphQL 如何使用 Nestjs 或 type-graphql 设置查询 MongoDB ref 集合

如何在解析函数 GraphQL 中传递两个查询?

如何从另一个组件重新获取 graphql 查询?