以前,我只是将input KeyInput
键入为mode: String!
,并且希望从String更改类型!到自定义枚举。
我有尝试以下模式:
enum Mode= {
test
live
}
input KeyInput = {
mode: Mode!
}
type Key {
name,
mode
}
type Query {
Keys(input: KeyInput): [Key]
}
我的查询如下所示:
query{
Keys(input: {mode: "test"}){
name
}
}
但是,出现以下错误:
"message": "Expected type Mode!, found \"test\"; Did you mean the enum value test?"
枚举值可以解析字符串值吗?如果我从输入中删除引号,它将起作用。但是,我需要能够继续将模式解析为字符串。
最佳答案
从spec:
GraphQL有一个常量文字来表示枚举输入值。 GraphQL字符串文字不能被接受为枚举输入,而会引发查询错误。
对于非字符串符号值(例如,EDN)具有不同表示形式的查询变量传输序列化应仅允许诸如枚举输入值之类的值。否则,对于大多数没有的传输序列化,字符串可能会解释为具有相同名称的枚举输入值。
换句话说,当使用枚举作为输入时,如果将其用作文字值,则如下所示:
Keys(input: { mode: test }) {
name
}
枚举值(在本例中为
test
)不能用引号引起来,这与Strings文字不同,后者必须用双引号引起来。另一方面,如果您使用变量替换枚举值,则将变量的值设置为字符串,就像使用常规String值一样:
Keys(input: { mode: $mode }) {
name
}
// in your component...
variables: {
mode: 'test'
}
因为JSON不包含枚举值的概念,所以每当我们处理JSON上下文时(例如,在声明变量或为请求返回
data
时),枚举值都将简单地序列化为字符串值。除此之外,如果您将Apollo用作客户端,则是否必须不使用引号也无关紧要-如果需要将值替换为
mode
输入字段,则应使用变量来这样做,在这种情况下(如上所示),无论如何都将传递一个字符串值。