![](/img/trans.png)
[英]Apollo GraphQL - Is it possible to do the same query requesting different fields?
[英]How to generate the same graphql query with different fields
我正在使用graphql-tag
所以我将使用该语法。
假设我有这个查询:
const query = gql`
query user(id: String) {
user(id: $id) {
id
}
}
`
如果在不同的调用中重用相同的查询文档节点的最佳模式是什么,除了id
之外,我还需要字段username
和email
,而不必再次重写整个查询,例如:
const query = gql`
query user(id: String) {
user(id: $id) {
id
username
email
}
}
`
如果这让事情变得更有趣,我会在前端使用react-apollo
。
编辑:
只是为了澄清......像这样的事情
const userIdFrag = gql`
fragment UserId on User {
id
}
`
const fullUserFrag = gql`
fragment FullUser on User {
id
username
email
}
`
const generateQuery = (documentNode) => {
return gql`
query user(id: String) {
user(id: $id) {
...documentNode
}
}
${documentNode}
`
}
const idQuery = generateQuery(userIdFrag);
const fullUserQuery = generateQuery(fullUserFrag);
(以上确实有效,但在控制台中给了我来自 graphql 的错误,这让我相信这不是我应该做的事情)
根据您的评论,以下内容应该有效:
const generateQuery = (documentNode, fragment) => {
return gql`
query user(id: String) {
user(id: $id) {
...${fragment}
}
}
${documentNode}
`
}
const idQuery = generateQuery(userIdFrag, 'UserId');
const fullUserQuery = generateQuery(fullUserFrag, 'FullUser');
基本上使用的片段名称是需要传播的实际名称,而整个 documentNode 对象放在最后,在查询的右括号之后
我不是该主题的专家,但这是我能够找到的。 (如果您发现我的假设有任何错误,请告诉我)。
我发现这篇文章对动态生成gql
查询/突变提出了一些好处。 使用静态方法似乎可以获得一些不错的好处,尽管它需要更多的输入。
但是,如果您确实需要拥有动态字段,我无法发现使用 GraphQL 提供的@skip
指令有什么不好的@skip
。 这里的文档参考。
对于在react-apollo
中使用它的情况, 他们也在他们的 docs 中有它。
因此,您的代码最终可能看起来像这样:
const query = gql`
query user($id: String, $skipUserMeta: Boolean!) {
user(id: $id) {
id
username @skip(if: $skipUserMeta)
email @skip(if: $skipUserMeta)
}
}
`
您只需将skipUserMeta
作为变量与id
字段一起传递。
注意:我实际上找到了一个视频,其中讨论了完全相同的方法here
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.