2017-03-16 109 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

功能請求注意,謝謝! :) –

相關問題