Discord机器人JS代码运行报错Cannot send messages to this user如何解决
报错产生原因
- 核心触发原因:你调用
msg.author.send()向用户发私信时,用户侧限制了私信接收:要么关闭了当前服务器的私信接收权限,要么拉黑了机器人,要么用户账号处于异常状态无法接收消息,Discord API拒绝了发信请求返回错误。 - 代码本身存在语法错误:第一个
MessageEmbed实例的addField方法调用不合法,你写的.addField("Unchecked)存在符号不匹配、参数缺失的问题,addField要求至少传入字段名称、字段值两个必填参数,同时引号/反引号需要正确闭合,该语法问题也可能导致对象生成异常,触发发信失败。 - 缺少Promise错误捕获逻辑:
msg.author.send()是异步方法返回Promise,你没有添加catch回调处理reject情况,所以错误抛出后变成未处理的Promise拒绝报错。
可行修复方案
- 先修正Embed的语法错误,补全
addField的参数,闭合符号 - 给私信发送逻辑添加错误捕获,遇到无法发DM的情况做降级提示,避免未捕获报错
- 可以在降级提示里告知用户需要开启服务器私信权限后再重试
修复后的完整代码参考:
// 修正第一个Embed的语法错误 let embed = new Discord.MessageEmbed() .addField("DJ", `https://discord.gg/microsoft`) .addField("状态", "Unchecked") // 补全参数、闭合符号,可根据实际需求调整字段内容 .setColor("#363940") .setTimestamp(); // 给send方法添加catch捕获错误 msg.author.send(embed) .catch(err => { // 捕获到无法发DM的错误时,直接在频道提示用户 msg.reply("无法向你发送私信,请检查你是否开启了本服务器的私信接收权限,且未拉黑机器人").then(m => { setTimeout(() => m.delete(), 15000); }); return; // 出错时可中断后续逻辑,不需要的话可删除该行 }); let xd = new Discord.MessageEmbed() .setColor("#ff0000") .setTitle("CHECK YOUR DM") .setThumbnail("https://cdn.discordapp.com/attachments/773133136929226763/797204521997828106/777514274829893683.gif") .setFooter("DJ") .setTimestamp() .setDescription("I've sent you") msg.reply(xd).then(m => { setTimeout(() => { m.delete(); }, 900000); }); cooldown.add(msg.author.id); setTimeout(() => { cooldown.delete(msg.author.id); }, config.COOLDOWN * 60 * 1000);
内容的提问来源于stack exchange,提问作者DJ18
相关产品推荐
相关产品推荐

