使用GraphQL Tools加载解析器时遇ERR_REQUIRE_ESM错误求助
解决ES模块下@graphql-tools/load-files加载解析器的ERR_REQUIRE_ESM错误
问题核心:你的项目配置了"type": "module"(ES模块模式),但loadFilesSync作为同步方法,内部通过require()加载JS文件——而Node.js明确禁止用require()加载ES模块,这直接触发了ERR_REQUIRE_ESM错误。加载.graphql文件正常是因为它仅做纯文本读取,不需要执行模块加载逻辑。
解决方案:改用异步加载方法loadFiles
ES模块的动态加载只能通过异步import()实现,因此需要替换同步的loadFilesSync为异步的loadFiles,同时调整代码结构适配异步逻辑:
- 修改
schema.js为异步导出:
import path from 'path' import { fileURLToPath } from 'url' import { loadFiles } from '@graphql-tools/load-files' import { mergeTypeDefs, mergeResolvers } from '@graphql-tools/merge' const __filename = fileURLToPath(import.meta.url) const __dirname = path.dirname(__filename) export async function getSchema() { // 异步加载类型定义 const typesArray = await loadFiles(path.join(__dirname, '.'), { recursive: true, extensions: ['graphql'], }) // 异步加载解析器文件 const resolversArray = await loadFiles(path.join(__dirname, './graphql/**/*.resolvers.js'), { recursive: true, extensions: ['js'], }) const newResolversArray = resolversArray.slice(1) return { typeDefs: mergeTypeDefs(typesArray), resolvers: mergeResolvers(newResolversArray) } }
- 在Apollo Server启动文件中异步获取Schema:
import { ApolloServer } from '@apollo/server' import { startStandaloneServer } from '@apollo/server/standalone' import { getSchema } from './schema.js' async function startServer() { const { typeDefs, resolvers } = await getSchema() const server = new ApolloServer({ typeDefs, resolvers }) const { url } = await startStandaloneServer(server, { listen: { port: 4000 } }) console.log(`🚀 服务器运行在 ${url}`) } startServer()
额外注意事项
- 确保
@graphql-tools/load-files是最新版本,旧版本对ES模块的异步支持不完善,可执行npm update @graphql-tools/load-files更新。 - Node.js本身不支持同步加载ES模块,异步是唯一合规的解决方案。
内容的提问来源于stack exchange,提问作者merlin
相关产品推荐
相关产品推荐

