Lees y escribes archivos con el módulo fs/promises y construyes rutas fiables gracias al módulo path.
Abrir esta lección en KodokonEn el navegador, JavaScript no tiene permiso para tocar los archivos de tu disco: es una cuestión de seguridad. Node, en cambio, se ejecuta directamente en tu máquina y puede leer y escribir archivos gracias al módulo fs (file system, sistema de archivos). Usaremos su versión moderna, fs/promises, en la que cada función devuelve una promesa - ya sabes esperarlas con await, visto en el curso de JavaScript. Fíjate en el prefijo node: de las importaciones: deja claro que el módulo proviene del propio Node, no de node_modules. Y buenas noticias: en un módulo ES, await funciona directamente a nivel del archivo, sin una función que lo envuelva.
import { writeFile } from "node:fs/promises";
await writeFile("notes.txt", "First note\n");
console.log("File created!");Para leer, la misma lógica con readFile. Su segundo parámetro es esencial: utf8 designa la codificación, es decir, la forma de traducir los bytes almacenados en el disco a texto legible. Si lo omites, Node devuelve un objeto Buffer - bytes en bruto - en lugar de una cadena de caracteres.
import { readFile } from "node:fs/promises";
const text = await readFile("notes.txt", "utf8");
console.log(text);Hablemos de rutas. Una ruta relativa (notes.txt, data/log.txt) parte de la carpeta actual; una ruta absoluta (C:\... o /home/...) parte de la raíz del disco. Una trampa clásica: Windows separa las carpetas con \, macOS y Linux con /. El módulo path resuelve el problema: path.join ensambla las piezas con el separador correcto, sea cual sea el sistema. Combinémoslo con mkdir, que crea una carpeta.
import path from "node:path";
import { mkdir, writeFile } from "node:fs/promises";
const file = path.join("data", "log.txt");
await mkdir("data", { recursive: true });
await writeFile(file, "First log\n");
console.log("Written to:", file);