javascript - 我似乎找不到 DiscordAPIError: Unknown Message 的解决方案
问题描述
我正在使用 discord.js v13,我得到的提示是我可能在message.delete()
功能上有问题。但是,我尝试将其包围在 a 中,try/catch statement
但仍然出现错误。我不确定它是如何触发的,但它仍然会删除该消息,但仍使该消息对作者可见。
我的代码:
if(message.content.startsWith(PREFIX)) {
if(message.channel.id != ChannelID) return message.channel.send({ embeds: [wrongChannel] }) && message.delete({ timeout: 1000 });
switch(args[0]) {
case "help":
client.commands.get('help').run(client, message);
break;
case "ping":
client.commands.get('ping').run(client, message, args);
break;
case "ban":
client.commands.get('ban').run(client, message, args);
break;
case "kick":
client.commands.get('kick').run(client, message, args);
break;
case "mute":
client.commands.get('mute').run(client, message, args);
break;
default:
message.channel.send({ embeds: [err] });
try {
await message.delete({ timeout: 1000 });
} catch (e) {
console.error(e);
}
}
try {
await message.delete({ timeout: 1000 });
} catch (e) {
console.error(e);
}
}
错误:
DiscordAPIError: Unknown Message
at RequestHandler.execute (D:\Discord Bots\test\node_modules\discord.js\src\rest\RequestHandler.js:298:13)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async RequestHandler.push (D:\Discord Bots\test\node_modules\discord.js\src\rest\RequestHandler.js:50:14)
at async MessageManager.delete (D:\Discord Bots\test\node_modules\discord.js\src\managers\MessageManager.js:205:5)
at async Message.delete (D:\Discord Bots\test\node_modules\discord.js\src\structures\Message.js:709:5)
at async Client.<anonymous> (D:\Discord Bots\test\index.js:72:13) {
method: 'delete',
path: '/channels/891701894559461407/messages/891720458859331585',
code: 10008,
httpStatus: 404,
requestData: { json: undefined, files: [] }
}
这是为了检查命令是否在错误的频道中执行,然后它将向他们发送我制作的嵌入并删除消息。如果不是,但他们已经正确输入了命令,在正确输入后它将被删除,反之亦然。输入错误后,它将发送嵌入并将其删除。如果没有 try/catch,它只会让作者看到它并使机器人崩溃。但是使用 try/catch 它只会发送错误然后使消息对作者可见,但对其他人不可见。这意味着它可以工作并且确实会删除,而不是对作者并抛出该错误。
解决方案
default:
message.channel.send({ embeds: [err] });
// first try/catch
try {
await message.delete({ timeout: 1000 });
} catch (e) {
console.error(e);
}
}
// second try/catch
try {
await message.delete({ timeout: 1000 });
} catch (e) {
console.error(e);
}
}
在第一个try/catch
块中,default
您的switch
语句的情况是删除message
如果不满足上述条件。那也行。该代码有效并且message
成功删除。
但是在第二个中,您正在尝试delete
相同message
的 . 但是,它不再存在,因为default
switch 块中的情况将始终 delete
存在,因此没有对它的引用,并且 Discord 抛出一个DiscordAPIError
. 因此,您不能message.delete()
再次调用。
要修复它,只需删除第二个try/catch
块:
if(message.content.startsWith(PREFIX)) {
if(message.channel.id != ChannelID) return message.channel.send({ embeds: [wrongChannel] }) && message.delete({ timeout: 1000 });
switch(args[0]) {
case "help":
client.commands.get('help').run(client, message);
break;
case "ping":
client.commands.get('ping').run(client, message, args);
break;
case "ban":
client.commands.get('ban').run(client, message, args);
break;
case "kick":
client.commands.get('kick').run(client, message, args);
break;
case "mute":
client.commands.get('mute').run(client, message, args);
break;
default:
// will always delete if conditions aren't met
message.channel.send({ embeds: [err] });
try {
await message.delete({ timeout: 1000 });
} catch (e) {
console.error(e);
}
}
让我知道这是否可行。
编辑:如果您希望机器人删除用户消息而不考虑正确性
if(message.content.startsWith(PREFIX)) {
if(message.channel.id != ChannelID) return message.channel.send({ embeds: [wrongChannel] }) && message.delete({ timeout: 1000 });
switch(args[0]) {
case "help":
client.commands.get('help').run(client, message);
break;
case "ping":
client.commands.get('ping').run(client, message, args);
break;
case "ban":
client.commands.get('ban').run(client, message, args);
break;
case "kick":
client.commands.get('kick').run(client, message, args);
break;
case "mute":
client.commands.get('mute').run(client, message, args);
break;
default:
message.channel.send({ embeds: [err] });
}
// will always delete
try {
await message.delete({ timeout: 1000 });
} catch (e) {
console.error(e);
}
推荐阅读
- excel - 输入框作为下拉列表(组合框)
- javascript - 在特定元素中向下滚动
- wcf - 大文件传输时 WCF 内存泄漏
- linkedin - LinkedIn JavaScript SDK“您必须指定一个有效的 JavaScript API 域作为此密钥配置的一部分。”
- clipboard.js - Clipboard.js 不适用于小测试
- swift - Apollo-IOS 构建错误“Command PhaseScriptExecution failed with a nonzero exit code”
- ms-access - 访问 VBA - 无法访问图表中的 Series.Name
- java - 如何修复 Java Build Path 中的 SRC 文件夹?
- java - Java检测应用程序何时关闭
- reactjs - 如果计数器超过 10,如何更改文本颜色