3

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看到一个 now表。I'm writing data没有什么...

所以我改变了策略并尝试使用预制教程推送到数据库,而我的数据库仍然完全公开:

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

什么都没有……我想我失踪了吗?

4

3 回答 3

1

isSystemRegistered你返回的同步值isTrueundefined.

您应该返回方法的承诺,.once('value')并在调用方法中附加 athen()以检查它是否存在。

您还可以使用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 上成功运行?
于 2017-01-24T17:57:17.033 回答
1

确保凭据和 databaseURL 正确。

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

检查它们是否匹配 - 来自一个应用程序的凭据和来自另一个现有应用程序的 databaseURL 可能会产生这样的结果。

如果您不是从文件中加载凭证数据,而是从其他地方加载,请确保它没有被修改 - 将凭证的数据放入 shell 变量时,我遇到了私钥中的换行符问题。

于 2017-05-17T14:34:03.840 回答
0

这里同样的问题。我最终意识到,甚至在命令发送到 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);
于 2019-06-11T12:04:02.000 回答