使用Firebase从Cloud函数中的onWrite获取正确的event.data

时间:2017-06-13 19:42:52

标签: firebase firebase-realtime-database google-cloud-functions

我觉得我在这里只是遗漏了一些愚蠢的东西,因为包括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。”

您可以指出我的任何方向将不胜感激。感谢。

1 个答案:

答案 0 :(得分:3)

您在写入一个级别太高时触发。您希望写入消息ID:

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

然后快照将用于messageData下的messageId,而不是对话中所有消息的列表。