【问题标题】:NodeJs Store content from all files in directoryNodeJs 存储目录中所有文件的内容
【发布时间】:2019-06-18 03:03:03
【问题描述】:

我有以下功能:

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);

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

PD:如果我在声明它的位置之外声明 readFilesdetails[],则信息不会正确推送到数组中。

我错过了什么?

【问题讨论】:

    标签: javascript node.js file file-read


    【解决方案1】:

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

    console.log(details).
    

    您要么需要做出承诺并让它等待调用完成,要么使用此处提供的调用的同步版本。用下面的链接

    fs.readdirSync(path[, options]) 
    
    fs.readFileSync(path[, options]) 
    

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

    【讨论】:

    • 我怎样才能把它变成一个承诺?有什么想法吗?
    • 声明函数 async 并使 fs.readdir 成为返回的承诺。之后,您需要在 fs.readFile 上使用“等待”。然后更改退货详情;解决(详情);之后我会在 var details = await partidos.readFiles(partidosPath); 上再次使用 await我在下面留下了两个链接以提供帮助,如果这有帮助,请告诉我 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…medium.com/tkssharma/…
    • @pedrodotnet 有帮助吗?
    • 抱歉耽搁了,我改变了方法,我将匹配项存储在数据库的表中,我不再需要从目录中读取文件。
    【解决方案2】:

    您已经在“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)
    })
    

    【讨论】:

    • 我知道了,我只是把console日志放上来检查功能,问题是数据没有保存,函数的返回返回undefined
    猜你喜欢
    • 2014-08-12
    • 1970-01-01
    • 2013-11-27
    • 2017-04-05
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多