Firebase上的Javascript:once(“value”)中出现错误。然后();

Firebase上的Javascript:once(“value”)中出现错误。然后();,javascript,node.js,firebase,firebase-realtime-database,firebase-admin,Javascript,Node.js,Firebase,Firebase Realtime Database,Firebase Admin,为了在Firebase上设置一些云函数,我在两天前开始学习Javascript,尝试在“AchievementCount_total”节点下计算和存储一些数据(请参考图了解数据库结构)。我已经成功地创建了节点。然而,存储在该节点下的数据并不是我所期望的。为了测试发生了什么,我修改了代码,如下所示: const functions = require('firebase-functions'); // The Firebase Admin SDK to access the Firebase Re

为了在Firebase上设置一些云函数,我在两天前开始学习Javascript,尝试在“AchievementCount_total”节点下计算和存储一些数据(请参考图了解数据库结构)。我已经成功地创建了节点。然而,存储在该节点下的数据并不是我所期望的。为了测试发生了什么,我修改了代码,如下所示:

const functions = require('firebase-functions');
// The Firebase Admin SDK to access the Firebase Realtime Database. 
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.updateScores = functions.database.ref('/users/{userUID}/achievements')
.onWrite(event => {
  var database=admin.database();
  var achievementsCount_total=new Array();//not important here
  for(var i=0;i<60;i++){achievementsCount_total[i]=0;}//not important here
  var allUsersRef=database.ref("/users");//a list containing all users
  var hasChildren=123;
  allUsersRef.once("value").then(function (snapshot)//SOMETHING WENT WRONG HERE!
  {
    hasChildren=snapshot.hasChildren();//either "true" or "false"
    snapshot.forEach(function(element) 
    {
      // . . . not important here
    });
  });
  return admin.database().ref("/achievementsCount_total").set(hasChildren);      
});
看起来函数甚至没有执行(因此变量“haschilds”的值仍然是123),我不知道为什么。有人知道答案吗?多谢各位~

allUsersRef.once("value").then(function (snapshot)//SOMETHING WENT WRONG HERE!
  {
    hasChildren=snapshot.hasChildren();//either "true" or "false"
    snapshot.forEach(function(element) 
    {
      // . . . not important here
    });
  });
是一个异步函数

return admin.database().ref("/achievementsCount_total").set(hasChildren);
不等待它运行,为了修复此问题,您必须在中返回它。然后()
这应该行得通

  return allUsersRef.once("value").then(function (snapshot)//SOMETHING WENT WRONG HERE!
  {
    hasChildren=snapshot.hasChildren();//either "true" or "false"
    snapshot.forEach(function(element) 
    {
      // . . . not important here
    });
    return admin.database().ref("/achievementsCount_total").set(hasChildren);
  });
  return allUsersRef.once("value").then(function (snapshot)//SOMETHING WENT WRONG HERE!
  {
    hasChildren=snapshot.hasChildren();//either "true" or "false"
    snapshot.forEach(function(element) 
    {
      // . . . not important here
    });
    return admin.database().ref("/achievementsCount_total").set(hasChildren);
  });