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

Discord.js机器人发送DM报错:Cannot read property 'send' of undefined

解决Discord.js中Cannot read property 'send' of undefined的问题

这个问题我之前开发Discord机器人时也碰到过,核心原因很明确:你代码里的user变量是undefined——也就是说机器人的用户缓存里找不到你指定ID的用户,所以调用user.send()时才会抛出这个错误。

为什么会出现这个问题?

Discord.js的users.cache只会存储机器人已经有过交互的用户(比如在同一个服务器、和机器人聊过DM的用户)。如果你的账号和机器人没有任何互动,机器人启动时不会自动把你的账号信息加载到缓存里,这时候用cache.get()自然拿不到有效的用户对象。

另外你代码里还有个小bug:args[1-100]是错误的语法——1-100会被计算成-99,相当于你在取数组的第-99项,这肯定拿不到任何内容,应该改成获取所有参数的拼接字符串。

解决方案

我们需要用users.fetch()方法主动从Discord API拉取用户信息(不管缓存里有没有),同时处理异步操作和可能的错误:

修改你的report命令代码如下:

// 注意:如果你的switch所在的函数不是async,需要把它改成async函数
case 'report':
  await message.channel.bulkDelete(1);
  await message.channel.send('report sent');
  
  // 正确获取所有举报内容
  const reportContent = args.slice(0).join(' ');
  console.log(`An issue was reported by ${message.author.username} in ${message.channel.name}, ${message.guild.name}: ${reportContent}`);
  
  try {
    // 主动从API拉取用户信息,代替从缓存获取
    const owner = await bot.users.fetch('698238773657483344'); // 替换为你的真实用户ID
    await owner.send(`An issue was reported by ${message.author.username} in ${message.channel.name}, ${message.guild.name}:\n${reportContent}`);
  } catch (error) {
    // 捕获发送失败的错误,避免机器人崩溃
    console.error('发送举报DM失败:', error);
    await message.channel.send('抱歉,发送你的举报时出现错误,请稍后重试。');
  }
  break;

关键修改点说明

  1. 用users.fetch()替代cache.get():fetch()会直接调用Discord API获取用户信息,不受缓存限制,能确保拿到有效的用户对象。
  2. 处理异步操作:fetch()和send()都是异步方法,需要用await等待它们完成(前提是所在函数是async函数)。
  3. 错误捕获:加入try/catch块,处理比如用户关闭DM、机器人被拉黑等发送失败的情况,避免整个命令崩溃。
  4. 正确获取举报内容:用args.slice(0).join(' ')把所有参数拼接成完整字符串,代替错误的args[1-100]。
  5. 模板字符串优化:用${变量}的模板字符串代替字符串拼接,代码更简洁易读。

额外注意事项

  • 确保你的机器人有发送DM的权限,且目标用户没有关闭“来自服务器成员的DM”权限。
  • 不要在代码顶部提前定义user变量,因为机器人启动时缓存还未加载目标用户,应该在需要发送DM时再动态获取。
  • 确认你使用的用户ID是正确的(注意是用户ID,不是服务器ID或频道ID)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:07:51