discord.js v13斜杠命令中通过UserId获取GuildMember的实现方法
问题根因
你用的client.api.applications(...).commands.post是discord.js v12时期的内部私有API调用方式,这类接口没有对外做稳定性承诺,v13及之后的大版本更新时,内部接口路径、鉴权逻辑都做了调整,旧写法直接失效。目前discord.js稳定版(v14)已经封装了标准化的斜杠命令注册方法,不要直接调用client.api下的未公开路径。
前置要求
- 使用discord.js v14稳定版本
- 在Discord开发者门户为机器人开启
applications.commands权限,邀请机器人进入服务器时,必须勾选同名称的授权scope,否则会报权限错误
可直接运行的实现代码
所有注册逻辑建议放在client.on('ready')回调里执行,确保机器人和Discord网关连接完成后再调用接口。
单公会(服务器)命令注册
适合开发调试阶段使用,注册后即时生效,最长延迟不超过1分钟:
// 替换为你要注册命令的目标服务器ID const TARGET_GUILD_ID = "你的服务器ID"; // 命令配置,和你原有配置结构兼容 const testCommand = { name: "test", description: "测试命令", options: [] // 按需填写命令参数选项 }; client.on("ready", async () => { try { const targetGuild = client.guilds.cache.get(TARGET_GUILD_ID); if (!targetGuild) throw new Error("机器人未加入目标服务器,无法注册命令"); // 提交注册,set方法会全量覆盖该服务器下当前机器人的所有命令 await targetGuild.commands.set([testCommand]); console.log("单公会斜杠命令注册完成"); } catch (err) { console.error("注册失败:", err); } });
全局命令注册
适合正式生产环境使用,注册后Discord会做全球节点缓存,最长需要1小时才能在所有服务器生效,生效后所有和机器人共存的服务器都能看到该命令:
const formalCommand = { name: "formal-command", description: "正式上线的命令", options: [] }; client.on("ready", async () => { try { // 提交全局命令注册,set方法会全量覆盖当前机器人的所有全局命令 await client.application.commands.set([formalCommand]); console.log("全局斜杠命令提交成功,等待缓存生效即可"); } catch (err) { console.error("注册失败:", err); } });
注意事项
- 命令名称必须为全小写,不能包含大写字母、特殊空格/符号,长度在1-32字符之间;命令描述长度在1-100字符之间,不符合规则会直接注册报错
- Discord对命令注册接口有严格频率限制,不要在每次收到消息、每次交互触发时都调用注册接口,建议本地调试时手动触发注册,正式环境只在命令配置有更新时提交一次即可
- 如果需要配置命令的调用权限(比如仅管理员可调用),可以在命令注册完成后,调用对应命令实例的
permissions.set方法配置权限规则
内容的提问来源于stack exchange,提问作者dadavuvu
相关产品推荐
相关产品推荐

