Как не записывать файл для 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 {};
}
})();