Как я могу вернуть файлы каталога? (JavaScript, Node.js) - PullRequest
0 голосов
/ 03 сентября 2018

Я хочу вернуть файлы каталога.

Мне нужно, чтобы передать маршрут другой функции.

Другими словами, как я могу вернуть файлы каталога, используя JavaScript / Node.js?

const fs = require('fs');
const path = require('path');
const mdLinks = require('../index');
exports.extension = (route) => {

    return new Promise((resolve, reject) => {
        try {
            recursive(route);
        } catch (e) {
            reject(e);
        }
    });
}

const recursive = (route) => {
    const extMd = ".md";
    let extName = path.extname(route);
    let files = [];
    fs.stat(route, (err, stats) => {
        if (stats && stats.isDirectory()) {
            fs.readdir(route, (err, files) => {
                files.forEach(file => {
                    let reFile = path.join(route, file);
                    if (file !== '.git') {
                        recursive(reFile);
                    }
                });
            })
        }
        else if (stats.isFile() && (extMd == extName)) {
            files.push(route);
        }

    })

    return files;
}

1 Ответ

0 голосов
/ 03 сентября 2018

Есть несколько проблем.

Во-первых, ваша функция асинхронна, поэтому она не может просто вернуть значение files, потому что ваша функция возвращается задолго до того, как что-либо добавлено в массив files (это одна из причин того, что она пуста). Когда это будет сделано, ему придется либо вызвать обратный вызов, либо вернуть обещание, которое может использовать вызывающий. Вам придется исправить это как на верхнем уровне, так и при рекурсивном вызове себя.

Во-вторых, вы переопределяете files на каждом рекурсивном шаге, поэтому у вас нет возможности собрать их все. Вы можете либо передать массив для добавления, либо вы можете определить массив files на более высоком уровне, где все ссылаются на один и тот же объект, или вы можете вызвать рекурсивный конкатат файлов, которые возвращаются в ваш текущий массив.

В-третьих, вы не реализовали обработку ошибок ни в одном из ваших асинхронных файловых вызовов ввода / вывода.

Вот мой рекомендуемый способ решения всех этих проблем:

exports.extension = (route) => {
    return recursive(route);
}

const util = require('util');
const stat = util.promisify(fs.stat);
const readdir = util.promisify(fs.readdir);

// returns a promise that resolves to an array of files
async function recursive(route) {
    const extMd = ".md";
    let extName = path.extname(route);
    let files = [];
    let stats = await stat(route);
    if (stats.isDirectory()) {
        let dirList = await readdir(route);
        for (const file of dirList) {
            if (file !== '.git') {
                let reFile = path.join(route, file);
                let newFiles = await recursive(reFile);
                // add files onto the end of our list
                files.push(...newFiles);
            }
        }
    } else if (stats.isFile() && extMd === extName) {
        files.push(route);
    }     
    // make the files array be the resolved value
    return files;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...