Как записать файл на FS.readFileSync ()?



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



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



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

709   4  

4 ответов:

по сути, 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'

надеюсь, что это помогает.

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

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');
}

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

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
}

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

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

async версия:

const config = await (async () => {
  try {
    return JSON.parse(await fs.readFileAsync('config.json'));
  } catch (error) {
    return {};
  }
})();

Comments

    Ничего не найдено.