блок try / catch не может остановить ошибку ER_DUP_ENTRY от сбоя моего приложения - PullRequest
1 голос
/ 03 мая 2020

Я добавляю дубликат в таблицу mysql, и я хочу обработать обнаруженную ошибку ER_DUP_ENTRY , возвращающуюся с блоком Try / Catch, но в любом случае это просто сбой, есть ли какой-нибудь возможный способ обработки ошибки и остановить сбой приложения с помощью блока try / catch?

async function init() {
    try {
      connection.query(
        'SOME INSERT QUERY',
        (err, result, feilds) => {
          if (err) throw err
          console.log(result);
        }
      );
    } catch (e) {
      console.log(e);
    }
  }

init(); 

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Проблема в том, что connection.query возвращает undefined сразу. Ваш catch не участвует, потому что вызов заканчивается до того, как работа завершена, и вызовет вашу функцию обратного вызова позже. Исключение, которое возникает во время вашего обратного вызова, слишком поздно. Вы пытаетесь / поймать блок уже завершен.

Вы можете использовать promisify, чтобы подождать на нем, как это:

const util = require("util");
function init() {
  const queryPromise = util.promisify(connection.query);
  return queryPromise('SOME INSERT QUERY')
    .catch(e => {
      console.log("It failed", e);
    });
  }

init().then(result => {
  if (result) console.log("It worked", result);
  else console.log("Aww, it didn't work");
}); 
1 голос
/ 03 мая 2020

Узел mysql - библиотека не поддерживает обещания "из коробки", что означает, что query не возвращает обещание, которое вы можете ожидать. Таким образом, вы можете либо самостоятельно обернуть функцию query в обещание:

async function init() {
    try {
        const duplicateResult = await new Promise((resolve, reject) => {
                connection.query(
                    'SOME INSERT QUERY',
                    (err, result, fields) => {
                    if (err) {
                        return reject(err);
                    }
                    resolve(result);
                });
            });

    } catch (e) {
        console.log(e);
    }
}

, либо использовать util.promisify в качестве альтернативы, опубликованной Always Learning.

...