可以使用变量进行字段选择吗?

时间:2019-01-31 16:57:27

标签: javascript graphql

因此,我具有如下所示的模板功能。

我想传递一封电子邮件,一些有关该用户电子邮件的内容。

$email变量有效,但是我似乎无法让它接受项目列表的第二个变量。

const getUser = (email, items = ['email']) => ({
  query: `
    query ($email: String!, $items: [String]) {
      allUsers(condition:{ email: $email }) {
        edges {
          node {
            $items
          }
        }
      }
    }
  `,
  variables: {
    email,
    items,
  },
});

如何动态传递要查询返回的项目列表?

2 个答案:

答案 0 :(得分:1)

由于查询本身是一个(模板)字符串,因此您可以尝试执行以下操作:

const getUser = (email, items = ['email']) => ({
  query: `
    query ($email: String!, $items: [String]) {
      allUsers(condition:{ email: $email }) {
        edges {
          node {
            ${items}
          }
        }
      }
    }
  `,
  variables: {
    email,
    items,
  },
});

答案 1 :(得分:1)

将变量转换为字段的唯一方法是使用@skip@include伪指令。 For example

query MyQuery($image: Boolean!) {
  pokemons(first: 10) {
    name
    image @include(if: $image)
  }
}

仅在image变量为true时才包含image字段,而在变量为false时将跳过。 @skip指令的工作方式相同,但相反。对于许多领域来说,这是不可持续的,但这是完成您要达到的目标的唯一内置方法。

如果您能够修改服务器代码,则可以潜在地创建一个自定义指令,该指令的工作原理类似,但是可以接受字符串值的数组并从该列表中创建选择集。然后可以将变量传递给该自定义指令。但是,再次假设您可以修改服务器端代码,而事实并非如此。