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