簡體   English   中英

Firebase-admin 不會寫入數據庫,不會出錯

[英]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 上運行會引發更多問題。

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

確保憑據和 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM