首页 > 解决方案 > Firebase + Node:更新两个 ref 会导致 304 错误

问题描述

我拥有的是一个在调用时重置 ref 的函数。它仅在更新一个参考时有效。

这是该部分功能的代码:

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

我还想在数据库的不同部分更新另一个 ref。我已经将它包含在同一个函数中,因为唯一的区别是 ref 位置。该部分看起来像这样:

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我想知道为什么会这样以及如何解决它。也许我没有正确构建它,因为我是 Node.js 的新手。我确信这是两个裁判的正确路径。这是完整的功能:

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

谢谢!

标签: node.jsfirebasegoogle-cloud-functions

解决方案


您应该Promise在 HTTPS 函数 ( docs ) 中返回您的。你的代码应该变成:

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

推荐阅读