Как исправить «необработанную ошибку отклонения обещания» в обработке ошибок try / catch

#javascript #node.js

#javascript #node.js

Вопрос:

Я пытаюсь использовать slack devkit, расположенный здесь (https://slack.dev/node-slack-sdk/webhook ) для отправки строк по разным каналам slack. Я просто пытаюсь включить обработку ошибок try / catch для отправки в статический канал в случае сбоя переменной webhook.

Я перепробовал все различные варианты try / catch, но я не могу заставить какой-либо код catch работать должным образом. Логика try работает нормально и, как и ожидалось. Я новичок в javascript / nodejs, так что, вероятно, это глупая ошибка с моей стороны. Я определил как SLACK_WEBHOOK_URL, так и SLACK_MONITORING_URL вне этого фрагмента

 const TOTAL_GHE_ISSUES = "10" //pulled from DB
const GHE_ISSUE_NUMBERS = "90" //pulled from DB

const IncomingWebhook = require('@slack/webhook').IncomingWebhook; //function grabbed from slack webhook devkit library
var url = SLACK_WEBHOOK_URL //can change this to however we want to grab team's webhook
var webhook = new IncomingWebhook(url)

//timer
// Send the notification, if no webhook is present in owners table, skips

if (url != ""){

    if (TOTAL_GHE_ISSUES != "0"){
        try {
        webhook.send({
            text: "*Daily Overdue Nessus Vulnerability Alert*",
            attachments: [{color: "#FF0000", blocks: [{type: "section",text: {type: "mrkdwn",text: "@here *"   TOTAL_GHE_ISSUES   "* Overdue Nessus Vulnerability issues reported nOverdue Nessus Vulnerability GHE Issue Numbers: *"   GHE_ISSUE_NUMBERS   "*"}}]}]
          })
        }
        catch(err){
            console.log("Webhook Verification Failed")
            //url = SLACK_MONITORING_URL;
            //webhook = new IncomingWebhook(url)
            //webhook.send({
                //text: "*Nessus Webhook Verification, please investigate broken webhooks:*",
                //attachments: [{color: "#FF0000", blocks: [{type: "section",text: {type: "mrkdwn",text: SLACK_WEBHOOK_URL}}]}]
            //})
        }
    }

    else {
        try {
        webhook.send({
            text: "*Daily Overdue Nessus Vulnerability Alert*",
            attachments: [{color: "#36a64f", blocks: [{type: "section",text: {type: "mrkdwn",text: "@here *NO* Overdue Nessus Vulnerabilities reported"}}]}]
          })
      }
        catch(err){
            //url = SLACK_MONITORING_URL
            //webhook = new IncomingWebhook(url)
            //webhook.send({
                //text: "*Nessus Webhook Verification, please investigate broken webhooks:*",
                //attachments: [{color: "#FF0000", blocks: [{type: "section",text: {type: "mrkdwn",text: SLACK_WEBHOOK_URL}}]}]
            //})
        }
  }     
}

else {
  console.log("No webhook provided")}
  

Я бы ожидал, что первый перехват (ошибка) будет отправлен в console.log (и в конечном итоге добавит больше функциональности, но я просто хочу этот базовый тестовый пример), но вместо этого я получаю эту ошибку

     at Object.requestErrorWithOriginal (/Users/BrandonKonieczny/Documents/GitHub/node-slack-sdk/node_modules/@slack/webhook/dist/errors.js:25:33)
    at IncomingWebhook.send (/Users/BrandonKonieczny/Documents/GitHub/node-slack-sdk/node_modules/@slack/webhook/dist/IncomingWebhook.js:54:32)
    at processTicksAndRejections (internal/process/next_tick.js:81:5)
(node:65139) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:65139) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
  

Ответ №1:

В предложении try webhook.отправка возвращает обещание, а не ошибку. То, что возвращает ошибку, является результатом самого обещания, поэтому оно не будет зафиксировано в операторе catch.

Чтобы исправить это, вы могли бы создать функцию async / await и выполнить…

 async () => {
try {
        await webhook.send({
            text: "*Daily Overdue Nessus Vulnerability Alert*",
            attachments: [{color: "#FF0000", blocks: [{type: "section",text: {type: "mrkdwn",text: "@here *"   TOTAL_GHE_ISSUES   "* Overdue Nessus Vulnerability issues reported nOverdue Nessus Vulnerability GHE Issue Numbers: *"   GHE_ISSUE_NUMBERS   "*"}}]}]
          })
        }
        catch(err){
            console.log("Webhook Verification Failed")
            //url = SLACK_MONITORING_URL;
            //webhook = new IncomingWebhook(url)
            //webhook.send({
                //text: "*Nessus Webhook Verification, please investigate broken webhooks:*",
                //attachments: [{color: "#FF0000", blocks: [{type: "section",text: {type: "mrkdwn",text: SLACK_WEBHOOK_URL}}]}]
            //})
        }
}  

Комментарии:

1. Я попытался интегрировать приведенный выше код как есть, и я не получаю никакого видимого результата, независимо от того, выполняется ли попытка или случай catch. Он больше не отправляется на канал slack и не возвращает мне что-либо в командной строке при сбое

2. Код там представляет функцию (вы должны ее запустить), поэтому вы можете объявить константу const a = async () …. а затем выполнить a()

3. Теперь у меня все работает, спасибо за помощь и ваше терпение!