我正在做一个网上商店。从购物车中删除产品时,必须触发 Firebase 函数来重新计算购物车中剩余所有文件的新总价。
export const onProductDelete = functions.database
.ref(`/orders/{userID}/{orderID}/products/{productID}`)
.onDelete(async (snapshot, context) => {
...
})
删除产品后(在 Firebase 实时数据库信息中心手动或以编程方式删除),系统会调用 Firebase 函数,但价格不会更新,因为产品数量相同(?)。
我在函数中记录了产品数组,结果如下:
products: [
,
{ test: 'test' },
,
,
{ test: 'test' }
]
已删除的产品在数据库中不可见,但会替换为逗号,并且仍计为产品(对象)
有人知道发生了什么吗?
使用额外信息进行更新
完整的火力基地功能
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;
}
});
问题似乎来自您将一组产品编写为数组的事实。当你在云函数中读取数组时(删除数组的值时触发),once()
方法返回的数组不正确,例如; [, { test: 'test' }, , , { test: 'test' }]
而不是[{ test: 'test' }, { test: 'test' }]
如果您将商品系列编写为对象,您将获得正确的products
对象。
您可以使用 update()
方法编写对象products
让 Firebase 为产品生成唯一 ID。