首页 > 解决方案 > 如何让 GraphQL 枚举解析字符串

问题描述

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

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

标签: javascriptgraphqlgraphql-jsapollo-clientapollo-server

解决方案


规格

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

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

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

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

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

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

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

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

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

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


推荐阅读