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

discord.js v13如何获取所有guild所有者并解决owner.send报错问题

问题原因
  • 报错TypeError: Cannot read properties of undefined (reading 'send')的核心原因确实是服务器所有者的用户对象不在客户端缓存中,message.client.users.cache.get() 找不到对应ID的用户时会返回undefined,调用undefined.send就会抛出该错误。
  • forEach循环无法正常使用await的原因是:forEach设计上不支持等待异步回调执行完成,即使外层包裹async函数,forEach传入的回调函数也会独立触发,不会等待内部await操作结束。
解决方案

使用支持异步等待的for...of循环替换forEach,配合guild.fetchOwner()直接从Discord API拉取最新的所有者信息,不需要依赖本地缓存:

// 确保这段逻辑放在async函数内,例如消息事件处理函数需要先加async修饰
async function sendNewsToAllGuildOwners() {
  // 直接遍历服务器缓存,不需要多余的map转数组操作
  for (const guild of message.client.guilds.cache.values()) {
    try {
      // 拉取服务器所有者信息,自动绕过缓存限制
      const owner = await guild.fetchOwner();
      // 发送嵌入消息
      await owner.send({ embeds: [newsembed] });
    } catch (err) {
      // 统一捕获拉取所有者失败、发送消息失败的异常(比如用户关闭陌生人私信、机器人被拉黑等场景)
      console.error(`处理服务器${guild.id}时出错:`, err);
    }
  }
}

// 调用执行逻辑
sendNewsToAllGuildOwners();
额外注意事项
  • 你原有代码中的.catch(console.error())写法存在错误:你直接调用了console.error(),会在代码执行到该行时立刻打印内容,而非错误触发时执行。正确写法是.catch(console.error)或者.catch(err => console.error(err))。
  • 批量给服务器所有者发私信时注意控制发送频率,避免触发Discord的消息发送速率限制,导致API调用被封禁。
  • 如果你坚持要使用forEach实现异步操作,可以结合Promise.all加map处理所有异步任务,但更推荐上述for...of写法,可读性和错误处理逻辑都更简单清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:15:01