javascript - 在 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
触发器中节点的子节点数量?
解决方案
了解 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
});
});
推荐阅读
- javascript - 排序 Apache SOLR 搜索结果 - 句子
- python - Python,将两个列表元素放在一起
- perl - perl 无法识别全局符号
- superset - Apache superset - 无法在 Macbook 中找到 Superset 文件夹
- java - 首先检查结果是否为null时如何避免冗余方法调用?
- r - 比较两个表之间的列类型
- xamarin - 使用单一代码库的不同组织的多个应用程序
- mysql - 在 MySQL 中使用 union 维护订单
- php - Dompdf 在本地工作,但不能在线
- django - 如何从 ListCreateAPIView 通用视图记录异常