【问题标题】:Cloud Functions for Firebase child_addedFirebase 的云函数 child_added
【发布时间】:2017-08-22 05:24:06
【问题描述】:

我正在尝试 Cloud Functions for Firebase,创建一个函数,当新用户添加到数据库时(不在身份验证上),该函数将添加一个昵称。 从Firebase Documention我发现我需要使用:

ref.on("child_added", function(snapshot, prevChildKey) { 
    //Something
})

,但我什至无法部署该功能。我的代码是:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

var ref = admin.database().ref("/users");

ref.on("child_added", function(snapshot, prevChildKey) {
  console.log(snapshot)
})

有人可以帮我吗?

更新:

在处理之后,这是我的代码:

const functions = require('firebase-functions');
// Import Admin SDK
var admin = require("firebase-admin");
admin.initializeApp(functions.config().firebase);

var db = admin.database();
var ref = db.ref('users');
var childs = [];
var nicknames = [];

exports.newUser = functions.database.ref('users').onWrite(event => {
    const data = event.data.val();
    ref.on("child_added", function(snapshot, childKey) {
        if (!childs.includes(childKey)) {
            childs.push(childKey);
        };
        for (i in childs) {
            if (childs[i] == null) {
                childs.splice(i, 1);
            };
        };
    });

    ref.once("value", function(snapshot) {
        for (i in childs) {
            var child = data[childs[i]];
            if (!child.hasOwnProperty("nickname")) {
                console.log("Child does not have nickname: " + childs[i]);
                ref.child(childs[i]).update({
                    nickname: "user"+childs[i]
                });
            };
        };
    });
});

根据 Doug Stevenson 的回复,我仍然需要弄清楚只有在添加了一个新孩子(新用户)的情况下才能做到这一点

【问题讨论】:

  • 嗨,关于这个问题的任何解决方案?谢谢
  • 很遗憾没有。我找到的唯一解决方案是我在下面发布的解决方案,但它仍然会在每次向用户写入内容时触发,仅当直接在“用户”下方添加一个孩子时

标签: node.js firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

我想通了。这是我使用的代码:

const functions = require('firebase-functions');
var admin = require("firebase-admin");
admin.initializeApp(functions.config().firebase);

var childs = [];
var nicknames = [];

exports.newUser = functions.database.ref('users').onWrite(event => {
    ref.on("child_added", function(snapshot, childKey) {
        if (!childs.includes(childKey)) {
            childs.push(childKey);
        }
    });
});

我希望它只在添加孩子时调用,而不是每次写入数据库时​​调用(以限制使用)

【讨论】:

  • 我认为这不会如你所愿。如果您尝试在这样的函数中注册持久侦听器,将来肯定会遇到问题。如果您想知道何时添加了新节点,则必须检查事件中快照的先前值是否为空。这就是您知道写入添加新数据而不是修改现有数据的方式。
  • codelab 所建议的那样,if (snapshot.previous.val()) { return; } 是否足够
  • 是的@GlennHerping,正如对源代码的评论所解释的,//仅在创建新消息时发送通知。它应该可以工作。
猜你喜欢
  • 2019-01-18
  • 2017-12-24
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 2017-07-31
  • 2019-10-17
相关资源
最近更新 更多