Создать новое, если не существует другого обновления в firebase

#javascript #node.js #firebase #google-cloud-functions

#javascript #node.js #firebase #google-cloud-функции

Вопрос:

Я использую firebase в качестве базы данных для моего мобильного приложения, созданного с использованием react native. В одном из сценариев мне нужно проверить, что, если дочерний элемент уже представлен? если не создать новый дочерний элемент, еще обновите существующий дочерний элемент.

У меня есть дерево с именем «CouponUsage», и в нем есть все пользователи, которые использовали код купона.

Структура дерева выглядит следующим образом:

    -CouponUsage
       -user1
          -coupon1: 0    // couponcode name and Number of times used
       -user2
          -coupon1: 2
          -coupon2: 0
  

Итак, чего я хочу, так это проверить, существовали ли уже «пользователь1» или «пользователь2»? И если они не существуют, должна быть создана новая запись с «user1» или «user2» с соответствующим кодом купона, который они ввели.

Весь сценарий заключается в том, что пользователь вводит код купона в приложении, и я проверяю код, а затем, как только он будет правильным, код купона будет отправлен в облачную функцию Google, и тогда произойдет то, о чем говорилось выше. Итак, как только пользователь введет код купона (у каждого кода купона есть отдельный лимит использования пользователем), код будет отправлен, и функция должна проверить, существует ли «user1», и если существует, введенный пользователем код уже существует? И если это существует, то просто обновите счетчик, иначе создайте «user1» и добавьте дочерний элемент «coupon1» (купон, введенный пользователем), а затем запустите счетчик с 1.

Вот мой код для облачной функции Google на данный момент! :

  if(usersCouponUsage) {
            await admin.database().ref(`couponUsage/${phone}`)
            .update({ [couponCodeName]: usersCouponUsage   1 });
        }
  

Это явно обновляет количество, если я также передаю количество. Как реализовать вышесказанное в firebase?

Ответ №1:

На самом деле это довольно просто. Поскольку вы обновляете счетчик, вам следует использовать транзакцию, которая, «изменяя существующее значение на новое значение», «гарантирует отсутствие конфликтов с другими клиентами, выполняющими запись в одно и то же местоположение в одно и то же время».

Хорошей новостью является то, что транзакция автоматически обработает случай, когда пара пользователь / купон не существует.

Вот код для включения в вашу облачную функцию:

    .....
   const user = 'user1';  //Set the user
   const coupon = 'coupon1'  //Set the coupon

   const couponUsageRef = admin.database().ref('CouponUsage/'   user   '/'   coupon);

   return couponUsageRef.transaction(currentNbr => {
      return currentNbr   1;
   });
   .....
  

Если вы хотите протестировать транзакцию вне облачной функции, просто скопируйте / вставьте следующий код в HTML-файл, который вы можете сохранить локально, измените элементы конфигурации Firebase на свои собственные и откройте его в браузере.

 <!DOCTYPE html>
<html lang="en-US">
<head>

    <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, user-scalable=yes">

    <script src="https://www.gstatic.com/firebasejs/5.9.0/firebase.js"></script>


</head>

<body>

    <script>

        var config = {
            apiKey: "--yourValue--",
            authDomain: "--yourValue--",
            databaseURL: "--yourValue--",
            projectId: "--yourValue--"
        };


        firebase.initializeApp(config);

        var user = 'user1';
        var coupon = 'coupon2'
        var db = firebase.database();
        var couponUsageRef = db.ref('CouponUsage/'   user   '/'   coupon);

        couponUsageRef.transaction(function(currentNbr) {

           return currentNbr   1;
        });

    </script>

</body>
</html>
  

Комментарии:

1. что в этом currentNbr? поскольку структура выглядит как «couponCodeName»:»0″,

2. currentNbr это просто переменная, которая содержит текущие данные, хранящиеся в этом расположении, и которая передается функции, используемой в качестве transactionUpdate параметра транзакции. Все это объясняется в документации, на которую я ссылаюсь в своем ответе. Вы можете использовать любое имя переменной и изменить его, например, с currentNbr на currentValue или xyz .

3. Понял, если пользователь не представлен или код купона не представлен под определенным пользователем. Будет ли транзакция создавать их автоматически?

4. Да, это произойдет. Я бы посоветовал вам протестировать его из HTML-кода, который я добавил к своему ответу. Просто сохраните его локально в виде HTML-файла и поиграйте с ним в браузере, изменив значения user и coupon и обновив браузер. Вы увидите, что оно удовлетворяет всем вашим потребностям.

5. Я пробовал, там нет никакой ошибки или каких-либо изменений. Я не смог найти, что не так? И все же я не могу понять, как это работает, если раньше не было никакой записи. Поскольку мы увеличиваем, как оно будет увеличиваться, если раньше не было никакого значения?