【问题标题】:How to declare strings in enum如何在枚举中声明字符串
【发布时间】:2018-10-22 09:06:21
【问题描述】:

使用 graphql,enum 可以制作预定义的元素列表,但字符串不起作用。

例如:

enum Dias {
  lunes
  martes
  miércoles
  jueves
  viernes
  sábado
  domingo
}

这会返回错误GraphQLError: Syntax Error: Cannot parse the unexpected character "\u00E9".

如何制作预定义的字符串列表?


编辑:为了提供更多上下文,我想反映数据库模式,就像这样(使用猫鼬):

dias: {
  type: String,
  enum: ['lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado', 'domingo'],
  lowercase: true,
  required: true
}

【问题讨论】:

    标签: graphql graphql-js


    【解决方案1】:

    您的语法是正确的,唯一的问题是不支持“é”和“á”字符。 specification 概述了命名操作、字段等的规则。支持的模式是:

    /[_A-Za-z][_0-9A-Za-z]*/
    

    此外:

    GraphQL 中的名称仅限于此可能字符的 ASCII 子集,以支持与尽可能多的其他系统的互操作。

    因此,很遗憾,您必须将这些重音字符转换为有效字符,才能使您的架构被视为有效。

    编辑:您可以创建自定义标量。这是一个接受名称、描述和数组并返回自定义标量的函数:

    const makeCustomEnumScalar = (name, description, validValues) => {
      const checkValue = (value) => {
        const coerced = String(value)
        if (!validValues.includes(coerced)) {
          throw new TypeError(`${coerced} is not a valid value for scalar ${name}`)
        }
        return coerced  
      }
      return new GraphQLScalarType({
        name,
        description,
        serialize: checkValue,
        parseValue: checkValue,
        parseLiteral: (ast) => checkValue(ast.value),
      })
    }
    

    现在您可以执行以下操作:

    const DayOfWeek = makeCustomEnumScalar('Day of Week', 'day of week enum', [
      'lunes',
      'martes',
      'miércoles',
      'jueves',
      'viernes',
      'sábado',
      'domingo'
    ])
    

    将其添加到您的解析器中:

    const resolvers = {
      DayOfWeek,
      // Query, Mutation, etc.
    }
    

    还有你的类型定义:

    scalar DayOfWeek
    

    然后您可以像使用任何其他标量一样使用它。如果查询提供了无效值作为输入或输出,那么 GraphQL 将抛出与枚举类似的错误。唯一需要注意的是,如果您将值直接输入到查询中(而不是使用变量),您仍然需要将它们用双引号括起来。

    【讨论】:

    • 感谢您的回答。就像我在问题中解释的那样,我已经注意到它不适用于enum。您的解释很有趣,但这并不能回答问题。我编辑了问题以添加更多上下文
    • @FrançoisRomain 请查看我编辑的答案以了解替代方法
    • 非常感谢,这行得通!最后一件事:在 graphiql 中,是否可以像标准 enum 那样对这些值进行自动完成?
    • 不,据我所知,没有办法做到这一点,因为有效值本身将无法通过自省获得。如果您采用这种方法,在描述中包含值以至少以这种方式记录它们可能会有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多