如何使用GraphQL枚举解析字符串

问题描述 投票:1回答:1

以前,我只是输入我的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?"

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

javascript graphql graphql-js apollo-client apollo-server
1个回答
1
投票

来自spec

GraphQL有一个常量文字来表示枚举输入值。不得将GraphQL字符串文字作为枚举输入接受,而是引发查询错误。

对非字符串符号值(例如,EDN)具有不同表示的查询变量传输序列化应仅允许这样的值作为枚举输入值。否则,对于大多数不传输的传输序列化,可以将字符串解释为具有相同名称的枚举输入值。

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

Keys(input: { mode: test }) {
  name
}

枚举值(在这种情况下为test)不能引用,不像字符串文字,它必须用双引号括起来。

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

Keys(input: { mode: $mode }) {
  name
}

// in your component...
variables: {
  mode: 'test'
}

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

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

© www.soinside.com 2019 - 2024. All rights reserved.