我正在写一个relay.js应用,我正在使用react-relay-router进行路由。路由工作,但我认为这暴露了我如何在不同视图中组织查询片段的误解。
在 app.js
中定义的路线const rootComponent =
(<RelayRouter history={hashHistory}>
<Route path="/"
component={App}
queries={ViewerQueries}
onReadyStateChange={this.handleStateChange}
>
<IndexRoute
component={Dashboard}
queries={ViewerQueries}
/>
<Route
path="/org_setup"
component={OrgSetup}
queries={ViewerQueries}
/>
<Route
path="/admin/data_models"
component={DataModelList}
queries={ViewerQueries}
/>
</Route>
</RelayRouter>);
ReactDOM.render(rootComponent, mountNode);
在 DataModelList.js
中查询片段声明export default Relay.createContainer(DataModelList, {
fragments: {
viewer: () => Relay.QL`
fragment on User {
dataModels(first: 10) {
edges {
node {
id,
name,
isAuthority,
categories(first: 10) {
edges {
node {
id,
name,
tags(first: 10) {
edges {
node {
id,
code,
label,
}
}
}
}
}
},
adapter {
categories(first: 10) {
edges {
node {
id,
name,
}
}
}
}
}
}
},
}
`,
},
});
在 OrgSetup.js
中查询片段export default Relay.createContainer(OrgSetup, {
fragments: {
viewer: () => Relay.QL`
fragment on User {
dataModels(first: 10) {
edges {
node {
id,
name,
isAuthority,
categories(first: 10) {
edges {
node {
id,
name,
tags(first: 10) {
edges {
node {
id,
code,
label,
}
}
}
}
}
},
}
}
},
}
`,
},
});
在DataModelList
和OrgSetup
之间导航(向任一方向)时,我在控制台中看到以下错误:
Server request for query `ViewerQueries` failed for the following reasons:
1. Cannot query field "node" on "Query".
rQueries($id_0:ID!){node(id:$id_0){id,__typename,...F0}} fra
Warning: RelayReadyState: Invalid state change from
{"aborted":false,"done":false,"error":{"source":{"data":null,"errors":
[{"message":"Cannot query field \"node\" on \"Query\".","locations":
[{"line":1,"column":32}]}]}},"ready":false,"stale":false}` to `{"error":
{"source":{"data":null,"errors":[{"message":"Cannot query field \"node\" on
\"Query\".","locations":[{"line":1,"column":32}]}]}}}`.warning @
app.js:31567update @ app.js:39409onRejected @ app.js:39035tryCallOne @
app.js:30045(anonymous function) @ app.js:30131flush @ app.js:30279
我能够通过使两个视图中的查询片段相同来防止发生此错误 - 特别是通过添加adapter
片段。
然而,这感觉不对。他们不需要完全相同(实际上他们有点故意臃肿,因为这是我的学习应用程序),其他观点当然不会分享这些数据需求。
viewer
和他们的dataModels
,然后允许孩子
组件表达他们的需求,请求任何嵌套数据(例如
categories
,tags
或adapters
及其各自的categories
)。invalid state change
错误究竟意味着什么?我可以看到
它完全符合匹配的查询,但我不能
想象一下,共享查询声明需要不相关的视图。一世
怀疑这是我在其他地方做错事的副产品。谢谢!
答案 0 :(得分:5)
当查询发生更改时(例如,由于路由转换或对setVariables()
的调用),中继会将您要查询的查询和您要查询的查询区分开来,计算从A到B的最小查询。在您的情况下,Relay从存储在客户端上的一系列已知记录(已经获取的记录)开始,并尝试仅获取这些确切记录上的新字段建立一个完整的世界图景。这些反映依赖于node interface。
符合中继的GraphQL服务器必须公开名为node
的根域,该域可以获取给定全局ID的任何记录。此字段必须采用id
类型的GraphQLID!
参数。
有关如何构建此类根域的示例,请参阅this graphql-js
example。