Javascript Firebase管理员赢得';t写入数据库,不提供任何错误

Javascript Firebase管理员赢得';t写入数据库,不提供任何错误,javascript,node.js,firebase,firebase-realtime-database,firebase-admin,Javascript,Node.js,Firebase,Firebase Realtime Database,Firebase Admin,Firebase admin未写入数据库 我正在实例化数据库: var db = admin.database(); 然后设置我想要的表的引用: var systemsRef = db.ref("systems/"); 然后我有一个函数来检查“系统”(一个加密的硬件id)是否存在 到目前为止,返回的false;这是真实的,因为它还不存在。如果系统不存在,它将写入数据 const sysID = getSysID(); var sys.info.name = generateUniqueSys

Firebase admin未写入数据库

我正在实例化数据库:

var db = admin.database();
然后设置我想要的表的引用:

var systemsRef = db.ref("systems/");
然后我有一个函数来检查“系统”(一个加密的硬件id)是否存在

到目前为止,返回的
false
;这是真实的,因为它还不存在。如果系统不存在,它将写入数据

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);
      });
  });
}
我已经做了实验,暂时将我的原型数据库完全公开了几分钟,只是为了确保我的
规则
不是问题所在。。。他们不是:仍然不是布埃诺。没有写入数据库。。。并且没有错误

我尝试了不同的
设置
,请确保:

msystemsRef.set("I'm writing data", function(error) {
  if (error) {
    alert("Data could not be saved." + error);
  } else {
    alert("Data saved successfully.");
  }
});
同样,我使用的是一个管理员帐户,有
public
规则,所以我应该看到一个现在
我正在写数据的
表,就在root下面。没什么

因此,我改变了策略,并尝试使用罐装教程推送到数据库,而我的数据库仍然是完全公开的:

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

什么都没有。。。想要我丢失吗?

isSystemRegistered
中,您正在返回
isTrue
的同步值,该值是
未定义的

您应该返回
.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版本是什么
  • 这在你的电脑上成功运行了吗

确保凭据和数据库URL正确无误

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

我明天会查一下,然后再和你联系,谢谢!我将投票,因为你是正确的,但是,我没有提到这个问题发生在Raspberry Pi上(而且只有在那里),当我最初问这个问题时,我没有完全证实这个事实。我会更新我的问题。如果您愿意,请参阅我对另一个答案的评论以了解更多详细信息。您在raspberry上使用的是哪种NodeJS版本?@nonreature0714我看到同样的问题也在raspberry Pi上运行。你发现这是不是直接原因了吗?如果是这样,你是怎么解决的!?我有同样的问题…@FamicTech不,我还没有解决它。这仍然是一个问题——我在一次会议上向谷歌提交了一个bug。但我们会看到,很难克服噪音。你提出了一个好的观点,我会仔细检查凭证和URL。我认为它们是正确的,因为我在我的MacBook和LinuxVM上使用了相同的凭证/URL进行了测试,它在那里工作。但是我遇到了一个问题,就是在Raspberry Pi上使用了相同的代码/包,但它不起作用。我意识到这是我没有提到的。我将继续投票,因为这是关于主题和有效的,尽管我相当确定我使用了正确的凭证/URL,基于三分之二的系统成功。
// (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);