首页 > 解决方案 > console.log 与 json.push 不同

问题描述

我正在使用 node.js 导出我在 firestore 中的集合。

到目前为止,集合文件的连接和选择工作完美。

我正在尝试将结构保存在 json 文件中,但结果不是我所期望的。

这是物理文件中的输出:

在此处输入图像描述

在照片的右侧,它将被视为由 console.log 呈现,而在右侧则显示为由 json.push 记录

我无法让物理文件具有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

标签: jsongoogle-cloud-firestoreconsole.log

解决方案


让我解释一下这里发生了什么

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

正在注销您认为您希望的信息

json.push(doc.id, ':', doc.data())每次调用时都会将 3 个元素推入数组。

您真正想要做的是使用 map 函数将数据正确地操作到对象中。我正在根据我在这里的所有信息做出一些假设,但我猜你想做类似的事情

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 函数就像 sql 或 Linq 中的 select,它可以方便地将数据从一种形式转换为另一种形式

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

由于您使用了一些 es6 表示法,我假设计算属性名称是支持的,如果不让我知道,我会想出另一个解决方案


推荐阅读