ENOENT, нет такого файла или каталога на fs.mkdirSync

В настоящее время я запускаю приложение NodeJS, и у меня есть следующий if-statement:

Error: ENOENT, no such file or directory './realworks/objects/'
    at Object.fs.mkdirSync (fs.js:654:18)
    at Object.module.exports.StartScript (/home/nodeusr/huizenier.nl/realworks.js:294:7)

Однако странная вещь заключается в том, что папка уже существует, но проверка не выполняется в следующем фрагменте:

if(fs.existsSync(objectPath)) {
    var existingObjects = fs.readdirSync(objectPath);
    existingObjects.forEach(function (objectFile) {
        var object = JSON.parse(fs.readFileSync(objectPath+objectFile));
        actualObjects[object.ObjectCode] = object;
    });
}else{
    fs.mkdirSync(objectPath); // << this is line 294
}

Я не понимаю, как no such file or directory при СОЗДАНИИ каталога.

Ответы

Ответ 1

Проблема была вызвана forever запуском приложения по отношению к рабочему каталогу, в который вызывается команда forever start, а не местоположение точки входа приложения.

Ответ 2

Если какая-либо папка по указанному пути отсутствует, mkdir выдаст ENOENT.

Есть 2 возможных решения (без использования сторонних пакетов):

  • Рекурсивно вызывайте fs.mkdir для каждого несуществующего каталога по пути.
  • Используйте recursive опцию, представленную в v10.12:
    fs.mkdir('./path/to/dir', {recursive: true}, err => {})

Ответ 3

Следующие работали для меня:

fs.mkdir( __dirname + '/realworks/', err => {})

Ответ 4

Когда вы используете fs.mkdir или fs.mkdirSync, при прохождении пути вроде folder1/folder2/folder3, folder1 и folder2 должны существовать, в противном случае вы получите вышеуказанную ошибку.

Ответ 5

Пытаться:

fs.mkdir('./realworks/', err => {})

Ответ 6

Причина ошибки заключается в том, что если какая-либо из папок существует по пути, указанному в fs.mkdir или fs.mkdirSync, эти методы будут вызывать/обратный вызов с ошибкой ENOENT.

Ответ 7

Решите здесь Как создать полный путь с помощью узла fs.mkdirSync?

В NodeJS версии 10.12.0 добавлена встроенная поддержка mkdir и mkdirSync для рекурсивного создания каталога с опцией recursive: true, как показано ниже:

fs.mkdirSync(targetDir, { recursive: true });

И если вы предпочитаете fs Promises API, вы можете написать

fs.promises.mkdir(targetDir, { recursive: true });