Node.js 如何将firebase数据存储到本地的json

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

在我的情况下,我现在从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());          
    })
所以我得到的输出是:

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