首页 > 解决方案 > 解析“ç”时出现GraphQL错误:无法解析意外字符“\u00E7”

问题描述

我将 KeystoneJS 与 GraphQL 一起使用。在我的设置中,我正在准备一个下拉菜单字段(Select在 KeystoneJS 中)

    language: {type:Select, options: ['English','Français', 'Deutsch'], defaultValue: 'English'},

但是当我启动 KeystoneJS 应用程序时,我得到了

GraphQLError: Syntax Error: Cannot parse the unexpected character "\u00E7".
    at syntaxError (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql/error/syntaxError.js:15:10)
at readToken (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql/language/lexer.js:270:38)
at Object.lookahead (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql/language/lexer.js:54:43)
at Object.advanceLexer [as advance] (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql/language/lexer.js:44:33)
at Parser.expectToken (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql/language/parser.js:1399:19)
at Parser.parseName (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql/language/parser.js:94:22)
at Parser.parseEnumValueDefinition (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql/language/parser.js:1014:21)
at Parser.optionalMany (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql/language/parser.js:1497:28)
at Parser.parseEnumValuesDefinition (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql/language/parser.js:1002:17)
at Parser.parseEnumTypeDefinition (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql/language/parser.js:986:23)
at Parser.parseTypeSystemDefinition (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql/language/parser.js:705:23)
at Parser.parseDefinition (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql/language/parser.js:146:23)
at Parser.many (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql/language/parser.js:1518:26)
at Parser.parseDocument (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql/language/parser.js:111:25)
at parse (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql/language/parser.js:36:17)
at parseDocument (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql-tag/lib/graphql-tag.umd.js:135:16)
at gql (/Users/user0/Documents/sandbox/keystone-blank/node_modules/graphql-tag/lib/graphql-tag.umd.js:176:10)
at /Users/user0/Documents/sandbox/keystone-blank/node_modules/@keystonejs/keystone/lib/Keystone/index.js:508:23
at Array.map (<anonymous>)
    at Keystone.getTypeDefs (/Users/user0/Documents/sandbox/keystone-blank/node_modules/@keystonejs/keystone/lib/Keystone/index.js:508:8)
    at Keystone.getAdminSchema (/Users/user0/Documents/sandbox/keystone-blank/node_modules/@keystonejs/keystone/lib/Keystone/index.js:520:27)
    at createApolloServer (/Users/user0/Documents/sandbox/keystone-blank/node_modules/@keystonejs/app-graphql/lib/apolloServer.js:147:17) {
        message: 'Syntax Error: Cannot parse the unexpected character "\\u00E7".',
        locations: [ { line: 4, column: 13 } ]
    }

当我将“Français”更改为“Francais”时,它工作正常。似乎 GraphQL(或 Keystone)不喜欢非标准字符。有谁知道这里到底发生了什么,以及我该如何解决它,以便我可以使用正确的形式,“Français”?谢谢!

标签: javascriptnode.jsgraphqlapollo-serverkeystonejs

解决方案


根据规范,字符串中的字符仅限于以下字符:

/[\u0009\u000A\u000D\u0020-\uFFFF]/

这包括字符“ç”。但是,模式中的事物名称(类型、字段、参数等)被限制为一组更小的有效字符,并且必须遵循以下模式:

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

如果 KeystoneJS 将上述转换options为一组枚举值,这将导致您看到的语法错误,因为枚举值必须是有效名称。

通常,这里的解决方法是将枚举值映射到客户端的正确等效项。


推荐阅读