discord.js发送私信时报TypeError: Cannot read property 'send' of undefined如何解决
问题原因
该报错的核心是client.users.cache.get('用户ID')没有获取到目标用户对象,返回了undefined,调用send方法自然触发报错。
修复方案
1. 补充必要的权限与意图
第一步:开启开发者后台特权权限
进入Discord开发者平台的对应Bot管理页,找到Privileged Gateway Intents区域,开启以下两个选项:
- Server Members Intent
- Message Content Intent
第二步:修改代码中的意图与部分配置
你当前仅配置了GUILDS单一意图,缺少获取用户、发送私信所需的必要配置,修改客户端实例化代码:
// 修改前 // const client = new Client({ intents: [Intents.FLAGS.GUILDS] }); // 修改后 const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MEMBERS, Intents.FLAGS.DIRECT_MESSAGES ], // 处理私信频道的partial特性,避免私信频道识别失败 partials: ['CHANNEL'] });
2. 替换缓存获取为主动拉取用户
本地缓存不一定会存储所有目标用户的数据,不要直接依赖cache.get获取用户,改为主动调用fetch接口拉取,同时增加异常捕获:
client.once('ready', async () => { console.log('Ready'); try { // 主动拉取用户数据,不走本地缓存 const targetUser = await client.users.fetch('877248726085828720'); await targetUser.send('yo'); console.log('私信发送成功'); } catch (e) { console.error('发送失败,错误信息:', e); // 常见失败场景:用户ID填写错误、用户关闭了陌生人私信权限、用户与机器人无共同服务器 } });
后续批量发送的注意事项
- 读取两个文本文件时,先校验二者行数完全一致,再将用户名与URL一一绑定为映射关系,避免发错内容
- 通过带#后缀的用户名匹配用户时,遍历机器人已加入服务器的成员列表,匹配
user.tag字段获取对应用户对象,不要尝试全局搜索用户 - 批量发送时增加间隔(建议每次发送间隔1~2秒),避免触发Discord的反垃圾机制,导致账号被限制
- 所有发送操作都增加异常捕获,单独记录发送失败的用户清单,后续可以手动补发
内容的提问来源于stack exchange,提问作者Andrew Simon
相关产品推荐
相关产品推荐

