我看到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,我不确定我写对了。
这里有一个潜在的解决方案。您可以使用分片记录投票,但然后使用云函数来汇总分片总数并更新您的计数器。这应该会减少文档读取次数,从而减少您的火力账单。
这里的教程:https://angularfirebase.com/lessons/firestore-cloud-functions-data-aggregation/
如果您想安全地增加文档中的数字,您可以使用事务。以下代码直接取自链接页面。它在给文档/城市/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仅限于每秒写入一次,因此如果您要写入大量内容,则需要使用分片计数器。
现在有一种更简单的方法来增加/减少文档中的字段:FieldValue。increment()
。你的样本应该是这样的:
const FieldValue = require('firebase-admin').firestore.FieldValue;
var chainCounterRef = db.collection('counters').doc('chains');
chainCounterRef.update({ count: FieldValue.increment(1) });
见:
问题内容: 使用事务使用实时数据库触发器来增加计数器是否可以接受? 问题答案: 绝对!实际上,这确实是此代码示例中的工作方式,尽管有一些小差异: 值得注意的是,此示例根据创建还是删除子节点来处理增量和减量情况。
问题内容: 我已经看到了使用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”规则?
实时数据库触发器在写入创建时是排队还是线程化?