首页 文章

使用Cloud Functions for Firebase增加计数器

提问于
浏览
0

我看过一个增量计数器,其中 Cloud 功能引用了实时数据库,但还没有引用Firebase Firestore .

我有一个用于侦听新文档的 Cloud 功能:

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 时,我收到此错误:

error每个then()都应返回一个值或抛出promise / always-return函数predeploy error:命令以非零退出代码1终止

这是我第一次尝试任何node.js,我不确定我是否写得正确 .

2 回答

  • 1

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

    // 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 .

  • 0

    这是一个潜在的解决方案 . 您可以使用分片记录投票,但随后使用 Cloud 功能聚合分片总计并更新您的计数器 . 这应该减少文档读取的数量,从而减少您的Firestore账单 .

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

相关问题