首页 > 解决方案 > 未处理的承诺拒绝 | 重启命令

问题描述

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() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志--unhandled-rejections=strict (请参阅https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。(拒绝 id:1)(节点:6772)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

标签: javascriptnode.jsunhandled-promise-rejection

解决方案


你对承诺有多熟悉?承诺可以处于以下三种状态之一:

  • 待办的
  • 已完成
  • Rejected

    Pending是在进行计算时(假设您尝试从数据库中获取某些内容)它既不满足也不拒绝。
    Fulfilled是操作是否成功。例如,数据被提取。
    拒绝是如果出现问题。操作失败。

    现在,回顾一下这个警告,它告诉你,默默地未处理的 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 编译器可以明确地告诉您操作出了什么问题。

(注意我写了最后一个例子,包裹在 async 函数中。这是因为关键字 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


推荐阅读