Обработка ошибок
Часть раздела Основы Node.js путешествия по Node.js на Coddy. Урок 16 из 33.
Файл notes.json, отредактированный вручную, может повредиться. Тогда JSON.parse выдаст исключение, а Node выведет трассировку стека: длинный список строк кода, которые привели к ошибке.
try выполняет код, который может вызвать исключение. Если это происходит, catch получает ошибку, и ваша программа решает, что сообщить. err.message — это краткая причина в одну строку.
let config;
try {
config = JSON.parse('{ port: 3000 }');
} catch (err) {
console.error(`config is broken: ${err.message}`);
process.exit(1);
}Не перехватывайте ошибку, чтобы продолжить работу с пустым списком: следующий вызов add перезапишет повреждённый файл, и все заметки в нём исчезнут.
Задание
ЛегкоКто-то вручную отредактировал notes.json и оставил лишнюю запятую. Теперь JSON.parse выдаёт ошибку, и Node печатает длинную трассировку стека. Сделай так, чтобы инструмент вместо этого выводил одну понятную строку и завершал работу, не сохраняя данные поверх повреждённого файла.
- В
store.jsнайди место, где загружаются заметки:JSON.parse(readFileSync(...))внутри объектаstore. Перехвати ошибку, которую выдаётJSON.parse, когда файл содержит некорректный JSON.tryнельзя поместить внутрь объекта, поэтому перенеси загрузку в функцию или переменную выше объекта и используй её результат дляnotes. - Если разбор не удаётся, выведи одну строку в stderr, а затем заверши работу с кодом 1. Строка начинается с
notes.json is damaged:, а затем содержит сообщение ошибки — причину, которую указываетJSON.parse, напримерUnexpected token ']'. Не выводи трассировку стека. Не продолжай работу с пустым списком: следующая командаaddсохранит данные поверх повреждённых заметок. - Если
notes.jsonотсутствует, хранилище по-прежнему должно быть пустым, как и раньше. Проверка выполняется для каждой команды, потому что каждая команда загружает хранилище.
Проверь: до внесения изменений введи list в поле после $ node notes.js. Ты увидишь красную трассировку стека. После внесения изменений команда list выведет только красную строку notes.json is damaged: ... и код завершения 1. Чтобы снова увидеть заметки, удали запятую после "Call Ada" в notes.json и запусти list. Затем верни запятую перед нажатием «Проверить»: для проверок нужен повреждённый файл, а «Сбросить файлы» не отменяет сделанные тобой изменения.
Попробуйте сами
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
const file = 'notes.json';
const store = {
notes: existsSync(file) ? JSON.parse(readFileSync(file, 'utf8')) : [],
save() {
writeFileSync(file, JSON.stringify(this.notes, null, 2));
},
add(text) {
this.notes.push(text);
this.save();
return this.notes.length;
},
remove(n) {
const [text] = this.notes.splice(n - 1, 1);
this.save();
return text;
},
};
export default store;
Все уроки раздела Основы Node.js
3Файлы
Текст и значения JSONЧтение файлаЗапись текста JSONЗапись в файлУдаление заметкиПотренируйтесь самостоятельно: Песочница Express