首页 > 解决方案 > 如何在枚举中声明字符串

问题描述

使用 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
}

标签: graphqlgraphql-js

解决方案


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

/[_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 将抛出与枚举类似的错误。唯一需要注意的是,如果您将值直接输入到查询中(而不是使用变量),您仍然需要将它们用双引号引起来。


推荐阅读