当前位置: 首页 > 知识库问答 >
问题:

Firebase云函数增量计数器

蔚元明
2023-03-14

我看到Cloud Functions引用实时数据库的增量计数器,但还没有看到Firebase FiRecovery。

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

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

我正在尝试上述事务,但当我在terminal中运行firebase deploy时,我得到以下错误:

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

这是我第一次尝试任何节点。js,我不确定我写对了。

共有3个答案

易奇希
2023-03-14

这里有一个潜在的解决方案。您可以使用分片记录投票,但然后使用云函数来汇总分片总数并更新您的计数器。这应该会减少文档读取次数,从而减少您的火力账单。

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

淳于功
2023-03-14

如果您想安全地增加文档中的数字,您可以使用事务。以下代码直接取自链接页面。它在给文档/城市/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);
});

请记住,在持续负载下,FiRecovery仅限于每秒写入一次,因此如果您要写入大量内容,则需要使用分片计数器。

章学义
2023-03-14

现在有一种更简单的方法来增加/减少文档中的字段:FieldValue。increment()。你的样本应该是这样的:

const FieldValue = require('firebase-admin').firestore.FieldValue;
var chainCounterRef = db.collection('counters').doc('chains');
chainCounterRef.update({ count: FieldValue.increment(1) });

见:

  • 使用Cloud FiRecovery原子地增加值
 类似资料:
  • 问题内容: 使用事务使用实时数据库触发器来增加计数器是否可以接受? 问题答案: 绝对!实际上,这确实是此代码示例中的工作方式,尽管有一些小差异: 值得注意的是,此示例根据创建还是删除子节点来处理增量和减量情况。

  • 问题内容: 我已经看到了使用Cloud Functions引用实时数据库的增量计数器,但是还没有Firebase Firestore。 我有一个监听新文档的云功能: 我正在尝试上述交易,但是在终端中运行时出现此错误: 错误每个then()应该返回一个值或抛出promise / always-return函数预部署错误:命令以非零退出代码终止 这是我对任何node.js的首次尝试,而且我不确定我是否

  • 我已经使用firebase云函数一段时间了,今天在代码中修复了一个小错误,在尝试部署时出现了以下错误。我取消了该更改,并尝试使用上次提交的稳定更改再次部署,但仍然是相同的错误。有什么解决办法吗?PS:这是一个typescript项目,我用tsc编译它。

  • 在以前的GCP项目中,我们部署了基于Python的云功能(使用gcloud cli),理想情况下,我们希望继续使用Python实现Firebase云功能。所以我的问题是: > 是否可以部署基于Python的Firebase云功能?如果没有: 我们是否可以回到使用gcloud cli部署基于Python的GCP云函数,并且仍然让它们作为Firestore触发器工作?

  • 我使用Firebase实时数据库作为后端。我希望每个请求最多增加1个。例如: 这不管用。 在前端,我发送“数据1”。我应该如何创建“.validate”规则?

  • 实时数据库触发器在写入创建时是排队还是线程化?