【问题标题】:Firebase + Node: Updating two refs results in 304 errorsFirebase + Node:更新两个 ref 会导致 304 错误
【发布时间】:2018-10-18 17:19:05
【问题描述】:

我拥有的是一个在调用时重置 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 位置。该部分看起来像这样:

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

第一个 sn-p 有效。但是,第二个导致错误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.js firebase google-cloud-functions


    【解决方案1】:

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

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

    【讨论】:

    • 完美运行,但奇怪的是仍然给我一个 304 错误:/
    • @sinio 我忘记发送 200 表示成功。我编辑了答案以包括 200。
    猜你喜欢
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 2013-04-23
    • 2013-06-12
    • 1970-01-01
    • 2015-12-08
    • 2020-05-08
    相关资源
    最近更新 更多