使用graphql-tools的makeExecutableSchema时出现语法错误求助
问题描述
我正在学习创建GraphQL服务器,尝试使用graphql-tools创建可执行schema,但运行示例代码时返回语法错误,操作系统为Windows10。错误栈显示在@graphql-tools/utils的helpers.js文件中出现Unexpected token '.'错误。我的代码是一个基础Express服务器,使用makeExecutableSchema的示例代码,同时尝试Yoga GraphQL服务器时也出现类似语法错误,怀疑是否安装有误,请求解答。
错误栈信息
C:\Users\tranv\Documents\frontendMentor\link-sharing-app\node_modules\@graphql-tools\utils\cjs\helpers.js:46 name = a.alias?.value; ^ SyntaxError: Unexpected token '.' at wrapSafe (internal/modules/cjs/loader.js:1053:16) at Module._compile (internal/modules/cjs/loader.js:1101:27) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10) at Module.load (internal/modules/cjs/loader.js:985:32) at Function.Module._load (internal/modules/cjs/loader.js:878:14) at Module.require (internal/modules/cjs/loader.js:1025:19) at require (internal/modules/cjs/helpers.js:72:18) at Object.<anonymous> (C:\Users\tranv\Documents\frontendMentor\link-sharing-app\node_modules\@graphql-tools\utils\cjs\index.js:5:22) at Module._compile (internal/modules/cjs/loader.js:1137:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
我的代码
const express = require('express'); const port = 5000; const makeExecutableSchema = require('@graphql-tools/schema'); const executableSchema = makeExecutableSchema({ typeDefs: schema, resolvers: { Query: { hello: () => 'Hello, world!', }, }, }); const app = express(); app.listen(port, console.log(`Server running on port ${port}`));
解决方案
核心原因
错误里的?.是ES2020引入的可选链操作符,你当前使用的Node.js版本不支持这个语法,导致编译失败。
解决步骤
升级Node.js版本
直接把Node.js升级到14.x及以上版本(可选链在Node.js 14.0.0及以上被完全支持),升级后重新安装依赖即可解决。安装兼容旧Node版本的依赖包
如果暂时无法升级Node.js,可以指定安装@graphql-tools/utils的旧版本,比如:npm install @graphql-tools/utils@8.10.1这个版本的代码未使用可选链语法,能兼容更低版本的Node.js。
修复代码中的未定义变量问题
你的代码里typeDefs: schema中的schema变量未定义,需要补充GraphQL类型定义,示例如下:const express = require('express'); const port = 5000; const makeExecutableSchema = require('@graphql-tools/schema'); // 补充类型定义 const schema = ` type Query { hello: String } `; const executableSchema = makeExecutableSchema({ typeDefs: schema, resolvers: { Query: { hello: () => 'Hello, world!', }, }, }); const app = express(); app.listen(port, console.log(`Server running on port ${port}`));
内容的提问来源于stack exchange,提问作者Vinh Tran
相关产品推荐
相关产品推荐

