discord.js机器人发送私信报错TypeError: user.send is not a function求助
Discord.js 机器人发送私信报错解决方案
报错原因分析
TypeError: user.send is not a function- 未用
await处理client.users.fetch()的异步操作,拿到的是Promise而非User对象; - 获取到的是
PartialUser(不完整用户对象),该对象没有send方法。
- 未用
TypeError: Cannot read properties of undefined (reading 'send')client.users.cache.get()仅能获取机器人近期交互过的用户,目标用户不在缓存中时会返回undefined。
TypeError: Cannot read properties of null (reading 'id')client.users.send()方法在discord.js v13及以上版本已被移除,不再支持这种直接调用方式。
正确实现方法
用异步函数配合fetch获取完整用户对象,示例代码如下:
async function sendDirectMessage(userId, messageContent) { try { // 强制获取完整用户对象,避免PartialUser问题 const targetUser = await client.users.fetch(userId, { force: true }); await targetUser.send(messageContent); console.log('私信发送成功'); } catch (error) { console.error('发送失败:', error.message); // 常见失败场景:用户关闭私信权限、无共同服务器、用户不存在 } } // 调用示例 sendDirectMessage('目标用户ID', 'hello!');
关键注意事项
- 异步处理:
client.users.fetch()是异步操作,必须用await或.then()处理,确保拿到完整User对象后再调用send。 - 缓存限制:不要依赖
users.cache获取用户,缓存仅存储机器人近期交互过的用户,非缓存用户必须通过fetch获取。 - API限制:Discord不允许机器人给从未交互过(无共同服务器、未主动发消息给机器人)的用户发送私信,此类场景会触发权限错误。
- 版本适配:确保使用的discord.js版本语法正确,v14版本需注意Intents配置(至少开启
Guilds)。
内容的提问来源于stack exchange,提问作者8823min
相关产品推荐
相关产品推荐

