碎片“F1”不能在这里传播,因为“节点”类型的对象永远不能是“存储”类型

时间:2017-03-02 10:01:54

标签: reactjs graphql relay

我写了以下代码:

在下面的某些用户操作上调用方法:

handleFolderClicked = (topic, parent) => {
    console.log('Main : handleFolderClicked called : ', parent);
    this.props.relay.setVariables({
      parentFolder: parent,
      email: loginEmail
    });
  }

Main = Relay.createContainer(Main, {
  initialVariables: {
    pageSize: pageSize,
    email: loginEmail,
    parentFolder: parentFolder,
  },
  fragments: {
    store: () => Relay.QL`
      fragment on Store {
        id,
        fileConnection(first:999, email:$email, parentFolder:$parentFolder) {
          ${DirectoryListing.getFragment('files')},
        }
        users {
          email,
        }
      }
    `,
  }
});
export default Main;

在页面加载时工作正常并获取结果但是当使用setVariables更改parentFolder的值时,它会抛出错误。

洞察力可能有用且值得赞赏。感谢

1 个答案:

答案 0 :(得分:0)

我遇到了这个错误,我解决了这样的问题:

Store必须实现Relay的Node接口,这意味着它必须提供id: ID!字段,如果使用返回的ID执行节点查询,则Store必须退回。

在我的案例中,我命名了viewer类型的根对象Viewer;所以在实现Node接口后,此查询必须起作用:

{
  viewer {
    id
  }
}

返回:

{
  "data": {
    "viewer": {
      "id": "Vmlld2VyOk5vbmU="
    }
  }
}

现在,如果我使用该ID运行节点Query,则必须返回查看器。所以对于查询:

{
  node(id: "Vmlld2VyOk5vbmU=") {
    id,
    __typename
  }
}

这应该是结果:

{
  "data": {
    "node": {
      "id": "Vmlld2VyOk5vbmU=",
      "__typename": "Viewer"
    }
  }
}

将所有viewer / Viewer替换为store / Store,它应该有效。