console.log отличается от json .push - PullRequest
0 голосов
/ 17 июня 2020

Я использую node.js для экспорта коллекции, которая есть у меня в firestore.

До сих пор соединение и выбор документов коллекции работают отлично.

Я пытаюсь чтобы сохранить структуру в файле json, но результат оказался не таким, как я ожидал.

Это результат в физическом файле:

введите здесь описание изображения

Справа от фотографии он будет отображаться в том виде, в котором он представлен в console.log, а справа он отображается как записанный json .pu sh

Я могу не удалось добиться того, чтобы физический файл имел структуру, показанную в console.log.

Я благодарен за вашу помощь.

как вы увидите, что структура здесь не работает: «USBCALI | AFILIADO | uqcMSoxdwCTQoLzS2J6brNTZ3Dy2 ",": ", {.....

должно быть: USBCALI | AFILIADO | uqcMSoxdwCTQoLzS2J6brNTZ3Dy2: {.....

это код

const jsonfile = require('jsonfile')

function start (db, file, collection) {
  const ref = db.collection(collection)
  const json = []

  

  console.log(`Getting ${collection}...`)

  ref
    .get()
    .then((snapshot) => {
      snapshot.forEach((doc) => {  
        console.log(doc.id, ':', doc.data())
	json.push(doc.id, ':', doc.data())
      })

      console.log(`Writing ${file}...`)

      jsonfile.writeFile(file, json, {spaces: 2}, err => {
        if (err) {
          console.error(err)
        } else {
          console.log(`Collection ${collection} successfully written to ${file}.`)
        }
      })
    })
    .catch((err) => {
      console.log('Error getting documents', err)
    })
}

module.exports = start

1 Ответ

0 голосов
/ 17 июня 2020

Позвольте мне объяснить, что здесь происходит

console.log(doc.id, ':', doc.data())

Выгружает из системы информацию, как вы думаете, вы бы хотели, чтобы это было

json.push(doc.id, ':', doc.data()) вставляет 3 элемента в массив каждый раз при его вызове.

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

var docs snapshot.map( doc =>  ({[doc.id] : doc.data()})
json.push(docs)

вместо

 snapshot.forEach((doc) => {  
        console.log(doc.id, ':', doc.data())
    json.push(doc.id, ':', doc.data())
      })

Вы также можете сделать (это немного более подробно, чем метод map, но по сути он делает то же самое. Функция map похожа на select в sql или Linq, ее удобно преобразовывать данные из одной формы в другую ?

 snapshot.forEach((doc) => {  
    var currentItem = {[doc.id] : doc.data()}
    json.push(currentItem)
      })

Поскольку вы использовали некоторую нотацию es6, я предполагаю, что вычисляемые имена свойств поддерживаются, если не дайте мне знать, и я предложу другое решение

...