【发布时间】:2019-06-06 22:45:25
【问题描述】:
我在网上商店工作。当从购物车中删除产品时,必须触发 firebase 函数来重新计算购物车中剩余的所有文件的新总价。
export const onProductDelete = functions.database
.ref(`/orders/{userID}/{orderID}/products/{productID}`)
.onDelete(async (snapshot, context) => {
...
})
当产品被删除(在 Firebase 实时数据库仪表板中手动或以编程方式)时,会调用 firebase 函数但价格不会更新,因为产品数量相同 (?)。
我在函数中记录了产品数组,结果如下:
products: [
,
{ test: 'test' },
,
,
{ test: 'test' }
]
已删除的产品在数据库中不可见,但被逗号替换,仍被计为产品(对象)
有人知道发生了什么吗?
更新额外信息
完整的firebase功能
export const onProductDelete = functions.database.ref(`/orders/{userID}/{orderID}/products/{productsID}`).onDelete(async (snapshot, context) => {
try {
const userID = context.params.userID;
const orderID = context.params.orderID;
const productID = context.params.productID;
const orderSnapshot = await admin.database().ref(`orders/${userID}/${orderID}`).once('value');
const orderData = orderSnapshot.val();
console.log('products: ', orderData.products); // products: [, { test: 'test' }, , , { test: 'test' }]
const amountOfProducts = orderData.products.length;
const newSubTotal = amountOfProducts * 100; //Fixed product price for example
const taxes = newSubTotal * 0.10; //Fixed tax of 10% for example
const total = newSubTotal + taxes;
return admin.database().ref(`orders/${userID}/${orderID}/price`).set({ amountOfProducts, subTotal: newSubTotal, taxes, total });
} catch(error) {
console.log('Error in onProductDelete: ', error);
return null;
}
});
【问题讨论】:
-
你能展示你的云函数的整个代码吗?您究竟如何在函数中记录产品数组?
-
@RenaudTarnec 我已经添加了整个云功能。我正在使用以下代码
console.log('products: ', orderData.products);在const orderData = orderSnapshot.val();之后记录产品数组 -
如果我理解正确的话,云函数中隐含了两个不同的节点:一方面是
/products/{userID}/{productID}/files/{fileID}(你删除的地方),另一方面是orders/${userID}/${orderID},你读过。对吗? -
正确,但我在复制代码时犯了一个错误。第一个节点(我删除的地方)应该是
/orders/{userID}/{orderID}/products/{productsID} -
有些不同,但为什么在删除后重新计算总数?你不能简单地从总数中减去删除的值吗?在这种情况下,您不必每次都阅读整个列表,如果您使用付费计划,它可能会为您节省大量数据库操作,从而节省金钱。看看this costly mistake,看看我在说什么。
标签: firebase firebase-realtime-database google-cloud-functions