【问题标题】:Handling unexpected failure from a certain background function in cloud functions firebase处理云功能firebase中某个后台功能的意外故障
【发布时间】:2020-05-12 04:31:03
【问题描述】:

我有一个可调用的initiatePayment 函数,它在用户从客户端付款时处理他们的付款。如果付款成功(addNewRecord),这会在我的 Firestore 数据库中记录一个新文档,然后最终从请求的响应中返回付款数据。

export const initiatePayment = functions.https.onCall(async (data, context) => {
  // destructure data argument
  const { userId } = data;

  try {
    // 1. Process payment via external API request
    const payment = await paymentExternalRequest();
    const { paymentData, status } = payment.response;

    // 2. If payment processing was a success, record new payment data
    if (status === "succeeded") {
      addNewRecord(userId, paymentData);
    }

    // 3. Return paymentData to client
    return paymentData;
  } catch (error) {
    throw new functions.https.HttpsError("cancelled", "Cancelled", error);
  }
});

addNewRecord函数:

const addNewRecord = async (userId, paymentData) => {
  const newRecordToAdd = { userId, paymentData };
  const docRef = admin
    .firestore()
    .collection("transactions")
    .doc(paymentData.id);

  try {
    const newRecord = await docRef.set({ userId, transaction: newRecordToAdd });
    return newRecord;
  } catch (error) {
    console.log(error);
  }
};

我的问题是如果addNewRecord 失败了,你如何处理它的错误并再次重试该函数以确保其成功?

【问题讨论】:

    标签: javascript firebase google-cloud-functions


    【解决方案1】:

    考虑到您的代码,您应该不会遇到 addNewRecord 失败的问题。由于函数只会在特定和受控的场景中被调用,在这些场景中,您将拥有正确调用函数所需的参数,您应该没问题。

    无论如何,如果它失败一次,它很可能会再次失败,因此,您可以尝试使用队列系统而不是仅仅尝试重复执行。这样,您将在队列中维护该数据并在检查和处理错误后再次运行,以确保添加记录。

    我建议您查看以下有关使用 Javascript 进行排队的文档,我相信这些文档可能会对您有所帮助。

    如果这些信息对您有帮助,请告诉我!

    【讨论】:

    • 很好的建议。我将开发队列系统,并在测试完后回复您。谢谢。
    • 没问题!很高兴听到它有帮助!请考虑支持或接受它! :)
    • 这里是link,用于尝试在队列系统中使用addNewRecord 函数。让我知道你的想法。
    猜你喜欢
    • 2012-10-31
    • 1970-01-01
    • 2018-06-15
    • 2011-06-26
    • 2015-07-25
    • 1970-01-01
    • 2020-06-09
    • 2019-12-23
    • 1970-01-01
    相关资源
    最近更新 更多