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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:27:35