Firebase + Node: обновление двух ссылок приводит к 304 ошибкам - PullRequest
0 голосов
/ 08 мая 2018

У меня есть функция, которая сбрасывает ссылку при вызове.Он работает при обновлении только одной ссылки.

Это код для этой части функции:

if (streakVal !== 0) {
   //reset
   const uid = item.child('uid').val();
   ref.child(uid).update({ streak: 0 }).catch(err => {
      res.status(500).send(err);
   });
}

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

if (streakVal !== 0) {
    //reset
    const uid = item.child('uid').val();

    ref.child(uid).update({ streak: 0 }).then(() => {
        boardRef.child(uid).update({ score: 0 }).catch(err => {
           res.status(500).send(err);
        });
    }).catch(err => {
       res.status(500).send(err);
    });
}

Первый фрагмент работает.Однако второе приводит к ошибке Function execution took 800 ms, finished with status code: 304 Мне интересно, почему это так и как это исправить.Возможно я не правильно структурирую это, поскольку я новичок в Узле.Я уверен, что это правильный путь к обеим ссылкам.Вот полная функция:

export const resetStreak = functions.https.onRequest((req, res) => {
  const ref = db.ref('users');
  const boardRef = db.ref('streakLeaderboard');

  ref.once('value').then(snap => {
    snap.forEach(item => {
        const streakVal = item.child('streak').val();
        const lastQuestTimestamp = item.child('lastQuest').val();

        const today = new Date();
        const d = new Date(lastQuestTimestamp);

        if (sameDay(today, d) === false) {
          if (streakVal !== 0) {
           //reset
           const uid = item.child('uid').val();

           ref.child(uid).update({ streak: 0 }).then(() => {
            boardRef.child(uid).update({ score: 0 }).catch(err => {
              res.status(500).send(err);
            });
           }).catch(err => {
             res.status(500).send(err);
           });
          }
        }
    })

  }).catch(err => {
    res.status(500).send(err);
  });

Спасибо!

1 Ответ

0 голосов
/ 08 мая 2018

Вы должны вернуть свои Promise в функции HTTPS ( документы ). Ваш код должен стать:

export const resetStreak = functions.https.onRequest((req, res) => {
  const ref = db.ref('users');
  const boardRef = db.ref('streakLeaderboard');

  return ref.once('value').then(snap => {
    const promises = []
    snap.forEach(item => {
      const streakVal = item.child('streak').val();
      const lastQuestTimestamp = item.child('lastQuest').val();

      const today = new Date();
      const d = new Date(lastQuestTimestamp);

      if (sameDay(today, d) === false) {
        if (streakVal !== 0) {
         //reset
         const uid = item.child('uid').val();

         promises.push(ref.child(uid).update({ streak: 0 }).then(() => {
           return boardRef.child(uid).update({ score: 0 });
         }));
        }
      }
    })
    return Promise.all(promises);
  }).then(() => {
    res.sendStatus(200);
  }).catch(err => {
    res.status(500).send(err);
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...