在Google Cloud Functions中更改Firebase触发器中的参考

时间:2017-04-21 16:07:44

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

我有一个messages条目,如下所示:

firbaseapp
 messages
   -KiG85eYMH7jfKph4bl3
      created: 1492788734743
      title: "title"
      message: "message"

我希望在将新条目添加到此列表时发送通知 我添加了这个云功能:

exports.sendMessageNotification = functions.database.ref('/messages/').onWrite(event => {

    event.data.forEach(message => {

        if (message.val().notificationSent) {
            return;
        }

        admin.messaging().sendToTopic(...)
        .then(res => {
            return db.ref('/messages').child(message.key).update({
                notificationSent: (new Date()).getTime(),
            });
        })
    });
});

问题是message.keymessages-KiG85eYMH7jfKph4bl3所以当我尝试保存它时,它会创建一个新条目而不是更新现有条目:

firbaseapp
 messages
   -KiG85eYMH7jfKph4bl3
      created: 1492788734743
      title: "title"
      message: "message"
   -messages-KiG85eYMH7jfKph4bl3
      notificationSent: 123434554534

我想要的是在现有条目上设置notificationSent

我也尝试使用message.ref,但我得到了相同的结果。

那么在云功能中更新firebase中列表项的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

我认为这可以完成您想要做的事情,并在评论中回答您的问题:

exports.sendMessageNotification = functions.database.ref('/messages/{messageId}')
  .onWrite(event => {
    const messageId = event.params.messageId;
    console.log('messageId=', messageId);

    if (event.data.current.child('notificationSent').val()) {
        console.log('already sent');
        return;
    }

    const ref = event.data.ref; // OR event.data.adminRef

    admin.messaging().sendToTopic(...)
        .then(res => {
            return ref.update({
                // Caution: this update will cause onWrite() to fire again
                notificationSent: (new Date()).getTime(),
            });
        })
});