Как не записывать файл для fs.readFileSync()?

В node.js readFile() показано, как зафиксировать ошибку, однако для нет комментариев, readFileSync() для обработки ошибок. Таким образом, если я пытаюсь использовать readFileSync(), когда нет файла, я получаю сообщение об ошибке Error: ENOENT, no such file or directory.

Как захватить исключение? Doco не указывает, какие исключения выбрасываются, поэтому я не знаю, какие исключения мне нужно поймать. Я должен отметить, что мне не нравятся общие понятия "поймать каждый возможный исключение" для операторов try/catch. В этом случае я хочу поймать конкретное исключение, которое возникает, когда файл не существует, и я пытаюсь выполнить readFileSync.

Обратите внимание, что я выполняю функции синхронизации только при запуске перед выполнением попыток подключения, поэтому комментарии, в которых я не должен использовать функции синхронизации, не требуются:-)

Ответ 1

В принципе, fs.readFileSync выдает ошибку, если файл не найден. Эта ошибка возникает из прототипа Error и выбрасывается с помощью throw, поэтому единственный способ поймать - это блок try / catch:

var fileContents;
try {
  fileContents = fs.readFileSync('foo.bar');
} catch (err) {
  // Here you get the error when the file was not found,
  // but you also get any other error
}

К сожалению, вы не можете определить, какая ошибка была выбрана, просто просмотрев цепочку прототипов:

if (err instanceof Error)

- лучшее, что вы можете сделать, и это будет верно для большинства (если не всех) ошибок. Поэтому я предлагаю вам перейти к свойству code и проверить его значение:

if (err.code === 'ENOENT') {
  console.log('File not found!');
} else {
  throw err;
}

Таким образом, вы имеете дело только с этой конкретной ошибкой и повторите все другие ошибки.

В качестве альтернативы вы также можете получить доступ к свойству ошибки message, чтобы проверить подробное сообщение об ошибке, которое в этом случае:

ENOENT, no such file or directory 'foo.bar'

Надеюсь, что это поможет.

Ответ 2

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

var file = 'info.json';
var content = '';

// Check that the file exists locally
if(!fs.existsSync(file)) {
  console.log("File not found");
}

// The file *does* exist
else {
  // Read the file and do anything you want
  content = fs.readFileSync(this.local, 'utf-8');
}

Ответ 3

Вы должны поймать ошибку, а затем проверить, какой тип ошибки.

try {
  var data = fs.readFileSync(...)
} catch (err) {
  // If the type is not what you want, then just throw the error again.
  if (err.code !== 'ENOENT') throw err;

  // Handle a file-not-found error
}

Ответ 4

Я использую сразу вызываемую лямбду для этих сценариев:

const config = (() => {
  try {
    return fs.readFileSync('config.json');
  } catch (error) {
    return {};
  }
})();