Firebase:Firebase 条带函数示例中的错误处理是否足够?

Firebase: Is the error handling in the firebase stripe function example enough?

Firebase 在 GitHub 上提供了用于编写云函数的示例。 我对 "createStripeCharge" 函数有疑问。 有没有可能是写数据库失败了? 如果是这种情况,此功能会向客户收费,但不会将任何对象保存到数据库中。这是正确的吗? 这个错误处理还不够,还是我理解有误?

代码中的以下行让我感到困惑:

return event.data.adminRef.set(response);

您在 GitHub 上找到了代码: https://github.com/firebase/functions-samples/blob/master/stripe/functions/index.js

或在这里:

exports.createStripeCharge = functions.database.ref('/stripe_customers/{userId}/charges/{id}').onWrite((event) => {
  const val = event.data.val();
  // This onWrite will trigger whenever anything is written to the path, so
  // noop if the charge was deleted, errored out, or the Stripe API returned a result (id exists)
  if (val === null || val.id || val.error) return null;
  // Look up the Stripe customer id written in createStripeCustomer
  return admin.database().ref(`/stripe_customers/${event.params.userId}/customer_id`).once('value').then((snapshot) => {
    return snapshot.val();
  }).then((customer) => {
    // Create a charge using the pushId as the idempotency key, protecting against double charges
    const amount = val.amount;
    const idempotency_key = event.params.id;
    let charge = {amount, currency, customer};
    if (val.source !== null) charge.source = val.source;
    return stripe.charges.create(charge, {idempotency_key});
  }).then((response) => {
    // If the result is successful, write it back to the database
    return event.data.adminRef.set(response);
  }).catch((error) => {
    // We want to capture errors and render them in a user-friendly way, while
    // still logging an exception with Stackdriver
    return event.data.adminRef.child('error').set(userFacingMessage(error));
  }).then(() => {
    return reportError(error, {user: event.params.userId});
  });
});

onWrite():

在实时数据库中创建、更新或删除数据时触发。

exports.createStripeCharge = functions.database.ref('/stripe_customers/{userId}/charges/{id}').onWrite((event) => {

因此,如果在上述位置写入数据库失败,则 onWrite() 将不会触发。

此外,如果您希望它仅在添加数据时触发,则可以使用 onCreate():

在实时数据库中创建新数据时触发。

更多信息在这里:

https://firebase.google.com/docs/functions/database-events

数据库写入失败的唯一原因是它违反了安全规则,或者函数超时并在完成前被清除。使用管理 SDK 时,安全规则不适用,因此这不是原因。我想写入可能会超时,所以如果您非常担心,您应该增加函数的超时时间。发生超时的可能性极低。如果发生这种情况,您应该能够手动解决最终用户的问题,而不会浪费很多时间。