如何检查消息是不是存在? (discord.js)
Posted
技术标签:
【中文标题】如何检查消息是不是存在? (discord.js)【英文标题】:How to check if a message exists? (discord.js)如何检查消息是否存在? (discord.js) 【发布时间】:2021-04-18 08:06:24 【问题描述】:我在这里有一个嵌入管理器,我想检查嵌入是否存在。我在发送后删除它,如果其他人在此之前删除它,我会收到 DiscordAPI 错误。我尝试了几件事,但从未得到解决方案。你能帮忙吗?
这是我的代码:
error(channel, title, content)
var message
var embed = new MessageEmbed()
.setColor(COLORS.red)
.setDescription(content)
if(title)
embed.setTitle(title)
channel.send(' ', embed).then((m) =>
message = m
try
setTimeout(function()
if(MESSAGE EXISTS)
m.delete()
else
return;
, 5500);
catch(e)
)
return message
,
已编辑:
error(channel, title, content)
var message
var embed = new MessageEmbed()
.setColor(COLORS.red)
.setDescription(content)
if(title)
embed.setTitle(title)
channel.send(' ', embed).then((m) =>
message = m
try
setTimeout(function()
try
channel.messages.fetch(m.id)
.then(m => console.log(m.content)) //it fetched the message - good
catch (error)
console.log(error)
, 5500);
catch(e)
)
return message
,
堆栈跟踪:
DiscordAPIError: Unknown Message
at RequestHandler.execute (D:\Discord Bot\node_modules\discord.js\src\rest\RequestHandler.js:154:13)
at processTicksAndRejections (node:internal/process/task_queues:93:5)
at async RequestHandler.push (D:\Discord Bot\node_modules\discord.js\src\rest\RequestHandler.js:39:14)
at async MessageManager._fetchId (D:\Discord Bot\node_modules\discord.js\src\managers\MessageManager.js:135:18)
method: 'get',
path: '/channels/797648418104934470/messages/798863571924418562',
code: 10008,
httpStatus: 404
npm ERR! code 1
npm ERR! path D:\Discord Bot
npm ERR! command failed
npm ERR! command C:\Windows\system32\cmd.exe /d /s /c node main.js debug
【问题讨论】:
【参考方案1】:API 错误是由于不和谐试图删除不存在的消息(您已经将其删除)引起的。尝试通过在 try catch 语句中获取嵌入的 id 来解决承诺,然后从那里开始 - 这样可以避免 API 错误。
try
channel.messages.fetch(message.id)
.then(message => console.log(message.content)) //it fetched the message - good
catch (error)
return; //the message no longer exists and will be ignored
【讨论】:
感谢您的回答。我已经尝试多次获取消息,但我失败了。你能帮忙吗? 当然,我会编辑我的答案以提出修复建议,请稍等 我会试试的。 非常感谢!错误现在被捕获,我的机器人没有崩溃 太棒了!请点击左侧的勾号标记答案为正确【参考方案2】:不要让它变得比需要的更困难。 .send
、.fetch
和 .delete
都返回一个承诺。这意味着您可以(并且应该)使用catch
方法来捕获任何错误。您不需要使用 try-catch 块,除非您想使用 async/await
而不是 .then/catch
。
检查下面的代码,我已经添加了所有catch
es。检查当消息不存在时(检查err.httpStatus
)或由于任何其他原因无法删除消息时它如何捕获错误。
channel.send(embed)
.then((sentMessage) =>
setTimeout(() =>
channel.messages
.fetch(sentMessage.id)
.then((fetchedMessage) =>
console.log('Message exists');
fetchedMessage
.delete()
.then(() => console.log('Message deleted successfully'))
.catch((err) => console.log('Could not delete the message', err));
)
.catch((err) =>
if (err.httpStatus === 404)
console.log('Message already deleted');
else
console.log(err);
);
, 5000);
);
【讨论】:
【参考方案3】:所以我遇到了类似的问题,我认为我的解决方案可能适用于您的问题。
function msgExists(channelID, messageID)
/*get channel*/
const channel = client.channels.cache.get(channelID); //(get channel)
/*get channel messages*/
channel.messages.fetch( limit: 100 ).then(messages =>
let count = 0;
let max = (messages.length - 1);
//Iterate through the messages.
messages.forEach(message =>
if (messageID === message.id)
console.log("message found");
if (count == (max))
console.log("message could not be found");
count++;
);
);
【讨论】:
以上是关于如何检查消息是不是存在? (discord.js)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Discord.js 检查消息作者是不是具有管理员角色?
如何检查具有特定角色的成员是不是存在于 discord.js 的特定语音通道中