Javascript Firebase管理员赢得';t写入数据库,不提供任何错误
Firebase admin未写入数据库 我正在实例化数据库: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
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);