2

Firebase管理員不會寫入數據庫。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沒有問題......他們不起來:仍然沒有布埃諾。沒有寫入數據庫...和沒有錯誤

我嘗試了不同的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表,僅低於根。沒什麼......

所以我切換戰術,試圖推到數據庫與罐裝教程,用我的數據庫仍然完全公開:

systemsRef.push({sysID : sys.info.name}); 

並沒有什麼...想我缺少什麼?

+0

你解決了嗎?我有同樣的問題... –

+0

@FamicTech不,我還沒有解決它。這仍然是一個問題 - 我在一次會議上向Google提交了一個bug。但我們會看到 - 很難超越噪音。 – NonCreature0714

回答

1

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); 
    }); 
} 

運行在樹莓派提出了一些更多的問題。

  • 它如何連接到互聯網?
  • 連接速度有多快?
  • 您運行的是什麼NodeJS版本?
  • 這是否已成功在您的PC上運行?
+0

明天我會檢查一下,並回復你,謝謝! – NonCreature0714

+0

我打算投票,因爲你是正確的,但是,我沒有提到這個問題正在發生在樹莓派(並且只有在那裏),這是我最初提出問題時未完全驗證的事實。我會更新我的問題。如果你喜歡,請參考我對另一個答案的評論以獲得更多細節。 – NonCreature0714

+0

你在樹莓上使用了哪個NodeJS版本? – idan

1

確保證書和databaseURL是正確的。

admin.initializeApp({ 
    credential: admin.credential.cert(serviceAccount), 
    databaseURL: databaseURL 
}); 

檢查,如果他們匹配 - 從另一個現有應用程序一個應用程序,並databaseURL憑證可能會產生這樣的結果。

如果您不是從文件加載憑證的數據,而是從其他地方加載憑證的數據,請確保它未被修改 - 將憑證的數據置於shell變量時,私鑰中的換行符有問題。

+0

您提出了一個很好的觀點,我會仔細檢查憑據和URL。我認爲他們是正確的,因爲我在我的MacBook和LinuxVM上使用相同的憑證/ URL進行測試,它在哪裏工作。但是遇到問題的地方是在Raspberry Pi上使用相同的代碼/軟件包,但它沒有工作。我意識到這是我沒有提到的。我要去投票,因爲這是關於主題和有效的,但我相當肯定我在3個系統中的2個系統上使用了基於成功的正確憑證/ URL。 – NonCreature0714

相關問題