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

Discord.js中使用send函数发送私信报错TypeError: Cannot read property 'send' of undefined的问题求助

解决Discord.js中无法发送私信的TypeError问题

首先,你的错误根源很明确:你用了用户名+标签(KillerHK#3150)来调用client.users.cache.get(),但这个方法只接受用户的Snowflake ID作为参数,所以找不到用户,返回undefined,自然调用.send()就会抛出Cannot read property 'send' of undefined的错误。

下面是具体的解决步骤:

1. 使用用户ID代替用户名标签

client.users.cache.get()的参数必须是用户的唯一数字ID(也就是Discord的Snowflake ID),而不是用户名#标签格式的字符串。

如何获取用户ID?

  • 打开Discord的开发者模式:用户设置 → 高级 → 开启"开发者模式"
  • 右键目标用户的头像或名字,选择"复制ID"

修改你的代码为:

// 替换成你复制到的用户实际ID
const user = client.users.cache.get('123456789012345678');
if (user) {
  user.send('hello there')
    .catch(err => console.error('发送私信失败:', err));
} else {
  console.log('用户不在缓存中,尝试从API获取');
}

2. 处理用户不在缓存中的情况

如果目标用户从未和你的机器人互动过(比如没发过消息、没加入机器人所在的服务器),它不会出现在client.users.cache里。这时候你需要用client.users.fetch()从Discord API拉取用户信息:

// 用async/await写法更清晰
async function sendDM() {
  try {
    const user = await client.users.fetch('123456789012345678');
    await user.send('hello there');
    console.log('私信发送成功');
  } catch (err) {
    console.error('发送失败:', err);
    // 常见错误原因:用户屏蔽了机器人,或机器人无法给该用户发消息
  }
}

sendDM();

3. 如果是在消息事件中触发私信(更简单的方式)

看你已经配置了message事件处理器,如果你的私信是在用户触发命令时发送,直接用message.author.send()就可以,不需要手动查找用户:

client.on('message', message => {
  if (!message.content.startsWith(prefix) || message.author.bot) return;

  // 示例:当用户发送!dm时,给用户发私信
  if (message.content === `${prefix}dm`) {
    message.author.send('hello there')
      .catch(err => console.error('发送私信失败:', err));
  }
});

额外注意事项

  • 确保你的机器人没有被目标用户屏蔽
  • 机器人需要有权限在服务器中发送消息(不过私信不需要服务器权限,只要用户允许接收)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 04:19:05