首页 > 解决方案 > 在 Firebase 云函数中计算子项

问题描述

我正在学习使用 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触发器中节点的子节点数量?

标签: javascriptfirebasefirebase-realtime-databasegoogle-cloud-functionsdatabase-trigger

解决方案


了解 javascript 承诺对于确保云功能为您正常工作至关重要。

在这种情况下,您需要链接返回的 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
    }); 
 });

推荐阅读