You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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,同时调整代码结构适配异步逻辑:

  1. 修改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)
  }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 22:05:22