discord.js机器人向无发信权限频道发消息后崩溃如何修复
问题根因
你遇到的崩溃是由于调用channel.send()方法时,机器人缺少对应频道的发送消息权限,且该异步方法抛出的错误没有被捕获,直接导致Node.js进程终止。
注意:你使用的discord.js v13版本中,
message事件已被废弃,建议替换为messageCreate事件,避免消息无法正常触发的问题。
修复方案
两种方案可以搭配使用,兜底保证不会崩溃:
方案1:发送消息前先校验权限
在执行发送逻辑前,先判断机器人在当前频道的权限,无权限直接终止操作:
client.on('messageCreate', msg => { // 跳过机器人自身发送的消息,避免死循环 if (msg.author.bot) return; if (msg.content === 'floppa') { // 仅在服务器频道校验权限,私信频道无需校验 if (msg.guild) { const hasSendPerm = msg.guild.me.permissionsIn(msg.channel).has(Permissions.FLAGS.SEND_MESSAGES); if (!hasSendPerm) return; } const imageNumber = files[Math.floor(Math.random()*files.length)]; msg.channel.send({files: ["./floppa/" + imageNumber]}); } });
方案2:捕获发送操作的异步错误
channel.send()返回Promise对象,添加catch捕获错误即可避免进程崩溃,即使出现权限不足或其他发送失败问题,只会打印日志不会终止运行:
msg.channel.send({files: ["./floppa/" + imageNumber]}) .catch(err => { console.error(`频道 ${msg.channel.id} 发送消息失败:`, err.message); });
额外全局稳定性优化
可以添加全局未捕获Promise错误监听,兜底处理所有未捕获的异步错误,避免其他未知场景导致崩溃:
// 放在代码入口位置即可 process.on('unhandledRejection', (err) => { console.error('未处理的异步错误:', err); });
内容的提问来源于stack exchange,提问作者Mocar 2D
相关产品推荐
相关产品推荐

