GraphQL - 将枚举值作为参数直接传递给突变?
Posted
技术标签:
【中文标题】GraphQL - 将枚举值作为参数直接传递给突变?【英文标题】:GraphQL - Passing an enum value directly to a mutation as an argument? 【发布时间】:2018-05-22 02:59:04 【问题描述】:给定以下 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 不支持直接将枚举值作为参数传递吗?
【问题讨论】:
【参考方案1】:GraphQL 确实支持将枚举直接作为参数传递;但是,您需要省略值周围的引号才能使其正常工作:
const query = `
mutation
doSomething(action: update)
`
根据spec:
枚举值表示为不带引号的名称(例如 MOBILE_WEB)。
因此与字符串值不同的是,枚举值不应放在引号内。将它们用于变量时,我们这样做的唯一原因是遵循正确的 JSON 格式。
【讨论】:
只是我,还是使用枚举很难通过变量对象传递参数?【参考方案2】:在后端定义的枚举是:
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,就像我使用的性别一样
$gender: Gender!
在 gql 突变中。您不必担心以枚举形式发送数据,只需将其作为字符串发送,否则您将不得不面对 JSON 错误,Graphql 将处理您作为字符串发送的值(例如 'MALE ' 或 'FEMALE') 只是不要忘记提及性别是 gql 突变中的性别类型(即枚举),就像我在上面所做的那样。
【讨论】:
以上是关于GraphQL - 将枚举值作为参数直接传递给突变?的主要内容,如果未能解决你的问题,请参考以下文章
AppSync,使用 graphql-tag 将数组作为输入参数传递
如何使用 GraphQL.Net 和 c# 将集合传递给 GraphQL 突变?