微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么使用管理员时firebase返回null

如何解决为什么使用管理员时firebase返回null

我正在使用带有气泡的 firebase admin sdk 作为 nodejs 项目

这是我正在尝试的代码。这不起作用。我已经在底部包含了更新的代码,但暂时保留这个,希望其他人可以从我的错误中吸取教训。

function(properties,context) {
    console.log('trying')
    var list = []
    var util = require("util")

    var admin = require('firebase-admin');

    var serviceAccount = <copIED/PASTED FROM FIREBASE>

    // Fetch the service account key JSON file contenT


    if (admin != null) {
        admin.initializeApp({
            credential: admin.credential.cert(serviceAccount),databaseURL: "https://login-database-brc.firebaseio.com"

        })
        list.push('logged into app')
        var db = admin.database();
        var ref = db.ref('BRC/4jV39aEK6jOecLdKONJMKatsEYn1/data')


        ref.once('value').then((snapshot) => {
            snapshot.val().forEach(element => {
                list.push('check')
                list.push(element.Name)

            })


        });
    } else {
        list.push('nothing happened')
    }



    // As an admin,the app has access to read and write all data,regardless of Security Rules



    return {
        data: list
    }

}

这是规则

{
    "rules":{
      "BRC": {
        "$uid":{ 
            ".read": "$uid === auth.uid",".write": "$uid === auth.uid"
        }
    }
}
}

我最终只在输出列表中看到“已登录”。我希望看到数据桶中每个对象的 name 属性

我能够使用标准 sdk 并使用密码身份验证使这项工作在客户端正常运行。我似乎无法超越初始化应用 Firebase 实例。

我确实有 /BRC 带有需要身份验证的规则,但是对于服务器 SDK,我认为这无关紧要

我想访问 BRC/4jV39aEK6jOecLdKONJMKatsEYn1/data 中保存的所有对象

[更新代码以执行同步操作]

function(properties,context) {
var serviceAccount = {'jsonObjectFromFirebase'};
var list =[];

var admin = require("firebase-admin");


// Initialize the app with a service account,granting admin privileges
if (!admin.apps.length){
    initializeApp(serviceAccount)
};

// As an admin,regardless of Security Rules
    
admin.database().ref('test').once('value')
    .then((snapshot) => {
    snapshot.val().forEach(element => {
        let a = element.name;
        list.push(a);
     })
    
    return_data(list)
    
});
    
function return_data (list){
    return { data: list};
};
    
function initializeApp (serviceAccount){
    admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),databaseURL: "https://thunkableproject-f51d9-default-rtdb.firebaseio.com"
});
}


}

问题是现在从未调用过 return_data。所以我不确定这里发生了什么。

[更新2,再次尝试创建同步调用


var list =[]

var admin = require("firebase-admin");


// Initialize the app with a service account,granting admin privileges
if (!admin.apps.length){
    initializeApp(serviceAccount)
}

// As an admin,regardless of Security Rules
    
admin.database().ref('BRC/4jV39aEK6jOecLdKONJMKatsEYn1/data').once("value",function(snapshot){
    let element = snapshot.val()
    let list = []
    for (var key in element) {
       list.push(element[key].Name) 
    }
    
    return_data(list)
  })

    
function return_data (list){
    return { data: list}
}
    
function initializeApp (serviceAccount){
    admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),databaseURL: "https://login-database-brc.firebaseio.com"
});
}

我也试过没有用

    
var promise = admin.database().ref('BRC/4jV39aEK6jOecLdKONJMKatsEYn1/data').once("value");
    
promise.then(snapshot => {
    let element = snapshot.val()
    let list = []
    for (var key in element) {
       list.push(element[key].name) 
    };})
.catch(error => {
    alert(error)
});
    
return { data: list}

美国东部标准时间 12/29/20 9:23 更新

我想我现在以异步方式调用这个函数,应该等待回调。现在的问题是 .then() 中的代码永远不会执行。


function getData() {
   var promise = admin.database().ref('BRC/4jV39aEK6jOecLdKONJMKatsEYn1/data').once("value");

   promise.then(snapshot => {
      let element = snapshot.val()
      let list = []
      for (var key in element) {
         list.push(element[key].Name)
      };
      return list;
   })
      .catch(error => {
         return error
      });

   return promise;
}




getData().then((list) => {
   return { "data": list }
})

解决方法

问题是您的 return { data: list }list.push(element.Name) 发生之前运行。这是因为数据是从 Firebase 异步加载的,并且超出了您预期的顺序。这种行为在客户端和服务器端 SDK 上是相同的,并且在现在大多数基于云的 API 中都是一样的。

典型的解决方案是返回一个承诺,而不是实际值。我建议您阅读以下内容,而不是在此处进行解释:


编辑

在您的编辑中,您必须返回承诺。例如在这样定义的函数中:

function getData() {
  var promise = admin.database().ref('BRC/4jV39aEK6jOecLdKONJMKatsEYn1/data').once("value");
    
  promise.then(snapshot => {
    let element = snapshot.val()
    let list = []
    for (var key in element) {
       list.push(element[key].name) 
    };
    return list;
  })
  .catch(error => {
    alert(error)
  });
    
  return promise;
}

现在你可以像这样使用这个函数:

readData().then((list) => {
  console.log(data);
})

请注意(如评论中所述)这不会使代码同步,因为这是不可能的。它只是将承诺返回给调用者,然后调用者用 then“等待”数据可用。

如果您在一个足够现代的平台上,您也许可以在最后一个片段中使用 await

var list = await readData();
console.log(data);

虽然这看起来更熟悉,但它在幕后仍然做着完全相同的事情,并且同步。

,

我在朋友的帮助下听取了您的反馈 Frank van Puffelen。

function(properties,context) {
    var serviceAccount = <serviceAccountPath>


    var admin = require("firebase-admin");


    // Initialize the app with a service account,granting admin privileges
    if (!admin.apps.length) {
        initializeApp(serviceAccount)
    }

    function initializeApp(serviceAccount) {
        admin.initializeApp({
            credential: admin.credential.cert(serviceAccount),databaseURL: "https://login-database-brc.firebaseio.com"
        });
    }


    let list = context.async(async callback => {
        try {
            const snapshot = await admin.database().ref('BRC/4jV39aEK6jOecLdKONJMKatsEYn1/data').once("value");
            const element = snapshot.val()
            let list = []
            for (key in element) {
                list.push(element[key].Name)
            };
            callback(null,list);
        } catch (err) {
            callback(err);
        }
    })

    return {
        "data": list
    }


}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?