未处理的承诺拒绝 |重启命令

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

阅读更多关于这个非常酷的主题的信息

【讨论】:

不错的指南。很好的复习承诺!

以上是关于未处理的承诺拒绝 |重启命令的主要内容,如果未能解决你的问题,请参考以下文章

使用 useMutation 可能出现未处理的承诺拒绝警告

反应本机中未处理的承诺拒绝错误?

可能未处理的承诺拒绝未定义不是一个函数

如何解决未处理的承诺拒绝?

处理快递申请中未处理的承诺拒绝

NodeJS - 查找未处理的承诺拒绝行