【发布时间】:2020-12-31 00:26:08
【问题描述】:
我正在使用带有 bubble 的 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, the app has access to read and write all data, 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, the app has access to read and write all data, 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}
2020 年 12 月 29 日美国东部标准时间 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 }
})
【问题讨论】:
标签: node.js firebase firebase-realtime-database firebase-admin