Как я могу хранить данные Firebase до json в локальном - PullRequest
1 голос
/ 05 февраля 2020

В моем случае теперь я получил данные из пожарного магазина, как я могу сохранить их в 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' }

и это :

GUqGqFanJuN7cRJx4S2w => {}

Мне нужно сохранить эти данные в 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, будут ли вышеуказанные функции работать так же, будут ли они переопределять то же значение или удаляют все другие значения, например, префикс обновления примера. to, тогда await fs.writeFile ("../serversettings.json", JSON.stringify(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 
  ] 
}

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Быстрое решение вашей проблемы - заменить

let data = query.get().then(snapshot => {

на

await query.get().then(snapshot => {

, чтобы ваш объект temp мог быть заполнен до того, как программа продолжит сохранять файл .


Я еще не использовал writeFile, но вот что говорит документация :

Когда файл filename, асинхронно записывает данные в файл, заменяет файл, если он уже существует.

Я не думаю, что ваш объект будет настолько большим, что полная перезапись будет проблемой, если это не меняется очень часто. В этом случае, я думаю, вам придется использовать другой метод, который может поддерживать смещение , так что вы можете писать только то, что изменилось, но это выглядит как реальное излишество.


Что касается формата вашего JSON файла, я думаю, что вы пытаетесь сделать следующее:

var temp = {};
temp.guilds = {};
snapshot.forEach(doc => {
    console.log(doc.id, '=>', doc.data());
    temp.guilds[doc.id] = doc.data();
});
0 голосов
/ 05 февраля 2020

я не уверен, но у firebase есть метод для преобразования данных из объекта в 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');
        })
    })
...