discord.js中sleep函数仅对部分命令生效,该如何修复?
问题原因
- 你的ping命令配置了
cooldown: 2000属性,执行时会走index文件中if (command.cooldown)的逻辑分支 - 该分支调用
command.run()时仅传入了bot, message, args三个参数,没有传入sleep函数,导致ping命令的run方法接收的第四个参数为undefined,调用时就抛出了「sleep is not a function」的错误 - 无cooldown配置的命令走的是else分支,调用run时传入了sleep,所以可以正常运行
修复方案
方案1(最快捷,仅修改index文件调用逻辑)
找到index文件中command.cooldown的判断分支,修改command.run(bot, message, args)为command.run(bot, message, args, sleep),修改后对应代码块如下:
if (command.cooldown) { if (Timeout.has(`${command.name}${message.author.id}`)) return message.channel.send(`Please wait **${ms(Timeout.get(`${command.name}${message.author.id}`) - Date.now(), { long: true })}** before using this command again!`) // 新增传入sleep参数 command.run(bot, message, args, sleep) Timeout.set(`${command.name}${message.author.id}`, Date.now() + command.cooldown) setTimeout(() => { Timeout.delete(`${command.name}${message.author.id}`) }, command.cooldown) } else command.run(bot, message, args, sleep);
方案2(更稳妥,避免后续参数传递遗漏)
直接把sleep函数定义为全局可用,不需要每次调用命令时传参:
- 把index文件中定义在message事件内的sleep函数移到文件顶部全局作用域
- 所有命令文件中不需要再把sleep作为run方法的参数接收,直接全局调用即可
示例代码:
// index.js 顶部新增sleep定义 const sleep = (ms) => { return new Promise(resolve => setTimeout(resolve, ms)); } // 后续所有命令文件中无需再接收sleep参数,直接使用sleep()即可
额外提醒:你提供的ping命令代码末尾多了一行冗余的
}),建议删除避免潜在语法问题。
内容的提问来源于stack exchange,提问作者blueCrafter6
相关产品推荐
相关产品推荐

