#javascript #discord #discord.js
Вопрос:
У меня есть массив, который я просматриваю с помощью реакций на встраивание. Когда реакция нажата, сообщение должно быть удалено, и функция повторяется. При втором нажатии на кнопку реакции я получаю эту ошибку:
(node:12908) UnhandledPromiseRejectionWarning: DiscordAPIError: Unknown Message
При каждом реакционном нажатии после первого количество напечатанной ошибки удваивается.
Код:
function movieChoiceEmbed(movies, message, count)
{
pagecount = count;
message.channel.send({embed: {
color: '#D733FF',
title: 'Choose movie',
fields: [
{
name: movies[pagecount].title,
value: movies[pagecount].description,
inline: true,
},
{
name: movies[pagecount 1].title,
value: movies[pagecount 1].description,
inline: true,
},
{
name: 'u200b',
value: 'u200b',
inline: false,
},
{
name: movies[pagecount 2].title,
value: movies[pagecount 2].description,
inline: true,
},
{
name: movies[pagecount 3].title,
value: movies[pagecount 3].description,
inline: true,
},
],
timestamp: new Date(),
footer: {
icon_url: client.user.displayAvatarURL(),
text: 'Andrea Gafa'
}
}})
.then(sentEmbed => {
sentEmbed.react("⏪");
sentEmbed.react("⏩");
})
.catch();
client.on("messageReactionAdd", async (reaction, user) => { // When a reaction is added
if(user.bot) return;
if(reaction.emoji.name == "⏪")
{
await reaction.message.delete();
count -= 4;
movieChoiceEmbed(movies, message, count);
}else if(reaction.emoji.name == "⏩")
{
await reaction.message.delete();
count = 4;
movieChoiceEmbed(movies, message, count);
}
return;
});
}
Вместо этого я попытался удалить последнее сообщение с тем же результатом:
await message.channel.lastMessage.delete();
Есть какие-нибудь зацепки? Я здесь совсем заблудился.
Редактировать:
Проблема, по-видимому, в том, что событие messagereactionadd находится внутри функции. Если поместить его снаружи, это устранит проблему.
Комментарии:
1. Вы уверены, что не удаляли его раньше? Возможно, в другом случае или, возможно, у вас открыто несколько оболочек
2. Спасибо за ваш комментарий, это сообщение нигде не затрагивается за пределами этой функции.
3. Будет ли сообщение удалено в любом случае?
4. Да, последнее сообщение всегда удаляется, поэтому программа технически работает. Проблема в том, что, поскольку количество ошибок удваивается каждый раз, возникает огромная задержка после четвертого удаления и далее.
5. Вы удаляете его несколько раз
Ответ №1:
ваша ошибка в том, что вы получаете обещание, которое не поймано. У вас есть несколько асинхронных вызовов, возвращающих обещания, один или несколько из которых вызывают ошибку. Я бы добавил к ним блоки catch, и тогда это поможет вам определить, в чем заключается ваша проблема. Например:
await reaction.message.delete();
может быть изменен на:
await reaction.message.delete()
.then(() { /* do something if interested */ })
.catch(err => { console.error(err); });
добавьте это ко всем вашим обещанным функциям, и вы будете знать, где у вас возникли проблемы.
Теперь, что касается самой ошибки, вы пытаетесь удалить сообщение, потенциально уже удаленное. Вы хотели удалить реакцию или сообщение? Если вы удалили сообщение, а затем попытались что-то сделать с сообщением в последующих звонках, то в этом и проблема.
Комментарии:
1. thx @MrMythical, я пропустил комментарий…печатаю слишком быстро. 🙂
2. Спасибо за ваш комментарий, я добавил эту часть и теперь могу подтвердить, что проблема возникла из-за удаления сообщения. Ошибка возникает, когда нажата реакция, поэтому, если она не пытается удалить ранее удаленное сообщение, для меня это не имеет особого смысла. И даже тогда я попытался удалить последнее сообщение вместо этого с тем же результатом.