我觉得我在这里只是遗漏了一些愚蠢的东西,因为包括codelab在内的所有例子都表明访问事件数据非常简单。但我无法让它发挥作用。
我有一个简单的聊天/对话结构,如下所示:
conversations/uniqueconversationId/uniquemessageId/
并且在唯一消息中我存储文本,用户等。每次在应用程序中发布新消息时,我都会向对话推送新消息。
在云端功能中,我想知道何时发布新邮件并发送通知。这几乎与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()。text并获取“Test message sent。”
您可以指出我的任何方向将不胜感激。感谢。
答案 0 :(得分:3)
您在写入一个级别太高时触发。您希望写入消息ID:
functions.database.ref('/conversations/{conversationId}/{messageId}').onWrite(...)
然后快照将用于messageData
下的messageId
,而不是对话中所有消息的列表。