繁体   English   中英

如何使用不同的字段生成相同的graphql查询

[英]How to generate the same graphql query with different fields

我正在使用graphql-tag所以我将使用该语法。

假设我有这个查询:

const query = gql`
 query user(id: String) {
  user(id: $id) {
   id
  }
 }
`

如果在不同的调用中重用相同的查询文档节点的最佳模式是什么,除了id之外,我还需要字段usernameemail ,而不必再次重写整个查询,例如:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM