Leer y escribir datos con node.js

Node.js es un entorno de ejecución de javascript que nos permite utilizarlo fuera del navegador y nos da acceso a muchas funcionalidades que están limitadas en el navegador por motivos de seguridad.

Una de las principales funciones que nos ofrece node es la posibilidad de leer y escribir archivos en el disco duro. Así, podemos conseguir que nuestros scripts sean capaces de recordar información entre diferentes ejecuciones, lo que nos permite, por ejemplo, guardar una configuración.

Veamos cómo se hace.

//Importamos el modulo fs (viene preinstalado)
const fs = require('fs');

//Creamos un objeto
let objeto = {
  texto : "Un texto de prueba",
  numero : 3.1416,
  lista : [1, 2, 3],
  otroObjeto : {clave : "valor"},
  listaObjetos : [
    {clave : "valor"},
    {clave : "valor"},
    {inception : {
      inception : "valor"
      },
    },  
  ]
};

//Guardamos el objeto en un archivo de texto
fs.writeFileSync("test.json", 
                 JSON.stringify(objeto));

//Leemos el archivo que acabamos de crear
let Datos = fs.readFileSync("test.json");
Datos = JSON.parse(Datos);
console.log(Datos);

Podemos utilizar el modulo “fs” para interactuar con el sistema de ficheros del ordenador (son las siglas de file system en inglés). Si tenemos un objeto cargado en la memoria del programa, con JSON.stringify podemos convertirlo a texto para después volcarlo a un archivo de texto, proceso que se conoce como serialización.

Una vuelta de tuerca más

Hagamos algo un poco más sofisticado. Vamos a hacer un programa que recuerda las veces que se ha ejecutado y las fechas. Es muy sencillo. Lo único que tenemos que hacer es crear un fichero al que iremos añadiendo la fecha en la que estamos ejecutando el programa.

const fs = require('fs');
const Archivo = "db.json";

let LeerDatos = function () {
  let rawdata = fs.readFileSync(Archivo);
  let Datos = JSON.parse(rawdata);
  
  return Datos;
};

let Fecha = new Date();
Fecha = Fecha.getTime() + (-Fecha.getTimezoneOffset() * 60 * 1000);
Fecha = new Date(Fecha);
Fecha = Fecha.toISOString().substring(0, 19).replace("T", " ");

//Comprobamos si existe el archivo
if (fs.existsSync(Archivo) === false) {
  //Si no existe lo creamos
  fs.writeFileSync(Archivo, 
               '[ "' + Fecha + '" ]');
  console.log("Primera ejecución:");
  console.log(LeerDatos());
} else {
  //Si existe lo leemos y añadimos la fecha actual
  let Datos = LeerDatos();
  Datos.unshift(Fecha);
  fs.writeFileSync(Archivo, 
                 JSON.stringify(Datos));
  console.log("El programa se ha ejecutado " + Datos.length + " veces");
  console.log(Datos);
};

Cada vez que ejecutamos el script, lee la lista que contiene el fichero y la carga en un array en la memoria del programa. Una vez que tenemos el array en memoria, podemos agregar la fecha actual a la misma.

Al usar el método unshift para incorporar los elementos a la lista, los introducimos al principio de la lista, por lo que la primera fecha será la más reciente.

Cuando ya hemos añadido la fecha actual al array, lo volvemos a guardar en disco. Así, la próxima vez que la leamos tendremos la fecha que acabamos de crear en la primera posición. 

Dado que añadimos una fecha por cada vez que ejecutamos el programa, contando el número de elementos de la lista podemos ver las veces que se ha ejecutado el programa.

De momento, sólo hemos guardado fechas en el disco en un array sencillo, pero podríamos guardar datos que nos hemos descargado de una API o información que proviene de una base de datos. 

Además, en vez de un array sencillo podríamos guardar un objeto más complejo, de forma que en cada iteración en vez de añadir solo una fecha en texto podemos incluir un objeto con varias propiedades. 

Si por ejemplo añadimos el siguiente objeto cada vez que ejecutamos el script, tendremos un log fácil de procesar para cualquier aplicación que desarrollemos.

let objeto = {
  fecha : La fecha actual,
  mensaje : "Un mensaje que genera la aplicación, ya sea de error o de que todo ha ido bien.",
  error : true / false
};

Así, el fichero contendrá un array en el que cada elemento es un objeto con éstas propiedades. Podríamos utilizar filter junto a una expresión regular para recuperar los elementos relacionados con un error en particular y ver, por ejemplo, cuando fue la última o la primera vez que nos encontramos el fallo.

Otro de los usos más frecuentes de éste tipo de operaciones es la creación de un fichero de configuración. Así podemos meter ahí las opciones y permanecerán constantes entre las diferentes ejecuciones del programa.

La persistencia de los datos es uno de los aspectos más fundamentales en programación, y saber gestionarla te permitirá resolver muchísimos problemas. La estructura de los ficheros JSON es bastante sencilla y flexible, pero si las necesidades de datos de tu aplicación son muy complejas será mejor que recurras a una base de datos propiamente dicha, ya sea relacional o no relacional. En nuestro blog encontrarás un curso gratuito para aprender SQL, además, si quieres aprender node en profundidad, tanto el Bootcamp Full Stack como el Training son dos opciones ideales para ello.

Autor

Manuel Torres

Selección de talento en OXYGEN

Ir arriba
Abrir Chat
1
¿Necesitas ayuda?
OXYGEN Academy
¡Hola! 👋 ¿Necesitas más información?