【问题标题】:Why does this firebase function run recursively?为什么这个firebase函数递归运行?
【发布时间】:2017-12-19 10:20:30
【问题描述】:

我猜这与不理解承诺和执行顺序有关,但我目前很难理解为什么这个 Firebase Function(重新打包的 Google Cloud Functions)代码会递归运行。

目前该函数成功执行一次(获取数据、写入数据库条目、将文件写入存储),然后每 15-30 秒重复一次,直到达到“402”错误状态。它只执行一次。

任何帮助将不胜感激。

exports.add = functions.https.onRequest((req, res) => {
  cors(req, res, () => {
    if (req.query.idToken) {
      // there's a query param
      var idToken = req.query.idToken;

      admin.auth().verifyIdToken(idToken)
        .then(function(decodedToken) {
          var uid = decodedToken.uid;

          var userRef = database.ref('users/' + uid);
          var feedCountRef = database.ref('users/' + uid).child('feeds');
          var plansRef = database.ref('plans')

          userRef.once('value', function(snapshot){
            var feedsCount = snapshot.val().feeds;
            var currentPlan = snapshot.val().membership;
            var planRef = database.ref('plans/' + currentPlan);

            planRef.once('value', function(snapshot) {
              console.log(snapshot.val());
              var allowedFeeds = snapshot.val().feeds;
              if(feedsCount < allowedFeeds) {
                fetchFeed(req.body.feedSource, function(feedData) {
                  var defaultFeedName = 'Untitled';
                  var defaultUpdateFrequency = 'Weekly';

                  var feedsdatabaseRef = database.ref('feeds/' + uid);
                  var newFeedDatabaseRef = feedsdatabaseRef.push();
                  var feedKey = newFeedDatabaseRef.key;

                  writeFeedStorage(feedKey, feedData, function(response) {
                    console.log(response);
                    newFeedDatabaseRef.set({
                      // write data
                    })
                  });

                  feedCountRef.transaction(function(feeds){
                    return (feeds || 0) + 1;
                  });

                  return;
                });
              } else {
                console.log('over quota');
                res.status(402).send({error: 'You are at the maximum number of feeds your plan allows.'});
              }
            });
          })
        }).catch(function(error) {
          res.status(401);
        });
    } else {
      res.status(401);
    }
  })
})

【问题讨论】:

  • “递归运行”是什么意思?你能更具体地说明这种行为吗?日志?
  • @DougStevenson 道歉。我的意思是该功能继续重复运行并且必须强制终止。答案是缺少“成功响应”。

标签: node.js firebase recursion google-cloud-functions


【解决方案1】:

从您的代码 sn-p 来看,它会重复运行的一个潜在原因是,如果一切正常,您不会返回 ok 状态,例如

res.status(200).send('ok');

根据 Firebase documentation,这是您应该为 HTTP 函数做的事情。

【讨论】:

  • 谢谢你,解决了!我不敢相信我错过了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
相关资源
最近更新 更多