我正在使用Flutter构建可访问Firebase数据库的应用程序。从Flutter方面来看一切都很好。。。。但是,我是Node.js和Cloud Functions的新手。我正在尝试创建一个Node.js函数,以对一个Firebase数据库节点上的记录的删除事件做出反应,然后从其他两个Firebase数据库节点中删除记录,并从Firestore中删除图像文件。
我通过functions.database.onDelete
调用对触发事件做出反应,没问题,但是遇到了下一个障碍,即试图读取admin.database以获取快照。
我创建了一个虚拟函数,该函数使用.onUpdate
来接收触发事件(不想像使用.onDelete
一样继续创建数据),然后尝试读取我的Firebase数据库以访问其他节点。触发事件很好,但我似乎没有数据库引用Url来进行读取...但是它是同一数据库。调用process.env.FIREBASE_CONFIG
在控制台日志上的输出表明存在Url。
附带的功能代码也带有注释,以显示我在控制台日志上获得的各种输出。
我为此感到疯狂.....请谁能告诉我我要去哪里错了。最近两天一直在搜索Google,Stackoverflow和Firebase文档:-(
const admin = require("firebase-admin"); // Import Admin SDK
const functions = require("firebase-functions"); // Import Cloud Functions
admin.initializeApp({
credential: admin.credential.cert(
require("./user-guy-firebase-adminsdk.json")
)
});
exports.testDeleteFunction = functions.database
.ref("/user-guys/{userGuyId}")
// Using .onUpdate as I don't want to keep restoring my data if I use .onDelete
.onUpdate((snapshot, context) => {
const userData = snapshot.after.val();
const userId = userData.userId;
console.log('userId: ' + userId); // Gives correct console log output: userId: wajzviEcUvPZEcMUbbkPzcw64MB2
console.log(process.env.FIREBASE_CONFIG);
// Gives correct console log output:
// {"projectId":"user-guy","databaseURL":"https://user-guy.firebaseio.com","storageBucket":"user-guy.appspot.com","cloudResourceLocation":"us-central"}
// I have tried each of the four following calls and received the console log message as indicated after each.
//
// var root = admin.database.ref(); // Console Log Message: TypeError: admin.database.ref is not a function
// var root = admin.database().ref(); // Console Log Message: Error: Can't determine Firebase Database URL.
// var root = admin.database.ref; // Fails at line 31 below with the message indicated.
// var root = admin.database().ref; // Console Log Message: Error: Can't determine Firebase Database URL.
console.log(root.toString); // Console Log Message: TypeError: Cannot read property 'toString' of undefined.
// This is intended to read a chat thread for two users but processing never gets here.
var database = root.child('chats').child('0cSLt3Sa0FS26QIvOLbin6MFsL43GUPYmmAg9UUlRLnW97jpMCAkEHE3');
database
.once("value")
.then(snapshot => {
console.log(snapshot.val());
}, function (errorObject) {
console.log("The read failed: " + errorObject.code);
});
return null; // Will do stuff here once working.
});
代码注释中显示的错误消息。
答案 0 :(得分:1)
您需要在admin.initializeApp中添加数据库URL
admin.initializeApp({
databaseURL:"your_database_url"
});
答案 1 :(得分:0)
如果要使用FIREBASE_CONFIG中的配置,则应初始化不带参数的Admin SDK:
admin.initializeApp();
这将为您的项目使用默认服务帐户,该帐户应具有对数据库的完全读写访问权限。
答案 2 :(得分:0)
请参阅:
尝试不使用参数进行初始化。
也可以不使用任何参数初始化SDK。在这种情况下,SDK使用Google Application Default Credentials并从FIREBASE_CONFIG环境变量中读取选项。如果FIREBASE_CONFIG变量的内容以{开头,它将被解析为JSON对象。否则,SDK会假定该字符串是包含选项的JSON文件的名称。
const admin = require("firebase-admin"); // Import Admin SDK
const functions = require("firebase-functions"); // Import Cloud Functions
admin.initializeApp();