【问题标题】:Unable to fetch file content from nested directory using Node.js无法使用 Node.js 从嵌套目录中获取文件内容
【发布时间】:2020-11-25 15:18:43
【问题描述】:

我正在尝试使用 node.js 从目录中读取文件内容。但是该文件夹可能还有一些嵌套目录,所以我需要读取根目录中存在的每个文件。我在下面解释我的代码。

checkDirectory = async (path) => {
    let fileArr = [];
    let flag = 0;

    if (!_.isEmpty(path)) {
        fs.readdirSync(`${path}`).forEach(f1 => {
            fs.lstat(`${path}/${f1}`, (err, stat) => {
                if (!err) {
                    if (stat.isFile()) {
                        flag = 1;
                        let rawdata = fs.readFileSync(`${path}/${f1}`, {
                            encoding: 'utf8',
                            flag: 'r'
                        });
                        fileArr.push({
                            rawContent: rawdata,
                            fileName: f1
                        });
                    }
                    if (stat.isDirectory()) {
                        flag = 0;
                        const fullPath = `${path}/${f1}`;
                        checkDirectory(fullPath);
                    }
                }
            })
        })
    }
    if (falg === 1) {
        return fileArr;
    }
}
let dataArr = [];
fs.readdirSync(`${process.env['root_dir']}/uploads}`).forEach(f => {
    fs.lstat(`${process.env['root_dir']}/uploads/${f}`, (err, stat) => {
        if (!err) {
            if (stat.isFile()) {
                let outputObj = {};
                let rawdata = fs.readFileSync(`${process.env['root_dir']}/uploads/${f}`, {
                    encoding: 'utf8',
                    flag: 'r'
                });
                if (!_.isEmpty(rawdata)) {
                    const contentToBase64 = Buffer.from(rawdata, "utf8").toString('base64');
                    outputObj = {
                        fileName: f,
                        fileData: contentToBase64
                    }
                    dataArr.push(outputObj);
                }
            }
            if (stat.isDirectory()) {
                const fullPath = `${process.env['root_dir']}/uploads/${f}`;
                let fileContentArr = checkDirectory(fullPath);
                for (let e of fileContentArr) {
                    if (!_.isEmpty(e.rawContent)) {
                        const contentToBase64 = Buffer.from(e.rawContent, "utf8").toString('base64');
                        outputObj = {
                            fileName: e.fileName,
                            fileData: contentToBase64
                        }
                        dataArr.push(outputObj);
                    }
                }
            }
        }
    });
})
}
console.log('dataArr', dataArr);

这里我试图从uploads 文件夹中读取文件内容。当我执行此代码时,它会引发以下错误。

错误:

dataArr []
/app/controller/usecaseWorkflowCtrl.js:135
                                    for(let e of fileContentArr) {
                                                 ^

TypeError: fileContentArr is not iterable

这里我也在检查uploads 文件夹中是否存在任何嵌套文件夹,并从这些嵌套目录中读取所有文件。 checkDirectory 方法用于从嵌套目录中读取文件。

我需要从 uploads 目录中读取所有文件并将它们推送到 dataArr 。读取所有文件后,console.log('dataArr', dataArr); 应该执行。根据我当前的代码,此控制台消息从头开始执行并引发一些错误。请帮我解决这个错误并按照我的预期结果执行脚本。

【问题讨论】:

  • 为什么checkDirectory(fullPath);没有返回?不应该是return checkDirectory(fullPath);

标签: node.js fs


【解决方案1】:

在使用前等待 checkDirectory。您可以通过将函数转换为 Promise 来实现这一点。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise。你可以有这样的东西:

checkDirectory = (path) => {
    return new Promise((resolve, reject) => {
        let fileArr = [];
        let flag = 0;

        if (!_.isEmpty(path)) {
            fs.readdirSync(`${path}`).forEach(f1 => {
                fs.lstat(`${path}/${f1}`, (err, stat) => {
                    if (!err) {
                        if (stat.isFile()) {
                            flag = 1;
                            let rawdata = fs.readFileSync(`${path}/${f1}`, {
                                encoding: 'utf8',
                                flag: 'r'
                            });
                            fileArr.push({
                                rawContent: rawdata,
                                fileName: f1
                            });
                        }
                        if (stat.isDirectory()) {
                            flag = 0;
                            const fullPath = `${path}/${f1}`;
                            checkDirectory(fullPath);
                        }
                    }
                })
            })
        }
        if (falg === 1) { // why do you need this
            return resolve(fileArr);
        }
    });
}

然后像这样使用它:

let fileContentArr = await checkDirectory(fullPath);

【讨论】:

    猜你喜欢
    • 2011-04-08
    • 1970-01-01
    • 2023-04-05
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2019-01-07
    • 2017-04-03
    相关资源
    最近更新 更多