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
相关产品推荐
相关产品推荐

