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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:54:35