Escribir archivos con Node.js de manera síncrona y asíncrona

Ariel Alvarado | Junio 18, 2020


Para escribir archivos con Node.js solamente se necesita el módulo fs. Usualmente los métodos síncronos terminan son Sync (por ejemplo writeFileSync) y si no existe esa terminación, son asíncronos (¿Qué es síncrono y asíncrono?).

Escribir archivos de manera síncrona

Para escribir un archivo de manera síncrona utilizaremos writeFileSync. Veamos un ejemplo:

write-files-1.js
const fs = require("fs");
const path = require("path");

const rutaDelArchivo = path.join(__dirname, "archivo1.txt");

const contenidoQueSeDeseaEscribir = "Esto es una cadena";

fs.writeFileSync(rutaDelArchivo, contenidoQueSeDeseaEscribir, {
  encoding: "utf8", // utf8 es el valor por defecto
  mode: "0o666", // son los permisos, este valor puede variar dependiendo si te encuentras en Linux o Windows,
  flag: "w", // w indica que el archivo se debe crear si no existe o su contenido se debe reemplazar si existiera
});
console.log("Archivo escrito con éxito");

El archivo es creado si no existe ó su contenido reemplazado si ya existiera.

Los flags comunmente utilizados son:

  • "a": se abre el archivo para agregar contenido, si no existe se crea.
  • "r+": se abre el archivo para lectura y escritura. Una excepción se lanza si el archivo no existe.
  • "w": se abre el archivo para escritura. Si el archivo existe el contenido se reemplaza, si el archivo no existe es creado.
  • "wx": igual a w pero falla si la ruta existe.

Para conocer todos los flags que pueden utilizarse se debe revisar la documentación de Node.js.

Escribir archivos de manera asíncrona

Para escribir archivos de manera asíncrona se debe utilizar writeFile. Veamos un ejemplo utilizando callbacks:

write-files-2.js
const fs = require("fs");
const path = require("path");

const rutaDelArchivo = path.join(__dirname, "archivo2.txt");

const contenidoQueSeDeseaEscribir = "Esto es una cadena";

fs.writeFile(
  rutaDelArchivo,
  contenidoQueSeDeseaEscribir,
  {
    encoding: "utf8",
    mode: 0o666,
    flag: "wx", // falla si el archivo existe
  },
  err => {
    if (err) {
      throw err;
    }
    console.log("Archivo escrito con éxito!!!");
  }
);
console.log("Final del script");

Si el archivo existe, el script lanzará un error (por el flag wx); si el archivo no existe se crea con el contenido dado.

Ahora, hagamos lo mismo con promesas:

write-files-3.js
const util = require("util");
const fs = require("fs");
const path = require("path");

const rutaDelArchivo = path.join(__dirname, "archivo2.txt");

const contenidoQueSeDeseaEscribir = "Esto es una cadena";

const escribirArchivoPromesa = util.promisify(fs.writeFile);

escribirArchivoPromesa(rutaDelArchivo, contenidoQueSeDeseaEscribir, {
  encoding: "utf8",
  mode: 0o666,
  flag: "wx", // falla si el archivo existe
})
  .then(() => console.log("Archivo escrito con éxito!!!"))
  .catch(err => {
    // idealmente no lanzamos el error, hacemos algo al respecto
    throw err;
  });
console.log("Final del script");

Como en el anterior ejemplo, el archivo es creado si no existe; error si ya existe.

Ahora, por último, hagamos lo mismo utilizando async/await:

write-files-3.js
const util = require("util");
const fs = require("fs");
const path = require("path");

const rutaDelArchivo = path.join(__dirname, "archivo2.txt");

const contenidoQueSeDeseaEscribir = "Esto es una cadena";

const escribirArchivoPromesa = util.promisify(fs.writeFile);

// creamos una función que se ejecuta inmediatamente
(async () => {
  try {
    await escribirArchivoPromesa(rutaDelArchivo, contenidoQueSeDeseaEscribir, {
      encoding: "utf8",
      mode: 0o666,
      flag: "wx", // falla si el archivo existe
    });
    console.log("Archivo escrito con éxito!!!");
  } catch (err) {
    throw err;
  }
})();

console.log("Final del script");

El resultado es el mismo que en los anteriores ejemplos:

Resultado de escribir archivo de manera síncrona

Y eso es todo por ahora, keep coding.