无法使用Node.js从嵌套目录获取文件内容

无法使用Node.js从嵌套目录获取文件内容,node.js,fs,Node.js,Fs,我正在尝试使用node.js从目录中读取文件内容。但那个文件夹可能又有一些嵌套目录,所以我需要读取根目录中的每个文件。我在下面解释我的代码 checkDirectory = async (path) => { let fileArr = []; let flag = 0; if (!_.isEmpty(path)) { fs.readdirSync(`${path}`).forEach(f1 => { fs.lstat

我正在尝试使用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
文件夹中是否存在任何嵌套文件夹,并读取这些嵌套目录中的所有文件<代码>检查目录方法用于从嵌套目录读取文件


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

请等待checkDirectory,然后再使用它。您可以通过将函数转换为承诺来实现这一点。你可以有这样的东西:

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

请等待checkDirectory,然后再使用它。您可以通过将函数转换为承诺来实现这一点。你可以有这样的东西:

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

为什么
checkDirectory(fullPath)中没有返回?不应该是
返回checkDirectory(fullPath)为什么在
检查目录(fullPath)中没有返回?不应该是
返回checkDirectory(fullPath)