【问题标题】:Pushing file list from folder Callback从文件夹回调推送文件列表
【发布时间】:2020-01-12 09:27:32
【问题描述】:

我有一个列出文件夹中所有文件的功能。我无法通过阵列推出文件。我不确定我哪里出错了。当我导出模块并运行它时,我得到一个错误。

const getfiles = (callback) => {
        const filesx = []

            fs.readdir(dire, function (err, fileNames) {
        if (err) {
            console.log("you have an error.")
        }


        fileNames.forEach(file => {
            let filee = file.text()

            filesx.push({
                filee
            })
        })


    })
    callback({
        filesx
    })
}

module.exports = {
    getfiles
}

我得到的错误是

report-app\src\util\getfolder.js:24
        filesx
        ^

ReferenceError: filesx is not defined

【问题讨论】:

  • 我希望 dire 不会被定义......无论如何,fs.readdir 是异步的,因此您需要将回调调用移动到 readdir 回调中。此外,fileNames 将是一个文件名数组,即字符串,它们没有 .text() 方法。

标签: javascript node.js express fs


【解决方案1】:

这是一种使用同步功能的方法:

function getFiles(dir, cb) {
    cb(fs.readdirSync(dir).map(filename => fs.readFileSync(dir + filename).toString()));
}

getFiles("./Input/", function (contents) {
    console.log(contents);
});

作为参考,这里是异步方式:

// promisify fs.readdir
function readDir(dir) {
    return new Promise((resolve, reject) => {
        fs.readdir(dir, (err, fileNames) => {
            if (err) reject(err);
            else resolve(fileNames);
        });
    });
}

// promisify fs.readFile
function readFile(file) {
    return new Promise((resolve, reject) => {
        fs.readFile(file, (err, content) => {
            if (err) reject(err);
            else resolve(content.toString());
        });
    })
}

async function getFiles(dir, cb) {
    try {
        const fileNames = await readDir(dir);
        const contents = await Promise.all(fileNames.map(fileName => readFile(dir + fileName)));
        cb(contents);
    } catch (err) {
        console.error(err);
    }
}

getFiles("./Input/", function (contents) {
    console.log(contents);
});

这更加冗长,因为我承诺节点的异步函数以避免回调地狱并能够使用Promise.all()

【讨论】:

    【解决方案2】:

    尝试交易

    fs.readdir(dire, function (err, fileNames) {});
    

    fs.readdir(dire, (err, fileNames) => {});
    

    这个函数可能无法访问这些外部,箭头函数已经解决了。

    【讨论】:

    • 它有效,但我现在看不到文件有什么原因吗?我正在像这样打印files.getfiles(folderResult => {console.log(folderResult.filesx})
    • 尝试使用:for(let file of fileNames) {} 可能他在生成列表之前正在运行回调。我以前遇到过这个问题
    • 我认为我存储的文件有误。 `let filee = file` 有什么方法可以存储它吗?数组似乎是空的
    • 试试const filesx = [] fs.readdir(dire, (err, fileNames) => { if (files === undefined) { alert('Not found'); return false; } if (fileNames.length > 0) { for(let file of fileNames) { filesx.push(path + file); }); } });
    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多