discord.js v13中Slash命令仅能在单个Discord服务器生效吗?
报错原因
你遇到的TypeError: Cannot read properties of undefined (reading 'set')错误根本原因是:bot.guilds.cache.map(guild => guild.id)返回的是由所有服务器ID组成的纯数组,数组本身没有commands属性,自然无法调用set方法。
解决方案
你可以根据需求选择以下两种注册方式:
方案1:注册全局Slash命令(推荐)
Discord原生支持全局级别的Slash命令,注册后会自动同步到所有机器人已加入的服务器,不需要手动逐个传入服务器ID操作。
注册单条命令代码:bot.application.commands.set(command)
批量注册多条命令直接传入命令数组即可:bot.application.commands.set([command1, command2, command3])
注意:全局命令的同步存在传播延迟,最长可能需要1小时才能在所有服务器生效,适合不紧急的命令更新场景
方案2:遍历所有服务器即时注册(适用于需要立即生效的场景)
如果需要命令在所有服务器立即可用,你可以正确遍历缓存中的所有服务器对象,逐个执行注册操作:
示例代码:
// 遍历所有已缓存的服务器 for (const guild of bot.guilds.cache.values()) { await guild.commands.set(command.name, command) // 如果服务器数量较多,建议每次注册后加1~2秒延迟,避免触发Discord速率限制 // await new Promise(resolve => setTimeout(resolve, 1500)) }
注意:如果机器人加入的服务器数量超过100个,不建议使用该方法,频繁调用接口很容易被限制请求,优先使用全局命令注册
内容的提问来源于stack exchange,提问作者user17481541
相关产品推荐
相关产品推荐

