2017-03-11 150 views
0

我下面用它們的確切結構likes例如.numChildren()總是返回0

,但出於不同的目的:

/functions-project-12345 
    /db 
     /1 
      contacts_count: 0 
      /contacts 
       1: true 
       2: true 
       3: true 

CONTACTS_COUNT得到在正確的位置創建的,雖然由於某些原因,CONTACTS_COUNT保持返回0

exports.contactsCount = functions.database.ref('/db/{userid}/contacts').onWrite(event => { 
    return event.data.ref.parent.child('contacts_count').set(event.data.numChildren()); 
}); 

我也嘗試在/ db/{userid}/contacts/{id}處設置觸發器,並且在讀完所有文檔後,仍然無法使其返回正確的計數。

事實上,具有完全相同的結構,在喜歡例如:

/functions-project-12345 
    /posts 
     /key-123456 
      likes_count: 32 
      /likes 
       user123456: true 
       user456789: true 
       user786245: true 

和在服務器上運行:

exports.countlikes = functions.database.ref('/posts/{postid}/likes').onWrite(event => { 
    return event.data.ref.parent.child('likes_count').set(event.data.numChildren()); 
}); 

仍然保存成likes_count

event.data中的event.data.numChildren()對/ db/{的引用rid}/contacts節點,對嗎?

+0

嗨,我也有同樣的結果。 –

回答

2

UPDATE 04/13/17:下面的解決方案僅適用於您可以保證只添加(未刪除或更改)子節點並且不處理要刪除的計數節點的情況。要獲得更強大的解決方案,請查看更新的child count example in the firebase/functions-samples repo

我不確定你的代碼到底出了什麼問題(我剛剛測試過這個例子,它適用於我),但更安全的方法是使用transaction()而不是set()。修改您所提供的示例代碼,這將是這樣的:

exports. contactsCount = functions.database.ref('/db/{userid}/contacts') 
    .onWrite(event => { 
    var contactCountRef = event.data.ref.parent.child('contacts_count'); 
    return contactCountRef.transaction(function(currentCount) { 
     return (currentCount || 0) + 1; 
    }); 
    }); 

此代碼應爲你工作,因爲它不依賴於任何問題,您正在運行與numChildren(),它具有的是從安全的額外好處官方樣本中存在的競爭條件。實際上,我們正致力於更新示例以正確使用事務。