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
相关产品推荐
相关产品推荐

