NodeJ将目录中所有文件的内容存储

时间:2019-06-18 03:03:03

标签: javascript node.js file file-read

我具有以下功能:

readFiles: function(partidosPath) {
    fs.readdir(partidosPath,function(err,files){
      if (err) throw err;
      files.forEach(function(file){
        if(file) {
          fs.readFile(partidosPath+file, 'utf8', function (err,data) {
            var details = [];
            if (err) {
              return console.log(err);
            }
            commonFunctions.arrayLoader(details, {name: file, content: data});
        console.log(details);
        return details;
          });
        }
      });
    });
  }

从目录中的文件列表中读取内容。

我需要使用每个文件的名称和内容来保存对象数组,如下所示:

array = [{name: file1Name, content: file1Content},....]

我在另一个文件中调用该函数,如下所示:

var details = partidos.readFiles(partidosPath);
console.log(details);

问题在于,在console.log(details)方法的readFiles中,我可以正确看到信息,但是当我调用该方法时,console.log返回未定义。

PD:如果我在声明的地方声明了details[]的{​​{1}},则信息没有正确地推送到数组中。

我缺少什么?

2 个答案:

答案 0 :(得分:0)

问题是您正在进行异步调用。在异步调用中,您的程序将在调用后继续运行,而无需等待函数完成,因此它们可以继续运行

console.log(details).

您要么做出承诺,然后让其等待呼叫完成,要么使用此处的呼叫同步版本。使用下面的链接

fs.readdirSync(path[, options]) 

fs.readFileSync(path[, options]) 

https://nodejs.org/api/fs.html#fs_fs_readdirsync_path_options

答案 1 :(得分:0)

您已经在'partidos.readFiles(partidosPath)'中包含了'console.log'语句。数据读取完成后,它将自动记录数据。您不需要其他console.log即可。

这是工作代码:

// utils.js

const fs = require('fs')

const readFiles = function (path, callback) {
    let arrayOfFileObjects = [];
    fs.readdir(path, function (err, fileNames) {
        if (err) {
            console.log('Read dir error!')
            return;
        }

        if (fileNames.length <= 0) {
            console.log('No files exist in the mentioned directory!')
            return
        }

        for (let i = 0; i < fileNames.length; i++) {
            const fileName = fileNames[i];

            fs.readFile(`${__dirname}\\${fileName}`, 'utf-8', function (err, fileContent) {
                if (err) {
                    console.log(err)
                    console.log('Error occured while attempting to read: ' + fileName)
                    return;
                }
                arrayOfFileObjects.push({
                    name: fileName,
                    content: fileContent
                })
                if (i === fileNames.length - 1) {
                    callback(arrayOfFileObjects);
                }
            })
        }
    })
}
module.exports = {
    readFiles
}
// test.js

const utils = require('./utils')

utils.readFiles(__dirname, function(fileObjects) {
    console.log(fileObjects)
})