【问题标题】:Counting Children in a firebase Cloud Functions在 Firebase 云函数中计算子项
【发布时间】:2020-03-19 22:38:03
【问题描述】:

我正在学习使用 firebase,我需要一些帮助。 我需要在 Firebase 函数中获取特定节点的子节点数,但我不能。

这是我的节点:

我想写一个触发器,在watingRoom创建新用户后,检查waitingRoom中的用户总数,并根据这个数字返回不同的东西。

这是我的代码:

exports.createOtherNode = functions.database
.ref('/waitingRoom/{userID}')
.onCreate((snapshot, context) => {

    const usersInWatingRoom = snapshot.ref.parent.once('value', (datasnapshot) => {
        const numberOfChildren = datasnapshot.numChildren()
        return numberOfChildren
    });
    console.log(usersInWatingRoom)

    if(usersInWatingRoom > 100)
      //RETURN SOMETHING
    else
      //RETURN SOMETHING ELSE    

 });

代码有效,但 usersInWatingRoom 像承诺一样返回,而不是数字。

(console log: Promise {
  <pending>,
  domain: 
   Domain {
     domain: null,
     _events: { error: [Function] },
     _eventsCount: 1,
     _maxListeners: undefined,
     members: [] } }
)

我期望值​​为 2,以便我可以在 if 上工作。

如何解决这个问题?您是否建议我另一种方法来获取onCreate 触发器中节点的子节点数?

【问题讨论】:

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


    【解决方案1】:

    了解 javascript promise 是 essential 以确保云功能为您正常工作。

    在这种情况下,您需要链接返回的 Promise 来完成额外的工作。

    您还需要确保使用once 的承诺形式,以确保获得确定性的结果。回调形式在云函数环境中将无法正常工作,因为函数可以在回调之前终止。

    请注意,从后端函数返回一个值(除了返回一个 Promise)没有多大意义——因为没有调用者会得到结果(当然,做一些事情,比如进一步的数据库更新,确实有道理)。

    无论如何,您需要做的大致如下:

    exports.createOtherNode = functions.database
      .ref('/waitingRoom/{userID}')
      .onCreate((snapshot, context) => {
    
        return snapshot.ref.parent.once('value').then((datasnapshot) => {
            const numberOfChildren = datasnapshot.numChildren()
            return numberOfChildren
        }).then((usersInWaitingRoom) => {
            console.log(usersInWaitingRoom)    
            if(usersInWaitingRoom > 100)
              // Do Something
            else
              // Do Something Else
        }); 
     });
    

    【讨论】:

    • Okei,非常感谢!但是那么,有没有办法不用回调形式就可以得到numberOfChildren的值呢?
    • 这是承诺形式,而不是回调形式 :) 不,如果您想要 parent 子项计数,则不是,因为您需要再次调用数据库来获得它.如果您想要触发函数的/waitingRoom/{userID} 节点上的计数,该计数存在于您通过函数调用获得的快照中。
    猜你喜欢
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 2021-04-03
    • 2017-08-12
    • 1970-01-01
    相关资源
    最近更新 更多