Необработанный отказ от обещания | команда перезапуска
const { MessageEmbed, Guild } = require("discord.js");
const db = require('quick.db');
module.exports = {
config: {
name: "restart",
category: "moderation",
aliases: ["r"],
description: "restarts the bot",
accessableby: "Administrator",
usage: "restart",
},
run: async (bot, message, args) => {
if (!message.author.id === '556247341838106624' ) {
return message.channel.send(`you cant use this!`)
}
await message.guild.channels.cache.find(channel => channel.name === "restart").id
process.exit();
}
}
ОШИБКА:
(узел:6772) UnhandledPromiseRejectionWarning: необработанное отклонение обещания. Эта ошибка возникла либо из-за вызова асинхронной функции без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью.catch(). Чтобы завершить процесс узла при отклонении необработанного обещания, используйте флаг CLI
--unhandled-rejections=strict
(см. https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode).(идентификатор отказа: 1) (узел:6772) [DEP0018] DeprecationWarning: необработанные отклонения обещаний устарели. В будущем необработанные отклонения обещаний завершат процесс Node.js с ненулевым кодом выхода.
1 ответ
Насколько вы знакомы с обещаниями? Обещание может находиться в одном из трех состояний:
- В ожидании
- Выполнено
- Отклонено
Ожидание - это когда выполняется вычисление (скажем, вы пытаетесь получить что-то из базы данных). Оно не выполнено и не отклонено.
Выполняется, если операция прошла успешно. Например, были получены данные.
Отклонено, если что-то пошло не так. Операция не удалась.
Теперь, оглядываясь назад на предупреждение, оно говорит вам, что скрытые необработанные отклонения обещаний устарели. В будущей версии узла это приведет к сбою вашей программы.
Есть два способа обработки обещаний. Либо путем связывания.then с обещанием, либо с помощью метода async await.
Сначала посмотрим на метод.then:
somePromise.then((data) => {
console.log(data);
}).catch((err) => {
console.error(err.message);
});
В этом примере мы связываем.then(). Catch(); к обещанию. Если обещание выполнено (то есть все прошло хорошо), операция внутри.then () будет выполнена. Если обещание отклонено (что означает, что что-то пошло не так), операция внутри.catch() будет выполнена. Catch() "поймает" ошибку. Тогда вы сможете справиться с этим так, как хотите. (Ошибка, печать на консоли и т. Д.)
Асинхронное ожидание
someFunction = async () => {
try {
const somePromise = await someAsyncOperation;
console.log(somePromise);
} catch (err) {
console.log(err.message);
}
};
Этот пример больше похож на ваш реальный код. Обернув ожидание внутри блока try... catch, мы можем сделать то же самое, что и в первом примере. с помощью catch() компилятор JavaScript имеет способ явно сообщить вам, что пошло не так с операцией.
(Обратите внимание, что я написал последний пример, обернутый в асинхронную функцию. Это потому, что использование ключевого слова await разрешено только внутри функций, помеченных как async, тогда как обычная цепочка.then () может использоваться в любом из них.)
Чтобы ответить на ваш вопрос
Теперь вы должны понять, почему вы получаете предупреждение:
await message.guild.channels.cache.find(channel => channel.name === "restart").id
Если это невозможно найти, JavaScript с радостью объяснит вам, почему. Так что в этом случае вам придется заключить его в блок try..catch (или вместо этого использовать обычный синтаксис обещания).
Вы можете узнать больше об этой очень интересной теме на https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise