Firebase:删除后节点将被逗号替换

Firebase:删除后节点将被逗号替换,firebase,firebase-realtime-database,google-cloud-functions,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函数,以重新计算购物车中剩余所有文件的新总价

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
对象


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

问题似乎来自您将一组产品作为数组编写的事实。在云函数中读取数组时(当数组的某个值被删除时触发该函数),由
once()
方法返回的数组不正确,例如<代码>[,{test:'test'},,{test:'test'}]而不是
[{test:'test'},{test:'test'}]

如果将产品集编写为对象,则会得到正确的
products
对象


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

您可以显示云功能的整个代码吗?如何准确地在函数中记录产品阵列?@RenaudTarnec我已经添加了整个云函数。我在
const orderData=orderSnapshot.val()之后记录产品数组使用以下代码
console.log('products:',orderData.products)如果我理解正确,云函数中隐含了两个不同的节点:
/products/{userID}/{productID}/files/{fileID}
一方面(在这里删除),另一方面是
orders/${userID}/${orderID}
,您可以阅读。是吗?没错,但我在复制代码时犯了一个错误。第一个节点(我删除的地方)应该是
/orders/{userID}/{orderID}/products/{productsID}
有些不同,但为什么要在删除后重新计算总数?你不能简单地从总数中减去已删除的值吗?在这种情况下,您不必每次都阅读整个列表,而且如果您使用付费计划,它可能会为您节省大量数据库操作,从而节省资金。请看一个我所说的例子。你能展示你的云函数的全部代码吗?如何准确地在函数中记录产品阵列?@RenaudTarnec我已经添加了整个云函数。我在
const orderData=orderSnapshot.val()之后记录产品数组使用以下代码
console.log('products:',orderData.products)如果我理解正确,云函数中隐含了两个不同的节点:
/products/{userID}/{productID}/files/{fileID}
一方面(在这里删除),另一方面是
orders/${userID}/${orderID}
,您可以阅读。是吗?没错,但我在复制代码时犯了一个错误。第一个节点(我删除的地方)应该是
/orders/{userID}/{orderID}/products/{productsID}
有些不同,但为什么要在删除后重新计算总数?你不能简单地从总数中减去已删除的值吗?在这种情况下,您不必每次都阅读整个列表,而且如果您使用付费计划,它可能会为您节省大量数据库操作,从而节省资金。请看一个我所说的例子。