UnhandledPromiseRejectionWarning: обработка ошибок в функции обратного вызова asyn c - PullRequest
0 голосов
/ 02 августа 2020

У меня есть функция обратного вызова asyn c, которая выдает ошибку, если какое-то условие не выполняется.

, но я получаю следующую ошибку:

(node: 77284 ) UnhandledPromiseRejectionWarning: Ошибка: не найдено

UnhandledPromiseRejectionWarning: необработанное отклонение обещания. Эта ошибка возникла либо из-за вставки внутри асинхронной функции c без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch ().

Мой код:

async deleteItem(id: string): Promise<void> {
    const ref = firestoreDB.collection("items").doc(id);

    firestoreDB
      .runTransaction(async (transaction: FirebaseFirestore.Transaction) => {
        let doc = await transaction.get(ref);
        if (doc.exists) {
          transaction.delete(ref);
        } else {
          throw new NotFoundException();
        }
      })
      .catch((err) => {
        if (err instanceof NotFoundException) {
          throw err;
        } else {
          throw new HttpException(
            "Something went wrong",
            HttpStatus.INTERNAL_SERVER_ERROR
          );
        }
      });
  }

Как правильно вывести ошибку из функции обратного вызова?

1 Ответ

1 голос
/ 02 августа 2020

При рассмотрении примеров кода для .runTransaction() кажется, что он возвращает обещание и распространяет отклонения обещания из своего обратного вызова (это немного другой интерфейс для простого обратного вызова), но в любом случае это выглядит например, вам просто нужно вернуть обещание из firestoreDB.runTransaction() из вашего deleteItem() метода, а затем убедиться, что вызывающий этот метод использует .catch() для обработки любых ошибок.

async deleteItem(id: string): Promise<void> {
    const ref = firestoreDB.collection("items").doc(id);

    // add return here
    return firestoreDB
      .runTransaction(async (transaction: FirebaseFirestore.Transaction) => {
        let doc = await transaction.get(ref);
        if (doc.exists) {
          transaction.delete(ref);
        } else {
          throw new NotFoundException();
        }
      })
      .catch((err) => {
        if (err instanceof NotFoundException) {
          throw err;
        } else {
          throw new HttpException(
            "Something went wrong",
            HttpStatus.INTERNAL_SERVER_ERROR
          );
        }
      });
  }

Затем, где бы вы ни звоните .deleteItem():

obj.deleteItem(...).catch(err => {
    // handle error here
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...