Discord.js v14机器人频道发消息权限校验问题排查
Discord机器人权限校验失效导致崩溃问题
我已经花了好几天尝试解决这个问题,一直没找到可行方案。我的Discord机器人不仅没返回预期结果,反而直接崩溃了。
我使用的权限校验及相关代码:
if (message.guild.members.me.permissions.has(PermissionsBitField.Flags.SendMessages)) { try { if (message.content.toLowerCase().startsWith(prefix) && !Icommand){ message.channel.send(`Use b.help in the commands channel.`); } if (!Icommand) return; try { Icommand.execute(message, args, mention, client, PermissionsBitField); } catch (error) { console.error(error); message.reply('This command could not be run! The Dev has been notified.'); } } catch (error) { console.log(error); return } } else return
报错信息:
/home/pi/british-bot/node_modules/discord.js/src/rest/RequestHandler.js:350 throw new DiscordAPIError(data, res.status, request); ^ DiscordAPIError: Missing Permissions at RequestHandler.execute (/home/pi/british-bot/node_modules/discord.js/src/rest/RequestHandler.js:350:13) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async RequestHandler.push (/home/pi/british-bot/node_modules/discord.js/src/rest/RequestHandler.js:51:14) at async TextChannel.send (/home/pi/british-bot/node_modules/discord.js/src/structures/interfaces/TextBasedChannel.js:175:15) { method: 'post', path: '/channels/1001430667416064050/messages', code: 50013, httpStatus: 403, requestData: { json: { content: 'Pong.', tts: false, nonce: undefined, embeds: undefined, components: undefined, username: undefined, avatar_url: undefined, allowed_mentions: undefined, flags: 0, message_reference: { message_id: '1017162983622848512', fail_if_not_exists: true }, attachments: undefined, sticker_ids: undefined }, files: [] } }
问题原因及解决方法:
- 核心问题:当前代码只校验了机器人在服务器层面的发送消息权限,但没校验机器人在当前频道的发送权限。即便服务器层面有权限,单个频道的权限设置仍可能限制机器人发送消息,导致API调用失败抛出错误。
- 修复步骤:
- 替换服务器层面的权限校验为频道层面校验:
// 替换原有的 guild 权限校验为频道权限校验 if (message.channel.permissionsFor(message.guild.members.me).has(PermissionsBitField.Flags.SendMessages)) { // 后续逻辑保持不变 } else return - 处理命令报错中的二次权限问题:原代码里的
message.reply也可能因权限问题触发错误,建议先校验权限再发送:catch (error) { console.error(error); if (message.channel.permissionsFor(message.guild.members.me).has(PermissionsBitField.Flags.SendMessages)) { message.reply('This command could not be run! The Dev has been notified.'); } } - 增加全局错误捕获:避免单个未处理的错误导致整个机器人崩溃:
process.on('unhandledRejection', error => { console.error('未处理的Promise拒绝:', error); });
- 替换服务器层面的权限校验为频道层面校验:
内容的提问来源于stack exchange,提问作者rhys jones
相关产品推荐
相关产品推荐

