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;
关键修改点说明
- 用
users.fetch()替代cache.get():fetch()会直接调用Discord API获取用户信息,不受缓存限制,能确保拿到有效的用户对象。 - 处理异步操作:
fetch()和send()都是异步方法,需要用await等待它们完成(前提是所在函数是async函数)。 - 错误捕获:加入
try/catch块,处理比如用户关闭DM、机器人被拉黑等发送失败的情况,避免整个命令崩溃。 - 正确获取举报内容:用
args.slice(0).join(' ')把所有参数拼接成完整字符串,代替错误的args[1-100]。 - 模板字符串优化:用
${变量}的模板字符串代替字符串拼接,代码更简洁易读。
额外注意事项
- 确保你的机器人有发送DM的权限,且目标用户没有关闭“来自服务器成员的DM”权限。
- 不要在代码顶部提前定义
user变量,因为机器人启动时缓存还未加载目标用户,应该在需要发送DM时再动态获取。 - 确认你使用的用户ID是正确的(注意是用户ID,不是服务器ID或频道ID)。
内容的提问来源于stack exchange,提问作者Dinty
相关产品推荐
相关产品推荐

