Как дождаться выполнения функции fs.readdir? Узел JS

Код:

function getLocalFiles() {
    let files = [];
    return new Promise((resolve, reject) => {
        fs.readdir('storage', (err, filenames) => {
            if (err)
                throw err;
            filenames.forEach((filename) => {
                fs.readFile('storage/' + filename, 'utf-8', (err, data) => {
                    if (err)
                        throw err;
                    const file = {
                        filename: filename,
                        content: data
                    };
                    files.push(file);
                    //console.info(files); I checked that array has a files but then it returns empty
                });
            });
        });
        resolve(files);
    })
}

api.get('/', async (req, res) => {
    const files = await getLocalFiles();
    res.send('local files:\n' + files);
})

У меня есть несколько файлов в каталоге «хранилище», и я объявил функцию getLocalFiles(), которая считывает имя и содержимое каждого файла в этом каталоге и помещает его в массив «файлы». Но вместо этого я получил пустой массив. Почему файлы не записываются в массив?

Вы можете использовать функцию readdirSync, чтобы быстро решить эту проблему geeksforgeeks.org/node-js-fs-readdirsync-метод.

Mikkel 03.04.2022 22:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Несколько указателей:

  1. Код, который вы пишете, значительно выиграет от использования версии fs с обещаниями (fs/promises).
  2. избегайте смешивания обещаний и обратных вызовов и просто используйте обещания (через async/await, где это возможно).
  3. Я не менял его здесь, но если вы собираетесь запускать это на Windows, разделитель / не будет сокращать его, поэтому используйте вместо него path.join('storage', filename)
const fs = require('fs/promises');

async function getLocalFiles() {
    let files = [];
    const dir = await fs.readdir('storage')
    for (const filename of dir) {
      files.push({
        filename,
        content: await fs.readFile('storage/' + filename, 'utf-8')
      })
    }
    return files;
}

api.get('/', async (req, res) => {
    const files = await getLocalFiles();
    res.send('local files:\n' + files);
})

Другие вопросы по теме