如何让 GraphQL 枚举解析字符串

Jim*_*Jim 10 javascript graphql graphql-js apollo-server apollo-client

以前,我只是输入了input KeyInputas mode: String!,我希望将类型从 String 更改为!到自定义枚举。

我尝试过以下架构:

enum Mode= {
    test
    live
}

input KeyInput = {
    mode: Mode!
}

type Key {
    name,
    mode
}

type Query {
    Keys(input: KeyInput): [Key]
}
Run Code Online (Sandbox Code Playgroud)

我的查询如下所示:

query{
     Keys(input: {mode: "test"}){
        name
     }
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

      "message": "Expected type Mode!, found \"test\"; Did you mean the enum value test?"
Run Code Online (Sandbox Code Playgroud)

是否可以让枚举值解析字符串值?如果我从输入中删除引号,它将起作用。但是,我需要能够继续将模式解析为字符串。

Dan*_*den 9

规格来看

\n
\n

GraphQL 有一个常量文字来表示枚举输入值。GraphQL 字符串文字不得被接受为枚举输入,否则会引发查询错误。

\n

对非\xe2\x80\x90string 符号值(例如 EDN)具有不同表示的查询变量传输序列化应仅允许此类值作为枚举输入值。否则,对于大多数不支持的传输序列化,字符串可能会被解释为具有相同名称的枚举输入值。

\n
\n

换句话说,当使用枚举作为输入时,如果您将其用作文字值,如下所示:

\n
Keys(input: { mode: test }) {\n  name\n}\n
Run Code Online (Sandbox Code Playgroud)\n

与必须用双引号括起来的字符串文字不同,枚举值(test在本例中)不能加引号。

\n

另一方面,如果您使用变量来替换枚举值,则将变量的值设置为字符串,就像设置常规字符串值一样:

\n
Keys(input: { mode: $mode }) {\n  name\n}\n\n// in your component...\nvariables: {\n  mode: \'test\'\n}\n
Run Code Online (Sandbox Code Playgroud)\n

因为 JSON 不包含枚举值的概念,所以每当我们处理 JSON 上下文时(例如,声明变量时,或者返回data),枚举值都会简单地序列化为字符串值。

\n

除此之外,如果您使用 Apollo 作为客户端,是否必须包含引号应该是无关紧要的——如果您需要替换输入字段的值mode,则应该使用变量来执行此操作,在这种情况下(如上所示),无论如何,您都将传递一个字符串值。

\n