Discord.js V13 执行purge清空成员消息命令完成后报错如何修复
错误原因分析
报错代码10008属于Discord API的未知消息错误,触发原因是你尝试删除一条已经不存在的消息,常见触发点有两个:
- 代码开头设置了3.5秒后删除用户触发命令的消息,但后续批量删除操作可能已经提前把这条消息删掉了,等到定时任务执行时就会因为找不到消息抛出错误
- 手动循环删除消息的逻辑没有做错误捕获,遇到已经被其他操作删除、或是超出14天无法删除的消息时,就会抛出未处理的异常
另外你当前用循环单条删消息的逻辑效率很低,还很容易触发Discord的API请求频率限制。
修复方案
- 给所有删除消息的操作添加错误捕获,吞掉消息不存在的异常,避免程序崩溃
- 替换手动循环删除逻辑为discord.js内置的
bulkDelete批量删除方法,该方法会自动过滤无法删除的消息(已删除、超14天等),执行效率更高还不会触发频率限制 - 把传入的删除数量参数转成数字类型,避免逻辑异常
完整修复后代码
const Discord = require('discord.js'); const { Permissions } = require('discord.js'); const { MessageEmbed } = require("discord.js") module.exports = { description: 'purge command', run: async (client, message, args) => { // 给删除命令消息的操作加错误捕获,避免消息已被删除时报错 setTimeout(() => message.delete().catch(err => {}), 3500); if (message.member.permissions.has(Permissions.FLAGS.KICK_MEMBERS)) { let purgeMember = message.mentions.users.first() let amount = Number(args[1]) if (!purgeMember) return message.channel.send("Please Mention a Member to purge").then(msg => { setTimeout(() => msg.delete().catch(err => {}), 4000) }) if (!amount || isNaN(amount)) return message.channel.send("Please provide a valid number to purge").then(msg => { setTimeout(() => msg.delete().catch(err => {}), 4000) }) if (amount > 99) return message.channel.send("I can delete upto 100 messages only").then(msg => { setTimeout(() => msg.delete().catch(err => {}), 4000) }) let AllMessages = await message.channel.messages.fetch() let FilteredMessages = AllMessages.filter(x => x.author.id === purgeMember.id).first(amount) // 使用内置批量删除方法,第二个参数为true自动过滤无法删除的消息,加错误捕获 await message.channel.bulkDelete(FilteredMessages, true).catch(err => {}) } else { message.channel.send('🛡️ | You DONT have permission to use this command!').then(msg => { setTimeout(() => msg.delete().catch(err => {}), 5000) }) } }, }
内容的提问来源于stack exchange,提问作者Jacy Harrington
相关产品推荐
相关产品推荐

