[英]Firebase-admin won't write to database, gives no errors
Firebase 管理員未寫入數據庫。
我正在實例化數據庫:
var db = admin.database();
然后設置對我想要的表的引用:
var systemsRef = db.ref("systems/");
然后我有一個函數來檢查“系統”(一個加密的硬件 ID)是否存在。
function isSystemRegistered(id){
var isTrue;
systemsRef.once('value', function(snapshot) {
isTrue = (snapshot.hasChild(id))? true : false;
});
return isTrue;
}
其中,截至目前還返回false
; 這是true
,因為它還不存在。 如果系統不存在,則寫入數據。
const sysID = getSysID();
var sys.info.name = generateUniqueSystemName();
if(isSystemRegistered(sysID){
console.log("system is already registered!");
} else {
msystemsRef.set({
sysID : sys.info.name
}, function(error){
console.log('There was an error while attempting to write to database: ' + error);
});
});
}
我已經嘗試過,並暫時將我的原型數據庫完全公開了幾分鍾,只是為了確保我的rules
不是問題......他們不是:仍然沒有 bueno。 沒有寫入數據庫......並且沒有錯誤。
我嘗試了不同的set
,請確保:
msystemsRef.set("I'm writing data", function(error) {
if (error) {
alert("Data could not be saved." + error);
} else {
alert("Data saved successfully.");
}
});
同樣,我使用的是具有public
規則的管理員帳戶,所以我現在應該看到一個I'm writing data
表,就在 root 下。 沒有...
所以我改變了策略並嘗試使用罐頭教程推送到數據庫,我的數據庫仍然完全公開:
systemsRef.push({sysID : sys.info.name});
什么都沒有...想要我失蹤嗎?
在isSystemRegistered
您將返回isTrue
的同步值,它是undefined
。
您應該返回.once('value')
方法的承諾,並在調用方法中附加一個then()
以檢查它是否存在。
您還可以使用snapshot.exists()
檢查引用是否存在。
編輯:
建議編輯:
var systemRef = admin.database('system');
function isSystemRegistered(id) {
return systemRef.child(id).once('value')
.then(function (snap) {
return snap.exists();
});
}
function writeData(aSystem) {
var sysId = generateUniqueSystemName();
return systemRef.child(sysId)
.once('value')
.then(function (snapshot) {
if (!snapshot.exists()) {
return systemRef.child(sysId).update(aSystem);
}
// Here `sysId === snapshot.key`
return systemRef.child(sysId).set(aSystem);
})
.catch(function (err) {
console.error(err);
});
}
在 Raspberry Pi 上運行會引發更多問題。
確保憑據和 databaseURL 正確。
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: databaseURL
});
檢查它們是否匹配 - 來自一個應用程序的憑據和來自另一個現有應用程序的 databaseURL 可能會產生這樣的結果。
如果您不是從文件而是從其他地方加載憑證數據,請確保它沒有被修改 - 在將憑證數據放入 shell 變量時,我在私鑰中遇到了換行符問題。
同樣的問題在這里。 我最終意識到數據庫在命令被發送到 firebase 之前就離線了。 這是有道理的,因為沒有錯誤,因為它甚至從未發送過請求。
例如。 .set({blah: 123})
不會立即傳輸到服務器。 相反,某些東西被放置在節點事件隊列中以執行。 如果您讓數據庫過早脫機,它將不會處理隊列。
也許(像我一樣)你正在調用admin.database().goOffline();
在腳本的末尾? 如果是這樣,您可能只需要推遲或延遲離線方法,直到傳輸之后。
// (TYPESCRIPT)
import * as admin from 'firebase-admin';
let app = admin.initializeApp({
credential: admin.credential.applicationDefault(),
databaseURL: "https://blahblah.firebaseio.com/",
});
admin.database().ref().push({ something: 123 }).then(() => {
console.log("push complete");
});
// delay before going offline
setTimeout(() => {
admin.database().goOffline();
process.abort();
}, 2000);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.