首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用readdir内部的readdir之后向客户端发送数据?

如何在使用readdir内部的readdir之后向客户端发送数据?
EN

Stack Overflow用户
提问于 2019-01-17 09:53:51
回答 1查看 332关注 0票数 0

我需要读一个叫做“曲线”的文件夹。很多文件夹都在“曲线”中,我使用readdir来获取它们。在获得文件夹在‘曲线’内,我正在做一个预测,并使用readdir列出文件(文件夹中的文件,即在‘曲线’)。

问题是,我只能访问内部readdir中的变量(我用console.log进行了测试)。

问:我如何访问这些变量并使用res响应客户端。?

我走了这么远:

代码语言:javascript
复制
exports.getInserted = async function (req, res) {

    var teste = await getFilesNames(); // HERE I NEED TO GET THIS FILES NAMES WITH FOLDERS
    console.log(teste); // AND THEM PASSING TO THE CLIENT WITH RES.SEND()

};

function getFilesNames() {
    return new Promise(function (resolve, reject) {

        const chartFolder = './curvas/';
        var fileNames = [];

        fs.readdir(chartFolder, (err, folders) => {

            if (err) {
                reject(new Error("Erro ao ler os arquivos."));
            }
            folders.forEach(folder => {
                fs.readdir(chartFolder + folder, (err, files) => {
                    fileNames = files;
                    console.log(files) // ----- HERE I CAN SEE ALL FILES AND LIST WITH THEIR FOLDERS.
                });
            });
            // I NEED USE resolve(fileNames) HERE, BUT IS EMPTY!!
        });
    });
};

谢谢!

编辑

解决方案:由@omarwaleed引导的

代码语言:javascript
复制
    exports.getInserted = async function (req, res) {

    // Envia os arquivos das pastas de curvas para o cliente.
    var data = await getFilesNames();
    res.status(200).send(data);

};

function getFilesNames() {
    return new Promise(function (resolve, reject) {

        const chartFolder = './curvas/';

        // take care. I've turned it into an async function here
        fs.readdir(chartFolder, async (err, folders) => {

            if (err) {
                reject(new Error("Erro ao ler os arquivos."));
            }
            let promiseArray = [];
            folders.forEach(folder => {
                promiseArray.push(
                    new Promise((resolve, reject) => fs.readdir(chartFolder + folder, (err, files) => {
                        if (err) {
                            reject(err);
                        }
                        resolve({
                            folder: folder,
                            files: files
                        });
                    }))
                )
            });
            let results = await Promise.all(promiseArray);
            resolve(results)
        });
    });
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-17 10:37:11

使用解析代替注释,// I NEED USE resolve(fileNames) HERE, BUT IS EMPTY!!将导致一个未定义的fs.readdir语句,因为第二个fs.readdir将异步运行,这意味着在代码解析后将读取目录。为了解决这个问题,我建议您将fs.readdir包装成承诺,在这里您可以等待所有文件的读取并解决响应。

下面是您的函数的样子

代码语言:javascript
复制
function getFilesNames() {
    return new Promise(function (resolve, reject) {

        const chartFolder = './curvas/';
        var fileNames = [];

        // take care. I've turned it into an async function here
        fs.readdir(chartFolder, async (err, folders) => {

            if (err) {
                reject(new Error("Erro ao ler os arquivos."));
            }
            let promiseArray = [];
            folders.forEach( folder => {
            promiseArray.push(
              new Promise((resolve, reject)=>fs.readdir(chartFolder + folder, (err, files)=>{
                if(err){
                  reject(err)
                }
                resolve(files)
              }))
            )
        });
        let results = await Promise.all(promiseArray);
            resolve(results)
        });
    });
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54233198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档