Firebase: узлы заменяются запятыми после удаления - PullRequest
0 голосов
/ 12 января 2019

Я работаю в интернет-магазине. Когда продукт удален из корзины покупок, должна быть запущена функция пожарной базы, чтобы пересчитать новую общую стоимость всех файлов, оставшихся в корзине.

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;
  }
});

1 Ответ

0 голосов
/ 12 января 2019

Кажется, проблема в том, что вы пишете набор продуктов в виде массива. Когда вы читаете массив в облачной функции (которая запускается при удалении значения массива), массив, возвращаемый методом once(), неверен, например; [, { test: 'test' }, , , { test: 'test' }] вместо [{ test: 'test' }, { test: 'test' }]

Если вы напишите свой продуктовый набор как объект, вы получите правильный products объект.

Вы можете использовать метод update(), чтобы написать вам products объект, позволяющий Firebase генерировать уникальные идентификаторы для продуктов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...