Graphql 如何在枚举中声明字符串

Graphql 如何在枚举中声明字符串,graphql,graphql-js,Graphql,Graphql Js,使用graphql,enum可以生成预定义的元素列表,但字符串不起作用 例如: enum Dias { lunes martes miércoles jueves viernes sábado domingo } 这将返回一个错误GraphQLError:语法错误:无法分析意外字符“\u00E9”。 如何创建预定义的字符串列表? 编辑:为了提供更多上下文,我想反映数据库模式,如下所示(使用mongoose): 您的语法是正确的,唯一的问题是不支持“é”和“á”字符

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

例如:

enum Dias {
  lunes
  martes
  miércoles
  jueves
  viernes
  sábado
  domingo
}
这将返回一个错误
GraphQLError:语法错误:无法分析意外字符“\u00E9”。

如何创建预定义的字符串列表?


编辑:为了提供更多上下文,我想反映数据库模式,如下所示(使用mongoose):


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

/[_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
时立即运行。你的解释很有趣,但这并不能回答问题。我对问题进行了编辑,以添加更多内容context@FrançoisRomain请查看我编辑的答案,以获得替代方法非常感谢,这很有效!最后一件事:在graphiql中,是否可以像标准的
enum
那样自动完成这些值?不,据我所知,没有办法这样做,因为有效值本身无法通过内省获得。如果您采用这种方法,那么在描述中包含这些值可能会有所帮助,至少以这种方式记录它们
scalar DayOfWeek