Node.js 如何将firebase数据存储到本地的json
在我的情况下,我现在从firestore获得了数据,如何将其保存到Node.js 如何将firebase数据存储到本地的json,node.js,firebase,discord.js,Node.js,Firebase,Discord.js,在我的情况下,我现在从firestore获得了数据,如何将其保存到 serversettings.json: var temp = {} let query = db.collection('guilds') let data = query.get().then(snapshot => { snapshot.forEach(doc => { console.log(doc.id, '=>',doc.data()); })
serversettings.json
:
var temp = {}
let query = db.collection('guilds')
let data = query.get().then(snapshot => {
snapshot.forEach(doc => {
console.log(doc.id, '=>',doc.data());
})
所以我得到的输出是:
637301291068030997 => { welcomeChannelID: '<#648968505160630285>',
guildMemberCount: 4,
guildOwnerID: '348832732647784460',
guildOwner: 'Ethical Hacker',
prefix: '.',
guildID: '637301291068030997',
guildName: 'test server 3' }
我需要将数据保存到serversettings.json
await fs.writeFile ("../serversettings.json", JSON.stringify(temp), function(err) {
if (err) throw err;
console.log('done');
})
这里temp是一个变量,其中存储了多个数据,如a:{},b:{}
我尝试了var-temp={}temp.table=[]
然后temp.table.push(doc.id',:',doc.data())
但我得到的是空输出,那么我该怎么做才能得到预期的输出呢
此外,如果该对象已经存在于JSON
中,那么我如何更新这些值呢?上述函数是否会工作相同?它是否会覆盖相同的值,或者从中删除所有其他值示例update prefix。然后,等待fs.writeFile(“../serversettings.json”,json.stringify(temp),…”
因此temp字段的值仅为帮会id,该字段前缀是否会更新唯一的前缀,而不删除该数组中的任何其他内容
下面是向temp变量添加内容的代码
var temp = {}
temp.guilds = [] // after some lines
snapshot.forEach(doc => {
console.log(doc.id, '=>',doc.data()); // output is above this code
temp.guilds.push(doc.id = doc.data()) // output is below this code
})
以上代码输出
{ guilds:
[ { guildID: '637301291068030997', // here missing doc.id field
guildName: 'test server 3',
welcomeChannelID: '-',
guildMemberCount: 4,
guildOwnerID: '348832732647784460',
guildOwner: 'Ethical Hacker',
prefix: '.' },
{} // this missing thing before {} is (some number) also bracket is empty by the way so no worries
]
}
解决您的问题的快速方法是更换
let data = query.get().then(snapshot => {
与
这样,您的temp
对象可以在程序继续保存文件之前填充
我还没有使用过
writeFile
,但它是这么说的:
如果文件是文件名
,则异步将数据写入该文件,替换该文件(如果该文件已存在)
我认为你的对象不会太大,以至于完全覆盖是个问题,除非它经常改变。在这种情况下,我想你必须使用一种不同的方法来支持偏移量,这样你就可以只写改变了的内容,但这看起来真的是太过分了
关于JSON文件的格式,我认为您要做的是:
var temp = {};
temp.guilds = {};
snapshot.forEach(doc => {
console.log(doc.id, '=>', doc.data());
temp.guilds[doc.id] = doc.data();
});
我不确定,但firebase有将数据从object转换为JSON的方法,所以我认为这个解决方案应该可行
let query = db.collection('guilds')
let data = query.get().then(snapshot => {
let temp = snapshot.toJSON()
await fs.writeFile ("../serversettings.json", temp, function(err) {
if (err) throw err;
console.log('done');
})
})
query.get()。然后(snapshot=>{
是一个不同步的异步操作对于问题的第二部分,请参考此问题:snapshot.toJSON不是函数hmm,如果您尝试console.log(snapshot)
日志非常大,它包含签名和许多其他内容,而不是snapshot.toJSON()
JSON.stringify(snapshot)
正在工作,因此您现在可以将其写入文件我在将其保存到变量时遇到问题,因为临时变量的输出不是有效的JSONfile@ETHYT我不明白。JSON.stringify(temp)
正是这样做的:它为temp
创建了一个有效的json字符串。您能否显示代码中的问题所在?预期的输出是11digitnumer:{new array}
但是11digitnumber
在问题中缺少此部分637301291068030997=>
不在临时变量中,它直接从{welcomeChannelID:
@ETHYT啊,我明白了。你能展示一下在temp
变量中添加东西的代码吗?检查一下我在那里添加的问题temp变量代码
var temp = {};
temp.guilds = {};
snapshot.forEach(doc => {
console.log(doc.id, '=>', doc.data());
temp.guilds[doc.id] = doc.data();
});
let query = db.collection('guilds')
let data = query.get().then(snapshot => {
let temp = snapshot.toJSON()
await fs.writeFile ("../serversettings.json", temp, function(err) {
if (err) throw err;
console.log('done');
})
})