Обработка ошибок файла ENOENT узла js

У меня есть простой процесс, который должен открыть файл для чтения, но если файл не существует, он должен просто заметить / игнорировать ошибку и продолжить.

Я перепробовал много источников, но не могу найти на ясном примере того, как успешно проверить наличие файла без процесса узла, генерирующего ENOENT uncaughtexception.

простой пример:

fs.open('a.txt', 'r', function(err, fd) {
    if(err) {
        if(err.code === 'ENOENT' ){
            console.log("Does not exist");
            return;
        }

        throw err;
    }
    console.log(err.code);
})

3 ответа

Вы не должны проверять наличие файла перед открытием из-за состояния гонки, см. Приведенную ниже выдержку из fs.exists() Docs.

Использование fs.exists() для проверки существования файла перед вызовом fs.open(), fs.readFile() или fs.writeFile() не рекомендуется. Это вводит условие гонки, поскольку другие процессы могут изменять состояние файла между двумя вызовами. Вместо этого пользовательский код должен открывать / читать / записывать файл напрямую и обрабатывать возникшую ошибку, если файл не существует.

Node.js fs.exists() Документы: Источник

Как указано выше, вы должны просто обработать ошибку, переданную fs.open() функция обратного вызова. fs.open() возвращая ошибку через err аргумент вашего обратного вызова с кодом ENOENT не вызовет UncaughtException что впоследствии приводит к сбою вашего процесса (при условии, что вы не обрабатываете его на объекте процесса, process.on('UncaughtException', err => {})).

Вы, вероятно, выбрасываете ошибку в своем коде или используете слово "throw" вместо "return" при описании того, как ошибка передается обратно в ваш код. Приведенный выше пример кода не вызовет UncaughtException если err.code !== 'ENOENT', Если err.code !== 'ENOENT' тогда это приводит к err быть брошенным без упаковки try/catch блок, который приведет к сбою вашего процесса из-за UncaughtException

Я также получал ENOENT для fs.exist и fs.existSync, что не имело смысла. Как ни странно, это было вызвано неиспользуемой переменной (см. Ниже), как только я удалил эту переменную, ENOENT ушёл, не зная почему.

var params =     var params = {
    input: fs.createReadStream(msgfile),
    output: process.stdout,
    terminal: false
}

Попробуйте использовать fs.existsSync() прежде чем пытаться открыть его.

https://nodejs.org/api/fs.html

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