javascript - 如何让 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?"
是否可以让枚举值解析字符串值?如果我从输入中删除引号,它将起作用。但是,我需要能够继续将模式解析为字符串。
解决方案
从规格:
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
输入字段的值,您应该使用变量来这样做,在这种情况下(如上所示),无论如何您都将传入一个字符串值。
推荐阅读
- c++ - CMake 错误:在 Mac OS 上使用 clang 找不到 OpenMP_C(缺少:OpenMP_C_FLAGS)
- python - 将变量与多个值进行比较的简洁方法
- apache-kafka - 知道为什么这个 Kafka 经纪人会崩溃吗?里面的日志。我在这里没有看到任何明显的东西
- excel - 在 Excel 工作表中显示数据时间时出错
- c++ - constexpr(sizeof(T)):为什么在 `sizeof` 上指定 `constexpr`?
- arrays - 基于元素值的 Ruby 数组到子数组
- verilog - 这两个计数器有什么区别?
- excel - 公式 VBA 中的动态范围
- mysql - 如何在没有主键的mysql表中添加主键
- salesforce - DocuSign Apex 工具包使用多个数据源创建信封