M02L10Semana 3~3 h
L10 — Leer y escribir archivos con fs
~3 h · Semana 3
Persistencia local con fs/promises y path: leer JSON, validar forma básica, escribir atomically-ish.
Objetivo
Implementar loadEstado / saveEstado para EstadoApp en un archivo bajo data/.
Por qué importa
La CLI de hábitos vive entre ejecuciones gracias a un JSON en disco. Hoy construyes esa capa.
Pasos
1. Rutas seguras (30 min)
src/io/rutas.ts:
import path from "node:path";
export function rutaDatos(nombreArchivo: string): string {
return path.join(process.cwd(), "data", nombreArchivo);
}
Crea data/.gitkeep y documenta en README que habits.json es local.
2. Load / save (60 min)
src/io/archivo-json.ts:
import { readFile, writeFile, mkdir } from "node:fs/promises";
import type { EstadoApp } from "../modelo/almacen.js";
import { rutaDatos } from "./rutas.js";
const ARCHIVO = "habits.json";
export async function loadEstado(): Promise<EstadoApp> {
const ruta = rutaDatos(ARCHIVO);
try {
const raw = await readFile(ruta, "utf8");
return JSON.parse(raw) as EstadoApp;
} catch (e) {
if ((e as NodeJS.ErrnoException).code === "ENOENT") {
return { habitos: [], version: 1 };
}
throw e;
}
}
export async function saveEstado(estado: EstadoApp): Promise<void> {
const ruta = rutaDatos(ARCHIVO);
await mkdir(path.dirname(ruta), { recursive: true });
await writeFile(ruta, JSON.stringify(estado, null, 2), "utf8");
}
(Añade import path from "node:path" donde haga falta.)
3. Script de prueba (40 min)
src/io/archivo-json-demo.ts crea hábito, guarda, recarga, verifica.
4. Node docs (40 min)
Lee fs/promises y path en la documentación oficial de Node.
Lectura de esta lección
| Fuente | Qué leer |
|---|---|
| Node.js | fs/promises |
| Node.js | path |
| Catálogo | Bibliografía · M02 |
Hecho cuando
loadEstadodevuelve estado vacío si no hay archivo.saveEstadocreadata/habits.jsonlegible.- Demo ejecutado al menos una vez con salida verificada.
Errores comunes
JSON.parsesin try/catch en archivos corruptos (anota TODO para semana 5).- Rutas relativas al archivo
.tsen vez decwddel proyecto. - Commitear
habits.jsoncon datos personales.