具有Cloud功能的Firebase增量计数器

时间:2018-06-25 04:15:06

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

我已经看到带有Cloud Functions的增量计数器,它引用了实时数据库,但还没有引用Firebase Firestore。

我有一个监听新文档的云功能:

exports.addToChainCount = functions.firestore
    .document('chains/{name}')
    .onCreate((snap, context) => {

    // Initialize document
    var chainCounterRef = db.collection('counters').doc('chains');

    var transaction = db.runTransaction(t => {
        return t.get(chainCounterRef).then(doc => {
            // Add to the chain count
            var newCount = doc.data().count + 1;
            t.update(chainCounterRef, { count: newCount });
        });
    }).then(result => {
        console.log('Transaction success!');
    }).catch(err => {
        console.log('Transaction failure:', err);
    });
    return true;
});

我正在尝试上述交易,但是当我在终端中运行firebase deploy时,出现此错误:

  

错误每个then()应该返回一个值或抛出promise / always-return   函数预部署错误:命令以非零退出代码1终止

这是我对任何node.js的首次尝试,但我不确定我是否写得正确。

3 个答案:

答案 0 :(得分:5)

现在有一种更简单的方法来递增/递减文档中的字段:FieldValue.increment()。您的示例将如下所示:

var chainCounterRef = db.collection('counters').doc('chains');
chainCounterRef.update({ count: FieldValue.increment(1) });

请参阅:

答案 1 :(得分:1)

如果要安全增加文档中的数字,可以使用transaction。以下代码直接从链接页面获取。在给它一些初始值后,它将一个添加到文档population中名为/cities/SF的字段中:

// Initialize document
var cityRef = db.collection('cities').doc('SF');
var setCity = cityRef.set({
  name: 'San Francisco',
  state: 'CA',
  country: 'USA',
  capital: false,
  population: 860000
});

var transaction = db.runTransaction(t => {
  return t.get(cityRef)
      .then(doc => {
        // Add one person to the city population
        var newPopulation = doc.data().population + 1;
        t.update(cityRef, { population: newPopulation });
      });
}).then(result => {
  console.log('Transaction success!');
}).catch(err => {
  console.log('Transaction failure:', err);
});

请记住,Firestore在持续负载下每秒只能进行一次写入,因此,如果要进行大量写入,则需要使用sharded counter

答案 2 :(得分:1)

这是一个潜在的解决方案。您可以使用分片记录投票,但随后使用云功能汇总分片总数并更新计数器。这样可以减少文档读取次数,从而减少您的Firestore帐单。

此处的教程:https://angularfirebase.com/lessons/firestore-cloud-functions-data-aggregation/