2017-06-13 26 views
1

我覺得我只是錯過了一些愚蠢的東西,因爲包括codelab在內的所有示例都表明訪問事件數據非常簡單。但我無法讓它工作。使用Firebase中的onWrite獲取適當的event.data

我有一個簡單的聊天/對話結構,看起來像: conversations/uniqueconversationId/uniquemessageId/ 和唯一的消息我保存的文本,用戶等每當一個新的消息發佈在應用程序裏面,我推一個新的消息給會話。

在Cloud Functions中,我想知道何時發佈新消息併發送通知。這與codelab示例幾乎完全相同。

exports.sendNotification = functions.database.ref('/conversations/{conversationId}').onWrite(event => { 
    const snapshot = event.data; 
    // Only send a notification when a new message has been created. 
    if (snapshot.previous.val()) { 
    return; 
    } 

    console.log(snapshot); 
    ... 

所有的例子都顯示訪問快照的價值很簡單,只要

const text = snapshot.val().text; 

但是,這並不爲我工作。當我嘗試訪問它時,它說它是未定義的。當我繼續檢查直接從codelab中獲取的snapshot.previous.val()時,它只是返回,即使我發佈了一條新消息。 (即使我拿出來,所以我可以記錄快照,它仍然不起作用。)

當我在控制檯中看,DeltaSnapshot是巨大的,幷包含對話中的所有消息對象。我無法按預期直接訪問新的消息值。

這是寫入數據庫的代碼塊(這是來自React,BTW)。這個寫法完美。

var messageData = { 
    user: { 
     _id: user.uid, 
     name: user.fullName 
    }, 
    text: messageText, 
    createdAt:firebase.database.ServerValue.TIMESTAMP, 
    sentToUser: conversation.recipientUid 
}; 


this.getRef().child('conversations').child(conversation.conversationId).push(messageData) 

這裏是JSON爲例消息:

{ 
    "-Km9qFcNClX3uQXX51D1" : { 
     "createdAt" : 1496978098834, 
     "text" : "Test message sent", 
     "user" : { 
     "_id" : "cKFnsNkYSyNXm5duUy", 
     "name" : "Test User" 
     } 
    } 
} 

理想的情況下,基於我希望能夠只使用snapshot.val的例子()文本,並獲得「測試消息發送「。

任何你可以指向我的方向將不勝感激。謝謝。

+0

請更新您的文章以包含將新消息寫入數據庫的語句。 –

+0

剛剛更新,包括它@BobSnyder –

回答

3

您正在觸發寫入一個級別太高。你要寫入消息ID:

functions.database.ref('/conversations/{conversationId}/{messageId}').onWrite(...) 

然後快照將是messageDatamessageId下,而不是在會話中所有郵件的列表。

+0

呃,我發誓我試過了。謝謝鮑勃的這個快速回應。完美的作品。 –

相關問題