运行discord.js机器人出现ERR_UNSUPPORTED_ESM_URL_SCHEME错误
解决Node.js ESM加载错误:ERR_UNSUPPORTED_ESM_URL_SCHEME(Windows环境)
错误场景
执行命令node --experimental-json-modules bot.js运行Discord.js机器人时,触发以下错误:
Slash Commands (Global) started refreshing app. node:internal/errors:490 ErrorCaptureStackTrace(err); ^ Error [ERR_UNSUPPORTED_ESM_URL_SCHEME]: Only URLs with a scheme in: file and data are supported by the default ESM loader. On Windows, absolute paths must be valid file:// URLs. Received protocol 'c:' at new NodeError (node:internal/errors:399:5) at throwIfUnsupportedURLScheme (node:internal/modules/esm/resolve:1059:11) at defaultResolve (node:internal/modules/esm/resolve:1135:3) at nextResolve (node:internal/modules/esm/loader:163:28) at ESMLoader.resolve (node:internal/modules/esm/loader:838:30) at ESMLoader.getModuleJob (node:internal/modules/esm/loader:424:18) at ESMLoader.import (node:internal/modules/esm/loader:525:22) at importModuleDynamically (node:internal/modules/esm/translators:110:35) at importModuleDynamicallyCallback (node:internal/process/esm_loader:35:14) at client.handleEvents (file:///C:/Users/kefaz0r/Desktop/abb/src/functions/handleEvents.js:6:32) { code: 'ERR_UNSUPPORTED_ESM_URL_SCHEME' } Node.js v18.14.0
解决方案
1. 修正动态导入的路径格式
错误根源是handleEvents.js第6行的动态导入使用了Windows原生绝对路径(如C:\xxx\yyy.js),而ESM模块要求绝对路径必须以file://协议开头。
- 直接修改为
file://格式路径:// 错误写法 import("C:/Users/kefaz0r/Desktop/abb/src/events/xxx.js") // 正确写法 import("file:///C:/Users/kefaz0r/Desktop/abb/src/events/xxx.js") - 优先使用相对路径(更适配跨平台):
从handleEvents.js所在的src/functions目录出发,用相对路径指向事件文件:import("../events/xxx.js")
2. 确认package.json的ESM配置
确保项目根目录的package.json中已添加"type": "module",明确告诉Node.js以ESM模式处理所有文件:
{ "type": "module", // 其他项目配置... }
3. 动态生成合规的ESM路径
如果需要通过变量拼接路径,使用Node.js的URL类生成符合要求的file://格式路径:
import { fileURLToPath } from 'url'; import { dirname, resolve } from 'path'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // 生成合规路径并执行导入 const eventPath = new URL(resolve(__dirname, '../events/xxx.js')).href; await import(eventPath);
验证
修改完成后,重新执行node --experimental-json-modules bot.js,确认错误不再出现。
内容的提问来源于stack exchange,提问作者Morfi Mist
相关产品推荐
相关产品推荐

