为什么foreach循环未对文件进行更改?

时间:2018-12-02 04:23:37

标签: javascript node.js fs

我正在审查一个nodeJS程序,有人编写了该程序以合并两个文件中的对象并将数据写入mongodb。我一直在努力思考它的工作原理-尽管我运行了它并且效果很好。 它住在这里:https://github.com/muhammad-asad-26/Introduction-to-NodeJS-Module3-Lab

首先,有两个JSON文件,每个文件包含一个由1,000个对象组成的数组,这些对象被“拆分”,并且实际上是要合并的记录。目标是将两个文件的第一个对象合并在一起,然后将两个第二个对象……每个文件中的第1,000个对象合并,并插入db中。

以下摘录为您提供背景信息:

const customerData = require('./data/m3-customer-data.json')
const customerAddresses = require('./data/m3-customer-address-data.json')

mongodb.MongoClient.connect(url, (error, client) => {

    customerData.forEach((element, index) => {
        element = Object.assign(element, customerAddresses[index])
        //I removed some logic which decides how many records to push to the DB at once
        var tasks = [] //this array of functions is for use with async, not relevant
        tasks.push((callback) => {


            db.collection('customers').insertMany(customerData.slice(index, recordsToCopy), (error, results) => {
                callback(error)
            });
        });

    })
})

据我所知, 元素= Object.assign(element,customerAddresses [index]) 在每次迭代期间修改当前元素-IE源文件中的JSON对象

对此进行备份, db.collection('customers')。insertMany( customerData .slice(index,recordsToCopy) 似乎进一步证实了,当将完成的合并数据写入数据库时​​,作者正在读取该原始的customerData文件-仅当完成的合并数据位于其中时才有意义。

由于源文件未更改,所以按重要性排列的两件事使我感到困惑:

1)合并后的数据在写入数据库之前会存放在哪里?客户数据文件在运行时结束时保持不变。

2)使用数组语法访问JSON文件时,它叫什么?我不知道您是否可以在没有fs模块或类似功能的情况下读取文件。作者仅使用require('filename')读取文件。我想了解更多有关此的信息。

谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

问题1:

合并后的数据在发送到数据库之前,先存在于customerData变量中。它仅在调用insertMany时存在于内存中,并作为参数传递。没有理由要覆盖文件系统上的任何内容-实际上,每次调用数据库时修改.json文件都是低效的-存储信息是数据库的工作,而不是数据库的工作。文件在您的应用程序中。 如果您要覆盖文件,这将很容易-只需在fs.writeFile('./data/m3-customer-data.json', JSON.stringify(customerData), 'utf8', console.log('overwritten'));之后添加insertMany之类的内容即可。确保包括const fs = require('fs');。为了使情况更清楚,请尝试将customerData.length的值写入文件。

问题2: 查看节点require()上的docs。它所做的就是解析JSON文件中的数据。

这里没有魔术。使用require将静态json文件解析为数组,并将其作为customerData变量存储在内存中。它的值被操纵并发送到可以存储它的其他计算机。由于代码是最初编写的,因此json文件的唯一用途就是读取。