Почему удаление каталога выдает ошибку в этом случае?

#javascript

#javascript

Вопрос:

Итак, я изучал модуль файловой системы, а также я новичок в async и await, я не понимаю, почему я получаю здесь ошибку?

 const fs = require("fs");
async function removeDir() {
    await fs.readdir("./trash", (err, files) => {
        if (err) throw err;

        for(filename of files){
            fs.unlinkSync(`./trash/${filename}`);
        }
        
        console.log("Cleared all files within directory");
    });

    await fs.rmdir("./trash", err => {
        if (err) throw err;

        console.log("Removed Dir");
    });
}
removeDir();
  

Почему fs.rmdir выполняется перед удалением файлов в каталоге, и я получаю сообщение об ошибке, что каталог не пуст. Почему await не работает так, как я ожидаю, что это сработает.

Ответ №1:

readdir в основном fs модуле не возвращает обещание, поэтому использование await на нем не имеет (почти) никакого эффекта и, конечно же, не заставляет код ждать, пока он не выполнит свою работу. (Вот почему у него есть обратный вызов, потому что именно так вы узнаете, что это сделано.) То же самое для rmdir .

Вместо этого вы можете использовать версии из более нового fs / promises API.


Примечание: ваш код становится жертвой того, что я называю ужасом неявных глобалов, потому что вы никогда не объявляете filename . Всегда обязательно объявляйте свои переменные. (В этом случае просто поставьте const перед filename : for (const filename of files) { .) Я также рекомендую использовать строгий режим, чтобы попытка присвоения необъявленному идентификатору была ошибкой, которая всегда должна была быть. В наши дни лучший способ сделать это — использовать модули JavaScript, которые всегда находятся в строгом режиме. Но вы можете использовать "use strict"; в верхней части скрипта или в старом стиле Node.js вместо этого модуль.

Комментарии:

1. These days, the best way to do that is to use JavaScript modules, which are always in strict mode. But you can use "use strict"; at the top of a script or old-style Node.js module instead. Я не понял эту часть, не могли бы вы уточнить, я полный новичок.

2. @SomShekharMukherjee — Как и все мы когда-то. 🙂 Node.js существует уже довольно давно, поскольку до того, как в JavaScript появились модули (добавленные в ES2015). Итак Node.js имеет свой собственный модульный механизм, подобный CommonJS . Но теперь JavaScript имеет стандартные модули , часто называемые модулями ECMAScript или сокращенно ESM, которые Node.js теперь поддерживает в дополнение к своей собственной старой модульной системе. Собственные модули JS всегда находятся в строгом режиме, поэтому вам не нужно "use strict"; использовать их.