You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:27:01