Menu

fs.writeFile en Node.js: escribir, añadir y crear archivos

Escribe un archivo en Node.js con fs.writeFile, fs.writeFileSync o await writeFile de fs/promises. El archivo se crea si no existe y se reemplaza si ya existe; usa appendFile para añadir al final.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

fs.writeFile(path, data, callback) escribe un string o un Buffer en un archivo. Si el archivo no existe, Node lo crea; si existe, el contenido anterior se reemplaza. fs.writeFileSync(path, data) hace lo mismo y espera a que la escritura termine, y fs.appendFile añade al final del archivo en lugar de reemplazarlo.

Imprime saved y después el texto que volvió a leer; el callback solo recibe un error (o null), nunca los datos. Pasa 42 en lugar del string y la llamada lanza un TypeError: los datos tienen que ser un string o un Buffer.

writeFile, writeFileSync y fs/promises

Las tres formas reciben los mismos argumentos y se diferencian en cómo esperas el resultado.

const fs = require('fs');
const fsp = require('fs/promises');

fs.writeFileSync('a.txt', 'one');            // blocks, throws on error

fs.writeFile('b.txt', 'two', (err) => {});   // callback with err

await fsp.writeFile('c.txt', 'three');       // promise, use in async code

Usa writeFileSync en scripts y código de arranque, y la versión con promesas en servidores, donde una escritura síncrona bloquea todas las demás peticiones hasta que el disco termina. La página de fs/promises muestra el resto de la API de promesas.

Añadir a un archivo con appendFile

writeFile reemplaza el archivo entero. Para añadir una línea a un log, usa appendFile, que además crea el archivo la primera vez.

La primera lectura imprime "second\n", porque el segundo writeFileSync reemplazó first, y la segunda imprime "second\nthird\nfourth\n" (JSON.stringify hace visibles los saltos de línea). Añade tú el \n: ninguna de las dos funciones lo pone.

writeFileappendFile
El archivo no existeLo creaLo crea
El archivo existeReemplaza el contenidoAñade al final
Flag por defecto'w''a'
Uso típicoGuardar un documento entero o un JSONLogs, una línea cada vez

No sobrescribir: la opción flag

El tercer argumento puede ser un objeto de opciones. Su flag decide qué pasa con un archivo que ya existe. 'wx' significa "escribe, pero falla si el archivo ya existe", que es la forma segura de crear un archivo una sola vez.

La segunda llamada falla con EEXIST, así que el archivo sigue conteniendo abc123. Cambia el nombre del archivo de la segunda llamada a id2.txt y las dos llamadas imprimen created.

Los flags que más vas a ver: 'w' (por defecto, reemplazar), 'a' (añadir), 'wx' (solo crear) y 'ax' (añadir, pero solo a un archivo nuevo).

Comprobar primero con fs.existsSync y después escribir deja un hueco: otro proceso puede crear el archivo entre la comprobación y la escritura. 'wx' hace las dos cosas en un solo paso.

Escribir JSON en un archivo

writeFile no acepta objetos. Conviértelos en texto con JSON.stringify; el tercer argumento, 2, indenta la salida para que el archivo se lea bien.

El archivo contiene el objeto en varias líneas indentadas, y al parsearlo de nuevo se obtiene un objeto igual, así que la última línea imprime 2. Pasa el objeto sin JSON.stringify y la llamada lanza un TypeError.

Crear antes la carpeta con mkdir

writeFile crea archivos, no carpetas. Escribir en reports/2026/june.txt cuando reports no existe falla con ENOENT. Crea primero la ruta con mkdir y { recursive: true }, que crea todas las carpetas que faltan y no hace nada si ya existen.

La primera escritura falla con ENOENT; después de mkdir, la misma escritura funciona y readdir lista [ 'june.txt' ]. En código real, construye estas rutas con path.join para que funcionen también en Windows.

Errores comunes

Dar por hecho que el archivo está escrito justo después de la llamada. fs.writeFile devuelve antes de que los datos estén en disco. Lee el archivo o empieza el siguiente paso dentro del callback, o haz await de la versión con promesas.

Perder datos al escribir en un bucle. Llamar a writeFile una vez por elemento reemplaza el archivo cada vez, y solo queda el último elemento. Usa appendFile, o construye el string completo y escríbelo una vez.

Escribir [object Object]. Pasar un objeto por String() o por un template literal escribe [object Object]. Usa JSON.stringify.

Preguntas frecuentes

¿fs.writeFile sobrescribe el archivo?

Sí. Con el flag por defecto 'w' vacía el archivo y escribe los datos nuevos, así que el contenido anterior desaparece. Pasa { flag: 'a' } o usa appendFile para añadir al final.

¿fs.writeFile crea el archivo si no existe?

Sí, crea el archivo. Pero no crea las carpetas que faltan: escribir en logs/app.log cuando logs no existe falla con ENOENT.

¿Qué puedo pasar como datos?

Un string, un Buffer o un typed array. Cualquier otra cosa, como un objeto o un número, lanza un TypeError, así que convierte antes los objetos con JSON.stringify y los números con String().

¿Es seguro llamar a writeFile muchas veces a la vez sobre el mismo archivo?

No. Dos llamadas a writeFile en paralelo sobre un archivo pueden intercalarse y dejar el contenido mezclado. Espera a que termine una antes de empezar la siguiente, o junta los datos y escribe una sola vez.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

Comenzar