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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:27:05