GraphQL - 将枚举值直接传递给变量作为参数?

时间:2017-12-07 22:05:57

标签: types enums graphql

给出以下GraphQL类型定义:

const typeDefs = `
  enum Action {
    update
    delete
  }    

  type Mutation {
    doSomething(action: Action)
  }
`;

此查询有效:

const query = `
  mutation($action: Action) {
    doSomething(action: $action)
  }
`
const variables = { action: "update" }

但是这个没有:

const query = `
  mutation {
    doSomething(action: "update")
  }
`

GraphQL不支持直接将枚举值作为参数传递吗?

2 个答案:

答案 0 :(得分:4)

GraphQL支持直接将枚举作为参数传递;但是,您需要省略值周围的引号才能使其工作:

const query = `
  mutation {
    doSomething(action: update)
  }
`

根据spec

  

枚举值表示为不带引号的名称(例如MOBILE_WEB)。

因此,与字符串值不同,枚举值不应放在引号内。我们在将它们用于变量时这样做的唯一原因是遵循正确的JSON格式。

答案 1 :(得分:0)

在后端定义的

枚举是:

enum Gender {
  MALE
  FEMALE
}

我正在使用Vue作为前端,因此可以像这样将数据传递给Vue的变异。 我在组件的本地状态下将性别定义为字符串:

data(){
  return {
     gender: ''
  }
}

Vue中的方法是:

async handleEditProfile () {
      const response = await this.$apollo.mutate({
        query: EDIT_PROFILE,
        variables: {
          nameAsInPan: this.nameAsInPan,
          gender: this.gender,
          dateOfBirth: this.dateOfBirth
        }
      })
    }

在EDIT_PROFILE上面使用的变异:

gql`mutation editProfile($name: String!, $email: String!,$phone: String!, $gender: Gender!, $dateOfBirth: String!) {
    editProfile (profileInput:{name: $name, email: $email, phone: $phone, gender: $gender, dateOfBirth: $dateOfBirth}){
      id
      email
      phone
      firstName
      lastName
      nameAsInPan
      gender
      dateOfBirth
    }
}
`

使用突变中定义的枚举变量名称,并将其发送给Graphql,就像我使用了性别As $gender: Gender!处于gql突变。您不必担心将数据作为枚举发送,只需将其作为String发送,否则您将不得不面对JSON错误,Graphql将处理您以字符串形式发送的值(例如“ MALE”或“ FEMALE”)别忘了提到性别是gql突变中的性别类型(即枚举),就像我上面所做的那样。