Discord.js v13引入parse-ms触发ERR_REQUIRE_ESM require不支持ES模块错误
报错原因
你遇到的ERR_REQUIRE_ESM错误是因为parse-ms从3.0.0版本开始改为纯ESM模块,不能在CommonJS规范的项目中使用require()直接导入,而Discord.js v13的项目默认采用CommonJS规范,因此触发了该报错。
解决方案
方案1:直接移除parse-ms依赖(最推荐,无额外安装)
你当前代码仅需要用到剩余秒数,完全可以自行计算,不需要引入这个第三方包:
- 删除代码中
const ms = require('parse-ms')这一行 - 找到冷却时间计算的代码块,替换原有毫秒转换逻辑:
// 把原有代码 const timeleft = ms(timeout - (Date.now() - begtime)) // 替换为以下内容 const timeleft = { seconds: Math.ceil((timeout - (Date.now() - begtime)) / 1000) }
改完直接就能运行,不需要安装任何依赖。
方案2:降级parse-ms到兼容CommonJS的版本
如果不想修改原有代码逻辑,可以直接安装支持require导入的旧版本:
- 执行卸载命令:
npm uninstall parse-ms - 执行安装旧版本命令:
npm install parse-ms@2.1.0 - 原有代码不需要做任何修改,直接运行即可。
方案3:使用动态导入兼容ESM模块
如果需要使用新版parse-ms的全部功能,可以用CommonJS支持的动态导入语法适配:
- 删掉原来的
const ms = require('parse-ms')行 - 将callback函数改为异步函数:
callback: async (message, args) => { - 在用到ms函数的位置前新增动态导入逻辑:
if(begtime !== null && timeout - (Date.now() - begtime) > 0) { // 动态导入parse-ms const { default: ms } = await import('parse-ms') const timeleft = ms(timeout - (Date.now() - begtime)) // 后面的embed代码保持不变 }
额外注意
你当前的代码中没有导入MessageEmbed,运行时会抛出未定义错误,需要在顶部加上导入行:const { MessageEmbed } = require('discord.js'),同时把代码里所有转义的>、<替换为正常的>、<。
内容的提问来源于stack exchange,提问作者Asuka
相关产品推荐
相关产品推荐

