未处理的承诺拒绝 |重启命令
Posted
技术标签:
【中文标题】未处理的承诺拒绝 |重启命令【英文标题】:Unhandled promise rejection | restart command 【发布时间】:2021-03-08 20:44:57 【问题描述】: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();
错误:
(node:6772) UnhandledPromiseRejectionWarning: 未处理的承诺 拒绝。此错误源于在异步内部抛出 在没有 catch 块的情况下运行,或者通过拒绝一个承诺 不使用 .catch() 处理。终止未处理的节点进程 承诺拒绝,使用 CLI 标志
--unhandled-rejections=strict
(见https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝 ID:1)(节点:6772)[DEP0018] DeprecationWarning:未处理 不推荐使用承诺拒绝。在未来,承诺拒绝 未处理的将终止 Node.js 进程 非零退出代码。
【问题讨论】:
您好,欢迎来到 ***,在这里可以找到一些关于如何提出好问题的信息:***.com/help/how-to-ask。还请使用反引号格式化代码块(请参阅文本编辑器)。最后,您的问题是什么?您尝试解决什么问题?exports.run
返回一个承诺。 如果调用者没有处理它的拒绝,或者await
操作符不在try/catch
块中,那么找不到名为restart
的频道将产生错误。现在,问题是什么?
【参考方案1】:
你对 Promise 的熟悉程度如何?承诺可以处于以下三种状态之一:
待处理 已完成 被拒绝 Pending 是在进行计算时(假设您尝试从数据库中获取某些内容)它既没有完成也没有被拒绝。Fulfilled 是如果操作成功。例如,数据已提取。Rejected 表示出现问题。操作失败。 现在,回顾一下这个警告,它告诉你,默默地未处理的 Promise 拒绝被弃用了。在未来的节点版本中,这将导致您的程序崩溃。 有两种处理 Promise 的方法。通过将 .then 链接到 Promise 或使用异步等待方法。先看.then方法:
somePromise.then((data) =>
console.log(data);
).catch((err) =>
console.error(err.message);
);
在这个例子中,我们链接了 .then().catch();到承诺。如果 promise 被实现(意味着一切顺利), .then() 内部的操作将被执行。如果 promise 被拒绝(意味着出现问题),将执行 .catch() 内部的操作。 catch() 将“捕获”错误。然后,您就可以按照您希望的方式处理它。 (Thow 错误,打印到控制台等)
异步等待
someFunction = async () =>
try
const somePromise = await someAsyncOperation;
console.log(somePromise);
catch (err)
console.log(err.message);
;
此示例看起来更像您的实际代码。通过将 await 包装在 try...catch 块中,我们可以执行与第一个示例相同的操作。通过使用 catch(),javascript 编译器可以明确告诉您操作出了什么问题。(请注意,我写的最后一个示例包装在异步函数中。这是因为使用关键字await 只允许在标记为 async 的函数内部使用,而普通的 .then() 链可以在任何一个中使用。)
回答你的问题
您现在应该能够弄清楚收到警告的原因:
await message.guild.channels.cache.find(channel => channel.name === "restart").id
如果找不到,JavaScript 很乐意告诉您原因。因此,在这种情况下,您必须将其包装在 try..catch 块中(或者改用常规的 Promise 语法。) 您可以在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
阅读更多关于这个非常酷的主题的信息【讨论】:
不错的指南。很好的复习承诺!以上是关于未处理的承诺拒绝 |重启命令的主要内容,如果未能解决你的问题,请参考以下文章