discord.js v13如何向用户发送DM?调用send方法报错如何解决
问题场景
尝试编写代码给自己发送DM验证功能可用性,初始实现代码如下:
client.users.cache.get(id).send('hi')
运行代码时抛出报错:TypeError: Cannot read properties of undefined (reading 'send'),初步判断是自身用户信息未进入缓存,需要确认该功能的正确实现逻辑。
报错原因
你的判断是准确的。client.users.cache 是discord.js的用户缓存池,仅存储bot启动后已经产生过交互、或者被主动拉取过的用户数据,不会默认加载全平台所有用户信息。如果目标用户从未和bot产生过交互、也没有被主动拉取过数据,cache.get(id) 就会返回undefined,后续调用send方法自然会触发类型错误。
正确实现方案
不要直接依赖缓存读取用户数据,使用fetch方法获取用户对象即可:该方法会优先查询本地缓存,缓存命中时直接返回缓存数据,缓存未命中时会主动向Discord接口发起请求拉取对应用户数据,拉取成功后会自动将用户数据写入缓存,后续可直接从缓存读取。
完整可运行示例:
// 注意需要在异步函数/异步回调中执行,比如message事件、ready事件回调前加async关键字 const targetUserId = "替换为你自己的用户ID"; try { // 拉取目标用户数据 const targetUser = await client.users.fetch(targetUserId); // 发送私信 await targetUser.send("hi"); console.log("私信发送成功"); } catch (error) { // 捕获发送失败的场景:比如用户关闭私信权限、bot被拉黑、用户ID错误等 console.error("私信发送失败:", error); }
如果你的需求是固定给bot的所有者发私信,不需要硬编码用户ID,可以直接拉取应用所有者信息实现:
// 在client触发ready事件后执行 const appInfo = await client.application.fetch(); const appOwner = await appInfo.owner.fetch(); await appOwner.send("hi");
注意:所有涉及接口请求的方法都建议加try/catch异常捕获,避免因为权限不足、ID错误、网络波动等问题导致进程崩溃。
内容的提问来源于stack exchange,提问作者ryguy10712
相关产品推荐
相关产品推荐

