繁体   English   中英

Node.js - 使用 fs 时无法 append 全局变量

[英]Node.js - Cannot append global variable when using fs

我试图读取多个 xml 文件并从中解析数据,我设法做到了,但现在出现了新问题。

allData 变量永远不会改变,无论我做什么。 我应该在这里做什么?

我不知道该做什么或尝试什么,这是我第一次处理文件,我真的很惊讶我能走到这一步。

var parseString = require('xml2js').parseString;

var fs = require('fs')
var allData = {
    store: []
}

function readFiles(__dirname, onFileContent, onError) {


    fs.readdir(__dirname + '\\parse\\', function (err, filenames) {
            if (err) {
                return;
            }


            filenames.forEach(function (filename) {


                    console.log(filename)
                    fs.readFile(__dirname + '\\parse\\' + filename, 'utf-8', function (err, content) {
                            if (err) {
                                console.log(err)
                                return;
                            }
                            parseString(content, function (err, result) {

                                let tempObj = {}

                                let data = result.storeD[0]
                                

                                if (data.name) {
                                    tempObj['name'] = data.name[0];
                                }

                                if (data.price) {

                                    tempObj['price'] = data.price[0];
                                }


                                //more of the same type of code

                                console.log(tempObj)
                                //output: { name: 'Data1', price: '1000' }

                                allData.store.push(tempObj)

                            })


                        })

                        

                    })


            });

            console.log("All data: ",allData)
            //Outputs once at the begining 
            //output: All data:  { store: [] }


    }
    

readFiles(__dirname)

解决了

调整代码以使用.readFileSync() (删除回调函数),现在它可以工作了。

var parseString = require('xml2js').parseString;

var fs = require('fs')
var allData = {
    store: []
}

function readFiles(__dirname, onFileContent, onError) {


    fs.readdir(__dirname + '\\parse\\', function (err, filenames) {
            if (err) {
                return;
            }


            filenames.forEach(function (filename) {


                    console.log(filename)
                    let file = fs.readFileSync(__dirname + '\\parse\\' + filename, 'utf-8')
                            parseString(file, function (err, result) {

                                let tempObj = {}

                                let data = result.storeD[0]
                                

                                if (data.name) {
                                    tempObj['name'] = data.name[0];
                                }

                                if (data.price) {

                                    tempObj['price'] = data.price[0];
                                }


                                //more of the same type of code

                                console.log(tempObj)
                                //output: { name: 'Data1', price: '1000' }

                                allData.store.push(tempObj)

                            })


                        

                        

                    })

                    console.log("All data: ",allData)
            });

            
            //Outputs once at the begining 
            //output: All data:  { store: [] }


    }
    

readFiles(__dirname)

.readdir().readFile()方法是异步的,因此实际上console.log()在所有readFile操作之前执行。

为了在这些操作完成后访问allData变量,您必须使用.readFileSync()使它们同步,或者您需要承诺.readFile()方法并等待所有承诺解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM