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

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() 方法并等待对于所有要解决的承诺。