【发布时间】:2017-06-13 19:42:51
【问题描述】:
我觉得我只是在这里遗漏了一些愚蠢的东西,因为包括 codelab 在内的所有示例都表明访问事件数据很简单。但我无法让它工作。
我有一个简单的聊天/对话结构,如下所示:
conversations/uniqueconversationId/uniquemessageId/
在唯一的消息中,我存储文本、用户等。每次在应用程序中发布新消息时,我都会将新消息推送到对话中。
在 Cloud Functions 中,我想知道何时发布新消息并发送通知。这与 codelab 示例几乎 100% 相同。
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,顺便说一句)。这篇写得很好。
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().text 并获得“已发送测试消息”。
您可以指出我的任何方向将不胜感激。谢谢。
【问题讨论】:
-
请更新您的帖子以包含将新消息写入数据库的语句。
-
刚刚更新以包含它@BobSnyder
标签: firebase firebase-realtime-database google-cloud-functions