代码之家  ›  专栏  ›  技术社区  ›  Magnum

如何让graphql枚举解析字符串

  •  0
  • Magnum  · 技术社区  · 5 年前

    之前,我刚输入了 input KeyInput 作为 mode: 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?"
    

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

    1 回复  |  直到 5 年前
        1
  •  1
  •   Daniel Rearden    5 年前

    spec :

    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 输入字段,您应该使用变量来执行此操作,在这种情况下(如上所示),您将传入一个字符串值。