Discord.js moderation bot ban命令运行失败提示user_id非有效snowflake求助
问题排查与修复方案
错误原因
报错核心是参数格式不匹配:你调用client.users.fetch()时传入的args[0]是用户提及格式的字符串<@!856413967595012127>,而Discord API仅接受纯数字的Snowflake ID作为用户查询参数,因此触发校验失败。
修复要点
- 先从输入的提及字符串中提取纯数字ID
- 补充边界校验逻辑,覆盖无输入、用户不存在、权限不足等异常场景
- 对所有异步操作添加错误捕获,避免未处理的Promise rejection
修复后代码
module.exports = { name: 'ban', description: "Used to ban members from a server", async execute(client, message, args, Discord) { // 权限校验保持不变 if (!(message.member.roles.cache.some(r => r.id === "853527575317708820"))) return // 新增:校验是否输入了封禁对象 if (!args[0]) return message.channel.send("请指定需要封禁的用户") // 从提及字符串中提取纯ID const userId = args[0].replace(/[<@!>]/g, '') let reason = args[1] || "Not specified" try { const user = await client.users.fetch(userId) const embed = new Discord.MessageEmbed() .setTitle(`${user.username} was banned!`) .setDescription(`${user.username} was banned by ${message.author.username} for: ${reason}`) .setColor("#f0db4f") .setFooter("Ban Command") .setTimestamp() await message.channel.send(embed) // 执行封禁时传入原因,且添加await和错误捕获 await message.guild.members.ban(user, { reason: reason }) } catch (err) { message.channel.send("操作失败:可能是用户不存在、我的权限不足,或该用户权限高于我") } } }
内容的提问来源于stack exchange,提问作者Irtiza Khan Labib
相关产品推荐
相关产品推荐

