megafs.db

1.1.2 • Public • Published

megafs.db

Manejador de archivos JSON simulando una base de datos.

Instalación:

npm install megafs.db --save

Tabla de Contenidos

Changelog

  • 1.1.2 Se arregló algunos errores del README.md

Introducción

megafs.db usa archivos JSON para almacenar datos de una manera rapida, sencilla y persistente.

Antes de usar megafs.db se recomienda tener conocimiento sobre los objetos.

Documentación

A continuación está la documentación de megafs.db. Para poder explicar de mejor manera la documentación, se asumirá que usted tiene definido a megafs.db así:

const DB = require('megafs.db');

Storage

new DB.Storage(options);

Este constructor inicializa la base de datos.

Parametro Tipo Opcional Descripción
options Object No Un objeto con propiedades.
options.name String No El nombre de la base de datos, si el archivo no existe, este sera creado en el directorio especificado en options.path.
options.path String No El directorio/ruta donde se buscará o creará el archivo que se especificó en options.name.
options.rrt Boolean Si Si quieres que el archivo se lea en tiempo real o no, true para activar y false para desactivar (default: false). Si esta propiedad está en false, los datos leidos y los nuevos datos almacenados se guardaran tambien en memoria para que la base de datos (JSON) no se tenga que leer cada vez que se hace una peticion de lectura a este (recomendable para una mejor flexibilidad y rendimiento). Si esta propiedad está en true se leerá en tiempo real la base de datos (JSON) (recomendable si editas el JSON mediante algo externo)

Ejemplos

const DB = require('megafs.db');
 
let level_db = new DB.Storage({
  name: 'niveles', //Busca o crea el archivo niveles.json en el directorio puesto en path
  path: __dirname, //A la misma altura donde se encuentra este archivo
}); //rrt = false por default
//
const DB = require('megafs.db');
 
let level_db = new DB.Storage({
  name: 'niveles', //Busca o crea el archivo niveles.json en el directorio puesto en path
  path: './database', //En una carpeta llamada database
  rrt: true //Que se lea en tiempo real el archivo niveles.json
});
/*
  Ejemplo del directorio:
  [+] database
    [-] niveles.json
*/

@ Valor de Retorno ── Una clase con los métodos que se verán a continuación.

Storage#build

Storage.build(clave, objeto, split);

Este metodo te permite guardar un objeto en la propiedad indicada en clave.

Parametro Tipo Opcional Descripción
clave String No Un string indicando en que propiedad se guardara el objeto, si la propiedad no existe, se creará, de lo contrario el objeto no será creado pero devolvera los datos que contiene actualmente dicha propiedad (solo se creará si la propiedad no existe), puedes usar el simbolo del punto . para acceder a propiedades anidadas, este simbolo puede se cambiado en split.
objeto Object No Un Objeto que se almacenara en la propiedad especificada en clave.
split String Si El simbolo que se usará para acceder a propiedades anidadas, por default es un punto .

Ejemplo

const DB = require('megafs.db');
 
//Ejemplo #1
let level_db = new DB.Storage({
  name: 'niveles', 
  path: __dirname, 
});
 
let objeto_creado = level_db.build('megastar', {
  password: 'dadadudu',
  medallas: []
});
 
console.log(objeto_creado); // {password: 'dadadudu', medallas: []}
 
 
//Ejemplo #2
let nuevo_objeto = level_db.build('megastar.datos', {
  xp: 0,
  nivel: 1
});
 
console.log(nuevo_objeto); // {xp: 0, nivel: 1}
 
/*
Estructura actual de niveles.json:
 
{
  'megastar': {
    'password': 'dadadudu',
    'medallas': [],
    'datos': {
      'xp': 0,
      'nivel': 1
    }
  }
}
*/

@ Valor de Retorno ── El objeto creado, de lo contrario el objeto existente.

Storage#get

Storage.get(clave, split);

Este metodo te permite obtener el valor de una propiedad anteriormente guardada.

Si el valor de la propiedad es un objeto, el valor de retorno será ese objeto instanciado en la clase ObjectUtils (podras usar sus metodos directamente), si la propiedad no existe regresará undefined.

Parametro Tipo Opcional Descripción
clave String No Un string indicando la propiedad a la que quieres acceder y obtener su valor, puedes usar el simbolo del punto . para acceder a propiedades anidadas, este simbolo puede se cambiado en split.
split String Si El simbolo que se usará para acceder a propiedades anidadas, por default es un punto .

Ejemplo

const DB = require('megafs.db');
 
let eco_db = new DB.Storage({
  name: 'economia', 
  path: __dirname, 
});
 
let objeto_creado = eco_db.build('servidor1', {
  'MegaStar': 50,
  'MoDeR': 20,
  'Marcelo': 46,
  'ratsagem': 6
});
 
let ratsagem_dinero = eco_db.get('servidor1.ratsagem'); //Regresa un numero.
console.log(ratsagem_dinero); //6
let mario_dinero = eco_db.get('servidor1.mario'); //Regresa undefined.
console.log(mario_dinero); //undefined
 
let usuarios = eco_db.get('servidor1'); //Regresa un objeto con el metodo save() instanciado en la clase ObjectUtils
console.log(usuarios); //{MegaStar: 50, ModeR: 20, ...}
console.log(usuarios.map((value, key) => `${key}${value}`)); //['MegaStar: 50', 'MoDeR: 20', ...]
let top_users = usuarios.sort((a, b) => b - a);
console.log(top_users);
/*
{
  MegaStar: 50,
  Marcelo: 46,
  MoDeR: 20,
  ratsagem: 5
}
 
usuarios.partition()...
usuarios.filter()...
usuarios.find()...
etc...
*/

@ Valor de Retorno ── El valor obtenido, si el valor es un objeto, el objeto obtendrá un metodo save y una instancia de la clase ObjectUtils (solo si es un objeto, de lo contrario no reibirá nada), unicamente regresará undefined si no se encontró nada (la propiedad de clave no existe)

Objeto#save()

Objeto.save();

Sirve para guardar o actualizar datos en la base de datos. Sólo funciona si el valor de retorno del método Storage#get es un objeto.

Ejemplo

const DB = require('megafs.db');
 
let info_db = new DB.Storage({
  name: 'perfil', 
  path: __dirname, 
});
 
let objeto_creado = info_db.build('MegaStar', {
  puntos: 0,
  amigos: [],
  info: {
    texto: 'Hola mundo',
    medallas: 0
  }
});
 
 
//Ejemplo #1
let usuario = info_db.get('MegaStar');
usuario.puntos += 1;
usuario.amigos.push('MoDeR');
usuario.save();
/*
Estructura actual de perfil.json:
{
  'MegaStar': {
    'puntos': 1,
    'amigos': ['MoDeR'],
    'info': {
      'texto': 'Hola mundo',
      'medallas': 0
    }
  }
}
*/
 
//Ejemplo #2
let usuario_info = info_db.get('MegaStar.info');
usuario_info.texto = 'Que miras.';
usuario_info.medallas += 40;
usuario_info.save();
/*
Estructura actual de perfil.json:
{
  'MegaStar': {
    'puntos': 1,
    'amigos': ['MoDeR'],
    'info': {
      'texto': 'Que miras.',
      'medallas': 40
    }
  }
}
*/

@ Valor de Retorno ── Retorna los datos actualizados.

Storage#has

Storage.has(clave, split);

Este metodo te permite verificar si existe o no una propiedad especifica en la base de datos.

Parametro Tipo Opcional Descripcion
clave String No Un string indicando la propiedad a verificar, puedes usar el simbolo del punto . para acceder a propiedades anidadas, este simbolo puede se cambiado en split.
split String Si El simbolo que se usará para acceder a propiedades anidadas, por default es un punto .

Ejemplo

const DB = require('megafs.db');
 
let info_db = new DB.Storage({
  name: 'perfil', 
  path: __dirname, 
});
 
let objeto_creado = info_db.build('MegaStar', {
  puntos: 0,
  amigos: [],
  info: {
    texto: 'Hola mundo',
    medallas: 0
  }
});
 
console.log(info_db.has('MegaStar')); //Retorna true
console.log(info_db.has('MegaStar.amigos')); //Retorna true
console.log(info_db.has('MegaStar.info.texto')); //Retorna true
console.log(info_db.has('Mario')); //Retorna false
console.log(info_db.has('Mario.info')); //Retorna false

@ Valor de Retorno ── true si existe, de lo contrario false.

Storage#delete

Storage.delete(clave, split);

Este metodo te permite eliminar una propiedad especifica de la base de datos.

Parametro Tipo Opcional Descripcion
clave String No Un string indicando la propiedad a eliminar, puedes usar el simbolo del punto . para acceder a propiedades anidadas, este simbolo puede se cambiado en split.
split String Si El simbolo que se usará para acceder a propiedades anidadas, por default es un punto .

Ejemplo

const DB = require('megafs.db');
 
let info_db = new DB.Storage({
  name: 'perfil', 
  path: __dirname, 
});
 
let objeto_creado = info_db.build('MegaStar', {
  puntos: 0,
  amigos: [],
  info: {
    texto: 'Hola mundo',
    medallas: 0
  }
});
 
let eliminado = info_db.delete('MegaStar.info');
console.log(eliminado); //retorna true
let no_eliminado = info_db.delete('MegaStar.datos');
console.log(no_eliminado); //retorna undefined ya que 'datos' no existe en MegaStar
 
/*
Estructura actual de perfil.json:
{
  'MegaStar': {
    'puntos': 1,
    'amigos': ['MoDeR']
  }
}
*/

@ Valor de Retorno ── true si se elimino correctamente, de lo contrario undefined.

Storage#allData

Storage.allData();

Este metodo te permite obtener todos los datos de la base de datos.

Ejemplo

const DB = require('megafs.db');
 
let info_db = new DB.Storage({
  name: 'perfil', 
  path: __dirname, 
});
 
let datos = info_db.allData();
console.log(datos); // {'MegaStar': {puntos: 1, amigos: ['MoDeR']}}

@ Valor de Retorno ── Todo el objeto de la base de datos.

ObjectUtils

new DB.ObjectUtils(objeto);

Este constructor permite usar metodos especiales a un objeto.

Parametro Tipo Opcional Descripción
objeto Object No Un objeto.

Ejemplos

const DB = require('megafs.db');
 
let obj = {
  MegaStar: 5,
  MoDeR: 3,
  ratsagem: 4
};
 
let usuarios = new DB.ObjectUtils(obj);
 
let obj_2 = {
  MegaStar: {
    xp: 0,
    nivel: 4
  },
  MoDeR: {
    xp: 0,
    nivel: 2
  },
  ratsagem: {
    xp: 0,
    nivel: 7
  }
}
let usuarios_2 = new ObjectUtils(obj_2);

@ Valor de Retorno ── Una copia del objeto con los métodos que se verán a continuación.

ObjectUtils#keys

ObjectUtils.keys();

Este metodo te permite obtener todas los nombres de las propiedades del objeto, igual a Object.keys

Ejemplo

console.log(usuarios.keys()); //['MegaStar', 'MoDeR', 'ratsagem']

@ Valor de Retorno ── Un Array que contiene el nombre de las propiedades del objeto.

ObjectUtils#values

ObjectUtils.values();

Este metodo te permite obtener todos los valores de todas las propiedades del objeto, igual a Object.values

Ejemplo

console.log(usuarios.values()); //[5, 3, 4]

@ Valor de Retorno ── Un Array que contiene los valores de las propiedades del objeto.

ObjectUtils#sort

ObjectUtils.sort([compareFunction]);

Este metodo te permite ordenar las propiedades del objeto, similar a Array.sort

Parametro Tipo Opcional Descripcion
compareFunction Function Si Una funcion que define el orden del objeto, si no se pasa ninguna funcion se ordenará segun el valor unicode de cada carácter mediante la conversion a string de cada elemento.

Ejemplo

console.log(usuarios.sort((a, b) => b - a));
/*
  {
    MegaStar: 5,
    ratsagem: 4,
    MoDeR: 3
  }
*/
 
console.log(usuarios_2.sort((a, b) => b.nivel - a.nivel)); //lo ordenamos mediante la propiedad nivel
/*
  {
    ratsagem: {xp: 0, nivel: 7},
    MegaStar: {xp: 0, nivel: 4},
    MoDeR: {xp: 0, nivel: 2}
  }
*/
 

@ Valor de Retorno ── Un Objeto ordenado.

ObjectUtils#filter

ObjectUtils.filter(callback(currentValue[, currentKey]));

Este metodo te permite obtener unicamente las propiedades que cumplan la condicion del callback, similar a Array.filter

Parametro Tipo Opcional Descripcion
callback Function No Una funcion que comprobará cada propiedad del objeto para ver si se cumple o no la condicion, acepta 2 parametros.
currentValue * No El valor de la propiedad actual que está siendo procesado.
currentKey String Si El nombre de la propiedad actual que está siendo procesado.

Ejemplo

console.log(usuarios.filter((v) => v < 4)); //Solo los que son menor a 4
/*
  {
    MoDeR: 3
  }
*/
 
console.log(usuarios_2.filter((v) => v.nivel > 2)) //Solo los que son mayor a 2
/*
  {
    ratsagem: {xp: 0, nivel: 7},
    MegaStar: {xp: 0, nivel: 4}
  }
*/

@ Valor de Retorno ── Un Objeto con las propiedades que cumplieron la condicion del callback.

ObjectUtils#map

ObjectUtils.map(callback(currentValue[, currentKey]));

Este metodo te permite crear un array con los resultados de la funcion indicada en el callback, similar a Array.map

Parametro Tipo Opcional Descripcion
callback Function No Una funcion que se ejecutará sobre cada propiedad del objeto.
currentValue * No El valor de la propiedad actual que está siendo procesado.
currentKey String Si El nombre de la propiedad actual que está siendo procesado.

Ejemplo

console.log(usuarios.map((v, k) => `nombre de la propiedad: ${k}, valor de la propiedad: ${v}`)); //'v' es el valor y 'k' la clave de la propiedad actual que está siendo procesado. 
 
/*
  [
    'nombre de la propiedad: MegaStar, valor de la propiedad: 5',
    'nombre de la propiedad: MoDeR, valor de la propiedad: 3',
    'nombre de la propiedad: ratsagem, valor de la propiedad: 4'
  ]
*/
 
console.log(usuarios_2.map((v, k) => `Nombre: ${k}, Nivel: ${v.nivel}`));
/*
  [
    'nombre: MegaStar, Nivel: 4',
    'nombre: MoDeR, Nivel: 2',
    'nombre: ratsagem, Nivel: 7'
  ]
*/

@ Valor de Retorno ── Un Array con los elementos evaluados en el callback.

ObjectUtils#size

ObjectUtils.size();

Este metodo te permite obtener la cantidad de propiedades que hay en el objeto.

Ejemplo

console.log(usuarios.size())//3

@ Valor de Retorno ── Un numero que indica la cantidad de propiedades que hay en el objeto.

ObjectUtils#find

ObjectUtils.find(callback(currentValue[, currentKey]));

Este metodo te permite buscar una propiedad especifica en el objeto, similar a Array.find

Parametro Tipo Opcional Descripcion
callback Function No Una funcion que comprobará cada propiedad del objeto para ver si se cumple o no la condicion, acepta 2 parametros.
currentValue * No El valor de la propiedad actual que está siendo procesado.
currentKey String Si El nombre de la propiedad actual que está siendo procesado.

Ejemplo

console.log(usuarios.find((v) => v == 2)); //undefined
console.log(usuarios.find((v) => v == 4)); //4
console.log(usuarios.find((v, k) => k == 'MegaStar')); //4
 
console.log(usuarios_2.find((v) => v.nivel > 3)) // {xp: 0, nivel: 4}

@ Valor de Retorno ── El valor de la primera propiedad que cumplió la condicion del callback, de lo contrario undefined.

ObjectUtils#findKey

ObjectUtils.findKey(callback(currentValue[, currentKey]));

Este metodo te permite buscar el nombre de una propiedad especifica en el objeto, similar a Array.findIndex pero retorna el nombre de la propiedad en lugar del indice posicional.

Parametro Tipo Opcional Descripcion
callback Function No Una funcion que comprobará cada propiedad del objeto para ver si se cumple o no la condicion, acepta 2 parametros.
currentValue * No El valor de la propiedad actual que está siendo procesado.
currentKey String Si El nombre de la propiedad actual que está siendo procesado.

Ejemplo

console.log(usuarios.findKey((v) => v == 2)); //undefined
console.log(usuarios.findKey((v) => v == 3)); //MoDeR
 
console.log(usuarios_2.findKey((v) => v.nivel > 6)) //ratsagem

@ Valor de Retorno ── El nombre de la primera propiedad que cumplió la condicion del callback, de lo contrario undefined.

ObjectUtils#partition

ObjectUtils.partition(callback(currentValue[, currentKey]));

Este metodo divide el objeto en dos objetos, donde el primer contiene las propiedades que cumplieron con la condicion del callback y el segundo objeto con las propiedades que no la cumplieron.

Parametro Tipo Opcional Descripcion
callback Function No Una funcion que comprobará cada propiedad del objeto para ver si se cumple o no la condicion, acepta 2 parametros.
currentValue * No El valor de la propiedad actual que está siendo procesado.
currentKey String Si El nombre de la propiedad actual que está siendo procesado.

Ejemplo

let [alto, bajo] = usuarios.partition((v) => v > 4);
console.log(alto)
console.log(bajo)
/*
alto:
  {
    MegaStar: 5
  }
 
bajo: 
  {
    MoDeR: 3,
    ratsagem: 4
  }
*/
 
let [nombres_m, nombres_no_m] = usuarios_2.partition((v, k) => k.startsWith('M')); //Los que comienzan con M
console.log(nombres_m)
console.log(nombres_no_m)
/*
nombres_m:
  {
    MegaStar: {xp: 0, nivel: 4},
    MoDeR: {xp: 0, nivel: 2}
  }
 
nombres_no_m: 
  {
    ratsagem: {xp: 0, nivel: 7}
  }
*/

@ Valor de Retorno ── Un Array que contiene dos objetos, el primero objeto contiene las propiedades que cumplieron con la condicion del callback, mientras que el segundo objeto con las que no la cumplieron.

ObjectUtils#some

ObjectUtils.some(callback(currentValue[, currentKey]));

Este metodo verifica si existe una propiedad que cumpla con la condicion del callback, similar a Array.some

Parametro Tipo Opcional Descripcion
callback Function No Una funcion que comprobará cada propiedad del objeto para ver si se cumple o no la condicion, acepta 2 parametros.
currentValue * No El valor de la propiedad actual que está siendo procesado.
currentKey String Si El nombre de la propiedad actual que está siendo procesado.

Ejemplo

console.log(usuarios.some((v) => v == 2)); //false
console.log(usuarios.some((v) => v > 3)); //true
 
console.log(usuarios_2.some((v, k) => v.nivel > 3 && k == 'MegaStar')) //true

@ Valor de Retorno ── true si al menos una propiedad cumplió con la condicion del callback, de lo contrario false.

ObjectUtils#random

ObjectUtils.random(n);

Este metodo te permite obtener una cantidad especifica de propiedades seleccionadas aleatoriamente.

Parametro Tipo Opcional Descripcion
n Number Si El numero de propiedades aleatorias que se obtendrá, por default es 1 y si el numero es mayor a la cantidad de propiedades que actualmente tiene el objeto, el valor del numero sera puesto en la cantidad de propiedades existentes.

Ejemplo

console.log(usuarios.random(); // {MoDeR: 3} => seleccionado aleatoriamente
console.log(usuarios.random(2); // {MegaStar: 5, ratsagem: 4} => seleccionado aleatoriamente
 
console.log(usuarios_2.some(5) // 5 es mayor a la cantidad de propiedades que hay en usuarios_2, 5 sera cambiado a 3 automaticamente.
/*
  {
    ratsagem: {xp: 0, nivel: 7},
    MegaStar: {xp: 0, nivel: 4},
    MoDeR: {xp: 0, nivel: 2}
  }
 
  Seleccionado aleatoriamente
*/

@ Valor de Retorno ── Un objeto con las propiedades seleccionadas aleatoriamente.

FileSyncData

new DB.FileSyncData(path, nombre);

Este constructor permite leer archivos JSON y guardar datos de una forma sincrona.

Parametro Tipo Opcional Descripción
path String No El directorio/ruta donde se buscará el archivo que se especificó en nombre.
nombre String No El nombre del .JSON que se encuentra especificado en path.

Ejemplos

const DB = require('megafs.db');
 
let start = new DB.FileSyncData(__dirname, 'niveles'); //No hace falta colocar el .json

@ Valor de Retorno ── Una clase con los métodos que se verán a continuación.

FileSyncData#readData

FileSyncData.readData();

Este metodo inicia la lectura del archivo .json que se especificó en el constructor FileSyncData.

El contenido del .json debe ser un objeto.

Ejemplo

let db_data = start.readData();

@ Valor de Retorno ── Los datos del archivo json listo para ser usados.

FileSyncData#saveData

FileSyncData.saveData(nuevo_objeto);

Este metodo guarda el nuevo_objeto en el archivo que se especificó en el constructor FileSyncData.

Parametro Tipo Opcional Descripcion
nuevo_objeto Object No El nuevo objeto que será puesto en el .json.

Ejemplo

let db_data = start.readData();
if(!db_data['MegaStar']) {
  db_data['MegaStar'] = {
    xp: 0,
    nivel: 1
  }
}
else {
  db_data['MegaStar'].xp += Math.floor(Math.random() * 5) + 1 //supongamos que sale 3
}
 
start.saveData(db_data);
 
/*
Estructura actual de niveles.json:
  {
    'MegaStar': {
      'xp': 3,
      'nivel': 1
    }
  }
*/

@ Valor de Retorno ── Nada.

Notas

Cuando ocurra un error se lanzará una excepcion especifica (throw) indicando el motivo del fallo.

Los constructores FileSyncData y ObjectUtils son de libre uso, puedes usarlos independientemente de si usas o no el constructor Storage

Package Sidebar

Install

npm i megafs.db

Weekly Downloads

16

Version

1.1.2

License

ISC

Unpacked Size

41.3 kB

Total Files

11

Last publish

Collaborators

  • megastar