2017-03-16 108 views
5

我只是尝试了Firebase的云端函数,尝试将我的firebase-queue工作人员移至云端函数。每当我在给定的ref处创建一个新节点时,我添加了一个简单的函数来添加上次更新的时间戳。功能如下:多次调用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_added并为所有现有实体运行该函数?

每当我再次更改和部署函数时,这个操作是否会重复?

我期待它只为新添加的节点运行一次。

+0

查看下面的答案 –

回答

5

编写处理数据库写入的函数时,这是一个常见的错误。当你在一个位置处理初始写入的事件时,再做一次写回到同一位置,第二次写入将触发另一个将再次运行该函数的事件,等等,这将是一个无限循环。

您的函数中需要一些逻辑来确定第二个写入事件是否不应该重新写入数据库。这将停止循环。在你的情况下,你不需要一个函数来设置最后一次更新时间。您可以通过客户端上的特殊值来完成此操作,以告诉服务器将当前时间插入字段中。

https://firebase.google.com/docs/reference/js/firebase.database.ServerValue#.TIMESTAMP

+0

感谢您的回答。像这样更新最新更新的时间戳并不是我想要做的事情,而只是我认为会尝试使用云功能的事情。 –

+0

这很公平 - 自动更新这样的值绝对是一个用例。确保在终止情况下进行编码有时候会非常棘手。 :-) –

+0

是的,我只是很高兴,当我犯这个错误时,我没有付费计划。 :)不知道我会被收取多少。我让它在一夜之间运行,我可以在功能控制台上看到许多日志,因为配额已达到,所以无法调用功能。 –

8

道格是正确的。此外,如果知道如果函数停留在无限循环中,停下来的方法可能是重新部署函数(使用firebase deploy)并修复循环,或者完全删除函数(将其从index.js中删除并运行firebase deploy)。

+1

感谢您关于停止云端功能的提示。 –

+2

真的希望有一种方法可以通过管理门户在将来禁用功能.. :) – mtb

+1

功能请求注意,谢谢! :) –

相关问题