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

discord.js forEach批量ban报错.then is not a function如何修复

报错根因

你调用的message.guild.members.cache.get(element)是同步方法,作用是直接从本地内存缓存中读取对应ID的成员对象,返回值要么是GuildMember实例,要么是找不到时返回undefined,本身不是Promise类型,自然不存在.then()方法,直接链式调用就会抛出你看到的类型错误。

除此之外你的原有代码还有三个隐性bug:

  • 如果对应成员不在本地缓存里,get()会返回undefined,后续执行会直接抛出空引用错误
  • 用forEach遍历执行异步封禁请求会同时发起大量并发API调用,很容易触发Discord的接口速率限制,导致机器人被临时封禁接口权限
  • 没有错误捕获逻辑,只要单个成员封禁失败(比如机器人权限不足、成员已离服),整个批量流程会直接崩溃
修复后可直接运行的代码
const amo = await db.get(`abig_${message.guild.id}`)
// 串行遍历执行,避免并发触发速率限制
for (const userId of amo) {
  try {
    // 优先读缓存,缓存不存在时主动调用接口拉取成员信息
    const targetMember = message.guild.members.cache.get(userId) 
      ?? await message.guild.members.fetch(userId)
    await targetMember.ban()
  } catch (error) {
    // 单个成员封禁失败时打印错误,不中断整个批量流程
    console.log(`封禁ID为${userId}的成员失败:`, error.message)
  }
}
关键说明
  • 所有带.cache后缀的集合操作都是同步读取,不需要加await或者.then()
  • 涉及Discord接口的批量操作必须串行执行,不要用forEach、Promise.all这类会发起并发请求的写法
  • 涉及存储/外部传入的ID读取操作必须加异常捕获,避免无效ID导致整个功能崩溃

内容的提问来源于stack exchange,提问作者user18632107

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:09:23