【问题标题】:Updating a ref in a change Firebase trigger in Google Cloud Functions在 Google Cloud Functions 中的更改 Firebase 触发器中更新 ref
【发布时间】:2017-09-18 17:31:07
【问题描述】:

我有一个如下所示的 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 中的列表项的最佳方法是什么?

【问题讨论】:

  • 有什么理由不能简单地触发/messages/{messageId}?所以functions.database.ref('/messages/{messageId}').
  • 当我调用 push() 时,消息 id 是由 firebase 生成的,所以问题是 - 我如何从更改中获取消息 id?
  • const messageId = event.params.messageId
  • 获取引用路径通配符是expained here
  • 我刚刚得到了你的两个答案。如果我在 /messages/{messageId} 上收听,有什么方法可以从事件中获取 ref 还是需要使用 db.ref('/messages').child(event.params.messageId); 构建它?

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


【解决方案1】:

我认为这完成了你想做的事情,也回答了你在 cmets 中的问题:

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(),
            });
        })
});

【讨论】:

    猜你喜欢
    • 2020-02-04
    • 1970-01-01
    • 2017-10-18
    • 2021-02-04
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    相关资源
    最近更新 更多