Firebase:删除

时间:2019-01-12 02:09:09

标签: firebase firebase-realtime-database google-cloud-functions

我正在网上商店工作。从购物车中删除产品后,必须触发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;
  }
});

1 个答案:

答案 0 :(得分:2)

问题似乎是由于您将一组产品写成一个数组而引起的。当您在Cloud Function中读取数组(删除数组的值时触发)时,once()方法返回的数组不正确,例如; [, { test: 'test' }, , , { test: 'test' }]代替[{ test: 'test' }, { test: 'test' }]

如果将产品集写为对象,则将获得正确的products对象。

您可以使用update()方法来编写products对象,让Firebase为产品生成唯一的ID。