Как я могу отправить данные клиенту после использования readdir внутри readdir - PullRequest
0 голосов
/ 17 января 2019

Мне нужно прочитать папку с именем 'curvas'. Многие папки находятся внутри curvas, и я использую readdir для их получения. После получения папок внутри 'curvas' я делаю foreach и использую readdir для вывода списка файлов (файлов внутри папок, которые находятся внутри 'curvas').

Проблема в том, что я могу получить доступ только к переменной внутри внутреннего readdir (я тестировал с console.log).

В: Как я могу получить доступ к этим переменным и ответить клиенту с помощью res. ?

Вот как далеко я зашёл:

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

Спасибо!

[EDIT]

Решение: Руководствуясь @ omarwaleed

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

1 Ответ

0 голосов
/ 17 января 2019

Использование разрешения вместо комментария // I NEED USE resolve(fileNames) HERE, BUT IS EMPTY!! приведет к неопределенному оператору разрешения, поскольку второй fs.readdir будет выполняться асинхронно, что означает, что каталог будет считан ПОСЛЕ того, как ваш код разрешается. Чтобы решить эту проблему, я советую вам обернуть fs.readdir обещаниями, в которых вы можете дождаться чтения всех файлов и разрешить ответ
Вот как будет выглядеть ваша функция

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