Firebase Firestore: добавление данных в поле один раз, даже после обновления страницы


Firebase Firestore: добавление данных в поле один раз, даже после обновления страницы

08.11.2020 01:15:40 Просмотров 45 Источник

В настоящее время я работаю над приложением для викторины с использованием Vue.JS, firebase и я столкнулись с небольшой проблемой.

Мне нужно, чтобы оценка из викторины была добавлена в мою базу данных Firestore, и я могу сделать это легко с помощью следующего кода:

var docRef = firebase.firestore().collection('userData').doc(this.userIdSelf)
firebase.firestore().runTransaction(function(transaction){
    return transaction.get(docRef).then(function(doc) {
        if (!doc.exists) {
            throw "Document does not exist!";
        }
        var newScore = doc.data().score + app.user.score;
        transaction.update(docRef, { score: newScore });
        return newScore;
    });
}).then(function(newScore) {
    console.log("Success! Score updated to: "+newScore);
}).catch(function(error) {
    console.error(error);
}); 

Этот код будет запущен в финальной таблице лидеров викторины (когда викторина закончится). Проблема, с которой я сталкиваюсь, и это может быть моя настоящая глупость, заключается в том, что мне нужно, чтобы этот код запускался только один раз, когда пользователь загружает страницу. Код не может быть запущен снова при обновлении.

• Как сделать так, чтобы этот код запускался только один раз?

• Реализовал бы я это просто с помощью vue.js/javascript или у firebase есть что-то встроенное, о чем я не знаю?

* Наконец, должен ли я выполнить приведенный выше код в функции или в created ()?

Спасибо :)

У вопроса есть решение - Посмотреть?

Ответы - Firebase Firestore: добавление данных в поле один раз, даже после обновления страницы / Firebase Firestore: Add data to field once, even after page refresh

Является ответом!
Renaud Tarnec

08.11.2020 01:31:13

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

Что-то вроде следующих строк, где finalLeaderboardUpdated-это дополнительное поле, упомянутое выше, и является логическим.

  var docRef = firebase
    .firestore()
    .collection('userData')
    .doc(this.userIdSelf);

  firebase
    .firestore()
    .runTransaction(function (transaction) {
      return transaction.get(docRef).then(function (doc) {
        if (!doc.exists) {
          throw 'Document does not exist!';
        }

        if (doc.data().finalLeaderboardUpdated) {
          // finalLeaderboardUpdated is true, meaning the doc was already updated with the newScore
          return Promise.reject("Final Leaderboard already Updated");
        } else {
          var newScore = doc.data().score + app.user.score;
          transaction.update(docRef, {
            score: newScore,
            finalLeaderboardUpdated: true,   // Here we set finalLeaderboardUpdated to true
          });
          return newScore;
        } 
      });
    })
    .then(function (newScore) {
      console.log('Success! Score updated to: ' + newScore);
    })
    .catch(function (error) {
      // Deal with the rejected promise here: e.g. show a message to the user
      console.error(error);
    });
Помочь в развитии проекта:
Закрыть X