Javascript 如何在https云功能内处理Firestore事务中的错误?
如果某个前置条件失败(在事务的读取部分),我想向客户端抛出https错误。此外,如果事务因意外错误而失败,我想抛出一个“不可用”错误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
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)
这使我能够按原样传递代码中预定义的错误,并在为云日志记录错误时向用户提供错误消息