Manejo de errores
Parte de la sección Conceptos básicos de Node.js del Journey de Node.js de Coddy. Lección 16 de 33.
Un archivo notes.json editado a mano puede dañarse. Entonces JSON.parse lanza una excepción y Node imprime un seguimiento de la pila: la larga lista de líneas de código que provocaron el error.
try ejecuta código que puede lanzar una excepción. Cuando ocurre, catch recibe el error y tu programa decide qué decir. err.message es el motivo en una sola línea.
let config;
try {
config = JSON.parse('{ port: 3000 }');
} catch (err) {
console.error(`config is broken: ${err.message}`);
process.exit(1);
}No captures el error para continuar con una lista vacía: el siguiente add sobrescribiría el archivo dañado y se perderían todas las notas que contiene.
Desafío
FácilAlguien editó notes.json a mano y dejó una coma de más. Ahora JSON.parse lanza un error y Node imprime una traza de pila larga. Haz que la herramienta imprima una sola línea clara y se detenga, para que nunca guarde encima del archivo dañado.
- En
store.js, busca dónde se cargan las notas:JSON.parse(readFileSync(...)), dentro del objetostore. Captura el error que lanzaJSON.parsecuando el archivo no es JSON válido. Untryno puede ir dentro de un objeto, así que mueve la carga a una función o variable situada por encima del objeto y usa su resultado paranotes. - Cuando falle el análisis, imprime una línea en stderr y luego sal con el código 1. La línea empieza con
notes.json is damaged:y continúa con el mensaje del error, que indica el motivo que daJSON.parse, comoUnexpected token ']'. No imprimas la traza de pila. No continúes con una lista vacía: el siguienteaddguardaría encima de las notas dañadas. - Si falta
notes.json, sigue significando que el almacén está vacío, como antes. La comprobación se ejecuta para cada comando, porque todos los comandos cargan el almacén.
Pruébalo: escribe list en el cuadro después de $ node notes.js antes de cambiar nada. Verás una traza de pila roja. Después de hacer el cambio, list imprimirá solo la línea roja notes.json is damaged: ... y el código de salida 1. Para volver a ver tus notas, elimina la coma después de "Call Ada" en notes.json y ejecuta list. Luego vuelve a poner la coma antes de pulsar «Comprobar»: las comprobaciones necesitan el archivo dañado, y Restablecer archivos no deshace tus propios cambios.
Pruébalo tú mismo
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;
Todas las lecciones de Conceptos básicos de Node.js
1Ejecutar JavaScript en Node
Hola, NodeLeer el comandoArgumentos de línea de comandosComandos3Archivos
Texto y valores JSONLeer un archivoEscribir texto JSONEscribir un archivoEliminar una notaPractica por tu cuenta: Playground de Express