中继现代片段错误(期望对象包含数据....)

Posted

技术标签:

【中文标题】中继现代片段错误(期望对象包含数据....)【英文标题】:Relay Modern fragment error (expect object to contain data....) 【发布时间】:2018-11-10 14:58:14 【问题描述】:

我正在使用 Relay 和 django-graphene 版本 2。Country.js 正在呈现国家/地区的 av 列表。

使用片段我得到这个错误: 警告:RelayModernSelector:预期对象包含片段Country_country 的数据,得到"node":"__fragments":"Country_country":,"__id":"Q291bnRyeVR5cGU6MQ=="。确保父操作/片段包含片段...Country_country 没有@relay(mask: false)

QueryRenderer 返回正确的国家列表,不带 Country_country,只需输入变量名。

<QueryRenderer
      environment=environment
      query=graphql`query CartContainerQuery 
        viewer 
          id
          countries(first: 3) 
            edges 
              node 
                ...Country_country
              
            
            pageInfo 
              startCursor
              endCursor
            
          

      
      `
      variables=
      render=(error, props) => 
        if (error) 
          console.log(error)
          return <div>Error!</div>;
        
        if (!props) 
          return <div>Loading...</div>;
        
        return (
          <div>
          console.log(props)
          <Country country=props.viewer.countries.edges />
          </div>
        );
      
    />

我在 Contry Container 上的片段:

export default createFragmentContainer(
   Country,
   graphql`
   fragment Country_country on CountryType @relay(plural: true) 
       id
       name
     
   `
 )

石墨烯架构:

class CountryType(DjangoObjectType, model=Country):
  class Meta:
    interfaces= (relay.Node,)
    filter_fields = ['name', 'id']

class Viewer(graphene.ObjectType):
  class Meta:
    interfaces = [relay.Node, ]

  countries = DjangoFilterConnectionField(CountryType)
  country = graphene.List(CountryType)

  def resolve_country(self, info, **kwargs):
    return Country.objects.all()

  def resolve_countries(self, info, **kwargs):
    return Country.objects.all()

class Query(graphene.ObjectType):
  viewer = graphene.Field(Viewer)
  node = relay.Node.Field()

  def resolve_viewer(self, info):
    return Viewer()

如果我在 QueryRenderer 中尝试此查询,它也可以正常工作:

query=graphql`query CartContainerQuery 
            viewer 
              id
              country 
                  ...Country_country
                
            
          `

我是否错误地使用了 DjangoFilterConnectionField?

【问题讨论】:

【参考方案1】:

据我所知并现在进行测试,您的石墨烯端没问题,并且错误来自 ReactJS 端,这意味着您真正使用的是 DjangoFilterConnectionField。

我对此进行了大量研究,但由于我没有完全看到您的 React 代码,所以我有点怀疑。无论如何,正如我在这个示例中看到的(Query,Fragment),你用错了:

<Country country=props.viewer.countries.edges />

你应该这样使用它:

<Country country=props.viewer.countries />

据我了解,您需要将查询的对象传递给孩子

【讨论】:

以上是关于中继现代片段错误(期望对象包含数据....)的主要内容,如果未能解决你的问题,请参考以下文章

中继现代碎片容器,道具不自动可用

中继 createFragmentContainer 的现代目的

中继片段变量

在 QueryRenderer 中传递中继现代变量

反应中继错误'对象没有方法找到'

中继:预计会收到一个对象,其中传播了`...MyComponent_user`,但未找到片段引用`