Javascript 如何在https云功能内处理Firestore事务中的错误?

Javascript 如何在https云功能内处理Firestore事务中的错误?,javascript,google-cloud-firestore,async-await,google-cloud-functions,try-catch,Javascript,Google Cloud Firestore,Async Await,Google Cloud Functions,Try Catch,如果某个前置条件失败(在事务的读取部分),我想向客户端抛出https错误。此外,如果事务因意外错误而失败,我想抛出一个“不可用”错误 await firestore .runTransaction(async (transaction) => transaction.get(userRef).then((doc) => { const { totalPoints } = doc.data(); if (totalPoints > 1

如果某个前置条件失败(在事务的读取部分),我想向客户端抛出https错误。此外,如果事务因意外错误而失败,我想抛出一个“不可用”错误

await firestore
  .runTransaction(async (transaction) =>
    transaction.get(userRef).then((doc) => {
        const { totalPoints } = doc.data();

        if (totalPoints > 1000) {
          ...
        } else {
          throw new functions.https.HttpsError(
            "failed-precondition",
            "You have less than 1000 points."
          );
        }
    })
  )
  .catch((err) => {
    throw new functions.https.HttpsError(
      "unavailable",
      "Please, try again later."
    );
  });
问题是,如果我在then中抛出https错误,那么catch将获得它并抛出另一个https错误


在抛出“失败的前提条件”错误时,如何避免输入捕获?

我已经用Promise.reject()解决了这个问题

我知道这不是最好的方法,但很有效。寻找更好的方法

await firestore
  .runTransaction(async (transaction) =>
    transaction.get(userRef).then((doc) => {
        const { totalPoints } = doc.data();

        if (totalPoints > 1000) {
          ...
        } else {
          return Promise.reject({
            type: "failed-precondition",
            message: "You have less than 1000 points."
          });
        }
    })
  )
  .catch((err) => {
     if (err.type === "failed-precondition") {
        throw new functions.https.HttpsError(err.type, err.message);
     }
     else {
       throw new functions.https.HttpsError(
          "unavailable",
          "Please, try again later."
       );
     }
  });

对于我的所有云函数,我都有一个顶级的try-catch,它可以捕获未知错误,并让HttpsError错误沿着链继续下去

if (e instanceof https.HttpsError) throw e;
console.error("Encountered with an undefined error. Error: ", e);
throw new https.HttpsError(
  "unknown",
  "There was an unknown error."
);
您可以做类似的事情(当然可以将https.HttpsError替换为functions.https.HttpsError)

这使我能够按原样传递代码中预定义的错误,并在为云日志记录错误时向用户提供错误消息