Firebase的云函数被多次调用
我只是在尝试Firebase的云函数,以便将我的Firebase的云函数被多次调用,firebase,firebase-realtime-database,google-cloud-functions,Firebase,Firebase Realtime Database,Google Cloud Functions,我只是在尝试Firebase的云函数,以便将我的Firebase队列工作人员转移到云函数。我添加了一个简单的函数,每当我在给定的引用处创建一个新节点时,都会添加一个上次更新的时间戳。该函数如下所示: var functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(functions.config().firebase); exports.se
Firebase队列
工作人员转移到云函数。我添加了一个简单的函数,每当我在给定的引用处创建一个新节点时,都会添加一个上次更新的时间戳。该函数如下所示:
var functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.setLastUpdatedTimestamp = functions.database.ref('/nodes/{nodeId}')
.onWrite(event => {
const original = event.data.val();
console.log('Adding lastUpdatedTimestamp to node ', original.name);
return event.data.ref.child('lastUpdatedAtFromFC').set(Date.now());
});
我部署了这个云功能,只从我的应用程序中添加了一个节点。我转到Firebase函数仪表板,看到该函数已被调用169次,我不知道为什么。当我查看日志时,我看到的日志类似于将函数附加到所有过去的节点
在这种情况下,onWrite
的行为是否类似于添加的child\u
,并对所有现有实体运行该函数
每次我更改并再次部署该函数时是否会重复此操作
我希望它只为新添加的节点运行一次。在编写处理数据库写入的函数时,这是一个常见的错误。当您在某个位置处理初始写操作的事件,然后对同一位置执行第二次写操作时,第二次写操作将触发另一个事件,该事件将再次运行函数,依此类推,这将是一个无限循环 函数中需要一些逻辑来确定第二个写事件是否不应重新写入数据库。这将停止循环。在您的情况下,不需要函数来设置上次更新时间。您可以在客户机上使用一个特殊值来告诉服务器将当前时间插入到字段中
道格是正确的。此外,如果您的函数卡在无限循环中,让它停止的方法是重新部署您的函数(使用
firebase deploy
)并修复循环,或者完全删除该函数(通过从index.js
中删除它并运行firebase deploy
).我有一个确切的问题。这里有两个问题。如何在无限循环开始后停止它。已经回答了。但真正的问题是如何使用Firebase Cloud函数触发器向对象添加LastUpdate日期字段
下面是我处理onWrite()
循环问题的尝试
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.onWriteFeatherUpdateSummary = functions.database.ref('/messages/{id}')
.onWrite((change, context) => {
// Grab the current value of what was written to the Realtime Database.
let updated = change.after.val();
// Grab the previous value of what was written to the Realtime Database.
const previous = change.before.val();
let isChanged = true;
let isCreated = (previous === null); // object 'created'
// Only when the object gets updated
if (!isCreated) {
// An object should never directly change the lastUpdated value, this is for trhe trigger only
isChanged = (updated.lastUpdated === previous.lastUpdated);
}
console.log(`isChanged: ${isChanged} ; isCreated: ${isCreated}`);
if(isChanged) {
// Insert whatever extra data you wnat on the update trigger
const summary = `This is an update!`;
// Add a 'createdDate' field on the first trigger
if (isCreated) {
// Make sure your object has a createdDate (Date) before the lastUpdated (Date)!
Object.assign(updated,
{
createdDate : admin.database.ServerValue.TIMESTAMP
}
);
}
// Add lastUpdated Date field on very update trigger (but not when you just changed it with the trigger!)
Object.assign(updated,
{
summary : summary,
lastUpdated : admin.database.ServerValue.TIMESTAMP
}
);
}
return change.after.ref.set(updated);
});
谢谢你的回答。像这样更新上一次更新的时间戳并不是我真正想要做的事情,而是我认为在尝试云功能时会做的事情。这是公平的——像这样自动更新值肯定是一个用例。有时要确保在这种终止情况下编码可能会很棘手。:-)是的,当我犯这个错误时,我很高兴我没有参加有报酬的计划我不知道要收多少钱。我让它运行了一整晚,在功能控制台上可以看到许多无法调用功能的日志,因为配额已达到。感谢您提供有关停止云功能的提示。真的希望将来能够通过管理门户禁用功能:)您不能删除index.js然后运行
firebase部署
。它抛出错误:functions\index.js不存在,无法部署Firebase函数
没错-要删除所有函数,您需要从index.js
中删除所有函数,但在运行Firebase deploy
时保持文件(空)。请检查下面的答案