discord.js如何向其他用户发送私信?报错user.dm is not a function
报错产生原因
触发该报错的核心原因有两点:
- 你代码中定义的
userdm只是纯数字格式的用户ID,不是discord.js框架封装的User类实例,本身不存在send/dm这类实例方法,直接对基础类型值调用方法必然抛出类型错误。 - discord.js v12及之后的正式版本早已移除了旧版的
dm()方法,就算拿到合法的User实例,调用不存在的dm()方法也会触发该类报错。
另外你代码里还存在一个隐蔽bug:Discord的用户ID是18位的雪花ID,超过了JavaScript Number类型的安全整数范围,直接写裸数字会出现精度丢失,最终导致匹配到错误的用户、甚至找不到对应用户。
discord.js 发送私信的正确实现方式
discord.js v12及以上版本(含当前主流的v13、v14)给指定用户发私信的标准流程为:
- 将目标用户ID以字符串格式存储,避免精度丢失
- 通过客户端实例的
users.fetch()方法获取对应ID的User实例(优先读本地缓存,缓存不存在时自动请求Discord API拉取数据) - 调用
User实例上的send()方法发送私信内容 - 增加异常捕获逻辑:如果目标用户关闭了非好友私信权限、屏蔽了机器人,发送操作会抛出异常,不做捕获会导致机器人进程崩溃
修正后的可运行代码如下:
// 注意:消息事件回调需要加async修饰,否则await无法正常使用 client.on('messageCreate', async (message) => { if(message.content.startsWith('s!modöner')) { const mesajöner = args.slice(1).join(' '); // 空内容校验,避免发送空消息 if (!mesajöner) return message.reply('Lütfen göndermek istediğiniz öneri içeriğini yazın.'); const targetUserId = '767387717792563241'; try { // 拉取目标用户实例 const targetUser = await message.client.users.fetch(targetUserId); // 发送私信 await targetUser.send(`Yeni mod önerisi:\n${mesajöner}\nÖneren: ${message.author.tag} (${message.author.id})`); message.reply('Quixe Öneriniz Gönderildi.'); } catch (err) { console.error('Öneri gönderme başarısız:', err); message.reply('Öneriniz gönderilemedi, daha sonra tekrar deneyiniz.'); } } })
补充说明:如果机器人和目标用户不在同一个服务器,是没有权限给对方发私信的,这也是常见的发送失败原因。
内容的提问来源于stack exchange,提问作者QuiX
相关产品推荐
相关产品推荐

