Непредсказуемые / противоречивые результаты при записи и получении данных счетчика в базу данных Firestore - PullRequest
0 голосов
/ 22 мая 2019

В настоящее время я создаю игру Google Action. Я хочу дать пользователям дополнительные баллы, когда они имеют более высокую скорость входа в систему. Поэтому, если пользователь входит в систему 2 раза и дает правильный ответ, он должен получить 2 балла вместо 1. 3 входа = 3 балла и т. Д.

Для этого у меня есть еженедельный счет (количество правильных ответов за неделю) и счет входа в систему. Когда я тестирую свое приложение, оно выдает противоречивые результаты. Таким образом, вместо того, чтобы давать мне 2 балла при моем втором входе в систему, он дает мне только 1. Во время другого теста баллы не даются вообще, и мои общие баллы остаются такими же, как и раньше.

Когда я регистрирую 'loginstreakcount', значение отличается от значения в базе данных. Фактически, большую часть времени он показывает на 1 логин меньше.

Я искал в сети эту проблему и обнаружил, что это может быть связано с ограничением Firestore 1 QPS на документ. Однако я не знаю, является ли это реальной проблемой.

const userRef = db.collection('users').doc(payload.email)     
userRef.update({loginstreak: admin.firestore.FieldValue.increment(1)})                                         
const getuser = userRef.get()
return getuser
.then(doc => {
    if (!doc.exists) {
        console.log('No such document!');
      } else {




        if (doc.data().loginstreak === 2) {
          userRef.update({weeklysuccescount: admin.firestore.FieldValue.increment(1)})
          conv.add('Hooray')
          console.log("If statement 2")
          conv.close('bye')
        }

        else if (doc.data().loginstreak === 3) {
          userRef.update({weeklysuccescount: admin.firestore.FieldValue.increment(2)})
          conv.add('Hooray')
          console.log("If statement 3")
          conv.close('bye')
        }

        else if (doc.data().loginstreak === 4) {
          userRef.update({weeklysuccescount: admin.firestore.FieldValue.increment(3)})
          conv.add('Hooray')
          console.log("If statement 4")
          conv.close('bye')
        }

        else if (doc.data().loginstreak === 5) {
          userRef.update({weeklysuccescount: admin.firestore.FieldValue.increment(4)})
          conv.add('Hooray')
          console.log("If statement 5")
          conv.close('bye')
        }

        else if (doc.data().loginstreak === 6) {
          userRef.update({weeklysuccescount: admin.firestore.FieldValue.increment(5)})
          conv.add('Hooray')
          console.log("If statement 6")
          conv.close('bye')
        }

        else if (doc.data().loginstreak === 7) {
          userRef.update({weeklysuccescount: admin.firestore.FieldValue.increment(6)})
          conv.add('Hooray')
          console.log("If statement 7")
          conv.close('bye')
        }

        else {                              
          userRef.update({weeklysuccescount: admin.firestore.FieldValue.increment(1)})
          console.log('Loginstreak: ' + doc.data().loginstreak)
          conv.add('Hooray')
          conv.close('bye')
        }
      }})

ОБНОВЛЕНИЕ:

Я пытался реализовать ответ, но в БД счетчик оценок действителен, однако в действии он говорит неверную оценку. Таким образом, обещание, похоже, еще не сработало. Вот мой обновленный код:

const userRef = db.collection('users').doc(payload.email)     

                        return userRef.update({loginstreak: admin.firestore.FieldValue.increment(1)})
                        .then(() => {    

                        const getuser = userRef.get()
                        return getuser
                        .then(doc => {
                            if (!doc.exists) {
                                console.log('No such document!');
                              } else {


                                if (doc.data().loginstreak === 2) {
                                  return userRef.update({wekelijkssuccescount: admin.firestore.FieldValue.increment(1)})                                     
                                  .then(() => {
                                  conv.add('Hooray')
          console.log("If statement 2")
          conv.close('bye')
                                })
                                }

                                else if (doc.data().loginstreak === 3) {
                                  return userRef.update({wekelijkssuccescount: admin.firestore.FieldValue.increment(2)}) 
                                  .then(() => {
                                  conv.add('Hooray')
          console.log("If statement 3")
          conv.close('bye')
                                })
                                }

                                else if (doc.data().loginstreak === 4) {
                                  return userRef.update({wekelijkssuccescount: admin.firestore.FieldValue.increment(3)}) 
                                  .then(() => {
                                  conv.add('Hooray')
          console.log("If statement 4")
          conv.close('bye')
                                })
                                }

                                else if (doc.data().loginstreak === 5) {
                                  return userRef.update({wekelijkssuccescount: admin.firestore.FieldValue.increment(4)}) 
                                  .then(() => {
                                  conv.add('Hooray')
          console.log("If statement 5")
          conv.close('bye')
                                })
                                }

                                else if (doc.data().loginstreak === 6) {
                                  return userRef.update({wekelijkssuccescount: admin.firestore.FieldValue.increment(5)}) 
                                  .then(() => {
                                 conv.add('Hooray')
          console.log("If statement 6")
          conv.close('bye')
                                })
                                }

                                else if (doc.data().loginstreak === 7) {
                                  return userRef.update({wekelijkssuccescount: admin.firestore.FieldValue.increment(6)}) 
                                  .then(() => {
                                  conv.add('Hooray')
          console.log("If statement 7")
          conv.close('bye')
                                })
                                }

                                else {                              
                                  return userRef.update({wekelijkssuccescount: admin.firestore.FieldValue.increment(1)}) 
                                  .then(() => {
                                  console.log('Loginstreak: ' + doc.data().loginstreak)
                                  conv.add('Hooray')

          conv.close('bye')
                                }) 
                                } 
                              }}) })

1 Ответ

0 голосов
/ 22 мая 2019

Проблема в том, что метод update не является синхронной операцией. Как и в случае с константой getuser, update возвращает обещание. Возможно, ваша функция остановится до завершения обновления, что приведет к расхождению данных.

Переключение вашей реализации на использование async / await или Promises должно позволить завершить обновление, прежде чем продолжить.

app.intent('intent name', conv => {
  return userRef.update({weeklysuccescount: admin.firestore.FieldValue.increment(1)})
    .then(() => {
        conv.add('Hooray')
        console.log("If statement 2")
        conv.close('bye')
    })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...