我正在网上商店工作。从购物车中删除产品后,必须触发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;
}
});
答案 0 :(得分:2)
问题似乎是由于您将一组产品写成一个数组而引起的。当您在Cloud Function中读取数组(删除数组的值时触发)时,once()
方法返回的数组不正确,例如; [, { test: 'test' }, , , { test: 'test' }]
代替[{ test: 'test' }, { test: 'test' }]
如果将产品集写为对象,则将获得正确的products
对象。
您可以使用update()
方法来编写products
对象,让Firebase为产品生成唯一的ID。