【问题标题】:Firebase: Nodes are getting replaced by commas after deletingFirebase:删除后节点被逗号替换
【发布时间】: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


【解决方案1】:

问题似乎来自您将一组产品编写为数组的事实。在 Cloud Function 中读取数组时(删除数组的某个值时触发),once() 方法返回的数组不正确,例如; [, { test: 'test' }, , , { test: 'test' }] 而不是 [{ test: 'test' }, { test: 'test' }]

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

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

【讨论】:

    猜你喜欢
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多