使用discord.js部署斜杠命令时报setInterval(...).unref is not a function错误
错误原因
- Node.js版本不符合discord.js依赖要求:你使用的discord.js版本最低要求Node.js 16.9.0及以上运行环境,旧版本Node.js中
setInterval返回的定时器对象没有unref方法,直接触发该类型错误。 - 代码依赖导入不全:你用到了
REST、Routes两个对象,但没有在代码头部引入对应依赖,后续运行也会触发额外报错。 - 参数判断逻辑错误:
process.argv默认会包含Node.js执行路径、当前脚本路径两个参数,长度至少为2,你写的if (process.argv.length)判断永远为真,永远只会注册单服务器斜杠命令,不会触发全局命令注册逻辑。 - Token配置冲突:你同时写了
client.login("Your Token")硬编码Token和给REST实例使用process.env.TOKEN环境变量Token的逻辑,二者不一致会导致权限校验失败。
解决方法
- 升级Node.js版本到16.9.0及以上,升级完成后执行
node -v确认版本号符合要求。 - 补全代码头部的依赖导入语句,如果不需要用到Client实例可以直接删除相关代码,单独注册斜杠命令不需要初始化Client:
const { REST, Routes } = require('@discordjs/rest'); const Discord = require("discord.js");
- 修正服务器ID的判断逻辑,改为判断传入参数数量是否大于等于3,取第三个参数作为服务器ID:
if (process.argv.length >= 3) { await rest.put( Routes.applicationGuildCommands(process.env.CLIENT_ID, process.argv[2]), { body: commands } ); }
- 统一Token配置:如果使用环境变量就删除
client.login("Your Token")的硬编码逻辑,或者确认两处Token配置一致。如果仅需要注册命令不需要运行机器人,完全可以删除Client初始化和login的相关代码,减少不必要的依赖加载。
内容的提问来源于stack exchange,提问作者LuaLearner
相关产品推荐
相关产品推荐

