0

我遇到了對Firebase函數事件缺乏理解的情況。爲了使我的功能按預期工作,我爲參考路徑增加了更多的特殊性,然後我認爲這是必需的。Firebase函數onCreate()onDelete()路徑特異性

例如,我想增加或孩子被添加到或從該路徑刪除每次計數遞減:

/invites

我用這些作爲我的功能來實現:

functions.database.ref('/invites').onCreate(event => { 
    return admin.database().ref('/counter').transaction((current) => { 
    return (current || 0) + 1; 
    }) 
}); 

functions.database.ref('/invites').onDelete(event => { 
    return admin.database().ref('/counter').transaction((current) => { 
    if (current >=1) return (current - 1); 
    else return; 
    }) 
}); 

This是我根據我的路徑:

路徑規範匹配所有觸及路徑的寫入,包括髮生在其下的任何寫入。

/富/酒吧

/富/酒吧/巴茲/真的/深/路徑

:如果您設置的路徑爲你的功能/富/酒吧,它在這兩個位置的匹配事件

在我的情況下,/invites將等於該例子中的/bar

但是,上述功能只會觸發第一個孩子被添加到/invites以及最後一個孩子被刪除。在這兩種情況之外,其他任何事情都不會觸發計數器功能。我已經能夠使這項工作的唯一方法是通過使用這個作爲我的路徑:

invites/{idOfInvite}

雖然我知道這會工作,我不知道,這正是我需要的。稍後我可能會決定在某個{idOfInvite}的路徑下添加新的數據,這會導致我的計數器函數觸發(我認爲?)。

這個SO answer表示我的函數的行爲是預期的,但這不是我期望基於我對文檔的理解。也許我錯誤地解釋了文檔?

正如你所看到的,我對這些添加/刪除事件如何觸發的理解有些偏離。

回答

4

onCreate只有在數據庫中新創建給定路徑時纔會被調用。如果路徑已經存在(即它已經有一個孩子),那麼添加另一個孩子不是該路徑上的「創建」事件。這是一個更新事件。所以,如果你的函數使用了onUpdate,那麼只要寫入該路徑下的任何東西,它就會被觸發。

您使用的onCreate/onDelete在/invites/{id}對您的用例是正確的,因爲它有效地要求在新創建或刪除/invites的任何單個子項時被調用。