Firebase:删除后节点将被逗号替换
我在一家网店工作。从购物车中删除产品时,必须触发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实时数据库仪表板中手动或以编程方式),会调用
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}
有些不同,但为什么要在删除后重新计算总数?你不能简单地从总数中减去已删除的值吗?在这种情况下,您不必每次都阅读整个列表,而且如果您使用付费计划,它可能会为您节省大量数据库操作,从而节省资金。请看一个我所说的例子。