使用`setVariables`后中继生成无效查询-我做错了啥吗?

Posted

技术标签:

【中文标题】使用`setVariables`后中继生成无效查询-我做错了啥吗?【英文标题】:Relay generating invalid query after using `setVariables`-- am I doing something wrong?使用`setVariables`后中继生成无效查询-我做错了什么吗? 【发布时间】:2017-03-16 11:30:37 【问题描述】:

由于某种原因,如果我在注入子组件之前生成一个根查询,它接受参数,如下所示:

import Relay from 'react-relay';

export default 
  production: (Component) => Relay.QL`
    query 
      getProduction(id: $productionId) 
        $Component.getFragment('production')
      
    
  `
;

Relay 最初生成这个查询:

query MyProductionDetailsQuery($id_0:ID!,$where_1:ProductionRoleWhereArgs!) 
  getProduction(id:$id_0) 
    id,
    ...F0
  

fragment F0 on Production 
  id,
  ...
  _roles4oPiwv:roles(first:10,where:$where_1) 
    edges 
      node 
        id,
        ...
      ,
      cursor
    ,
    pageInfo 
      hasNextPage,
      hasPreviousPage
    
  

变量:

id_0: "UHJvZHVjdGlvbjoxNg==", where_1: archived: eq: true

但是,如果组件的中继容器有自己的变量,运行this.props.relay.setVariables(...variables) 会将中继生成的请求查询完全改变成这样:

query My_production_details_page_ProductionRelayQL($id_0:ID!,$where_1:ProductionRoleWhereArgs!) 
  node(id:$id_0) 
    ...F0
  

fragment F0 on Production 
  id,
  _roles6J5gK:roles(first:10,where:$where_1) 
    edges 
      node 
        id,
        ...
      ,
      cursor
    ,
    pageInfo 
      hasNextPage,
      hasPreviousPage
    
  

变量:

id_0: "UHJvZHVjdGlvbjoxNg==", where_1: archived: eq: false

但是,如果我有一个没有参数的根查询,setVariables 可以正常工作:

import Relay from 'react-relay';

export default 
  viewer: (Component, variables) => Relay.QL`
    query 
      viewer 
        $Component.getFragment('viewer',  ...variables )
      
    
  `
;

这是生成的查询:

query ViewerQuery($where_0:ProductionWhereArgs!) 
  viewer 
    ...F0
  

fragment F0 on Viewer 
  user 
    _productions2IPZAw:productions(first:10,where:$where_0) 
      edges 
        node 
          id,
          ...
        ,
        cursor
      ,
      pageInfo 
        hasNextPage,
        hasPreviousPage
      
    ,
    id
  

变量:

where_0: expDate: gt: "2016-11-04T16:29:11.677Z", archived: eq: false

在工作设置中的 setVariables 之后:

query ViewerQuery($where_0:ProductionWhereArgs!) 
  viewer 
    ...F0
  

fragment F0 on Viewer 
  user 
    _productions1CyNvL:productions(first:10,where:$where_0) 
      edges 
        node 
          id,
          ...
        ,
        cursor
      ,
      pageInfo 
        hasNextPage,
        hasPreviousPage
      
    ,
    id
  

变量:

where_0: expDate: lt: "2016-11-04T16:34:12.537Z", archived: eq: false

版本:

"react-relay": "^0.9.3",
"react-router-relay": "^0.13.5"

我不确定我的配置是否有问题,或者这只是 Relay 端的错误。

有谁知道是什么导致了这个问题?

【问题讨论】:

为了提高您的问题质量,请描述您的问题并提出具体问题,而不是在其他地方提及。如需帮助,请参阅“How to Ask a Good Question”。 嗨,我很抱歉!我刚刚编辑了这篇文章,提供了更多信息。我希望我现在要问的更清楚一点。 【参考方案1】:

当您运行 setVariables 时,它会导致仅重新获取必要的数据。 Relay 查看查询的哪一部分可能会受到更改变量的影响,并且来自 GraphQL 服务器的请求需要片段。 这是可能的,因为 Node 接口(即通过不透明的 Relay id 获取对象)。在documentation 中查看更多信息。

我认为,在您的情况下,您应该在 GraphQL 服务器上实现 Node Interface for Production 类型。

【讨论】:

我的生产类型确实实现了节点接口。奇怪的是,如果我通过查看器查询(根中没有参数),并且在子组件中有参数,Relay 会生成正确的查询。

以上是关于使用`setVariables`后中继生成无效查询-我做错了啥吗?的主要内容,如果未能解决你的问题,请参考以下文章

删除时出现中继错误:RelayMutationQuery:胖查询中的字段名称无效

中继重新获取失败...错误中继无法协调连接上的边缘

Android DataBinding不能自动生成ViewDataBinding类的解决方法

使用 this.props.relay.setVariables 时,Relay/Graphql 查询字段“node”而不是“viewer”

Pentaho Kettle 修改的 Java 脚本 setVariable

发件箱模式 - 我们如何防止消息中继进程生成重复消息?