Conectar LoopBack con una base de datos

Archivada en Desarrollo Web

Conectar LoopBack con una base de datos

Ya tenemos dos modelos de nuestra aplicación de control de personal, ahora vamos a hacer que la información sea persistente, es decir, vamos a conectarnos con una fuente de datos, más específicamente con una base de datos y en concreto con MongoDB.

Crear la fuente de datos

Para crear una fuente de datos, llamadas datasources en LoopBack, debemos usar el siguiente comando, dentro del directorio del proyecto.
$ lb datasource
A continuación nos va a preguntar por un nombre. [alert type=”info” icon-size=”normal”]No tengo claro si se crea una tabla o una base de datos, pero pensando en esto último, usaré el nombre cmi y espero estar en lo correcto.[/alert]
? Enter the data-source name: cmi
? Select the connector for cmi:
  IBM Cloudant DB (supported by StrongLoop)
  IBM DB2 for z/OS (supported by StrongLoop)
  Redis key-value connector (supported by StrongLoop)
❯ MongoDB (supported by StrongLoop)
  MySQL (supported by StrongLoop)
  PostgreSQL (supported by StrongLoop)
  Oracle (supported by StrongLoop)
(Move up and down to reveal more choices)
El siguiente paso es seleccionar el conector para la datasource, muchos de ellos son proporcionados por StrongLoop, los creadores de LoopBack, y también hay conectores para otras fuentes menos comunes creadas por la comunidad, por ejemplo para Couchbase, Neo4j, Kafka, SAP HANA y ElasticSearch. En nuestro proyecto vamos a usar MongoDB, así que es el conector seleccionado y debemos asegurarnos que la cadena de conexión es la correcta. En mi caso, la cadena de conexión es mongodb://127.0.0.1:27017/cmi.
> $ lb datasource                                                        
? Enter the data-source name: cmi ? Select the connector for cmi: MongoDB (supported by StrongLoop) Connector-specific configuration: ? Connection String url to override other settings (eg: mongodb://username:password@hostname:port/database): ? host: localhost ? port: 27017 ? user: ? password: ? database: cmi ? Install loopback-connector-mongodb@^1.4 Yes
La última pregunta ejecuta el programa npm para instalar el conector especificado.
lb-cmi@1.0.0 /Volumes/datos/projects/lb-cmi
└─┬ loopback-connector-mongodb@1.18.1
  ├── async@1.5.2
  ├── loopback-connector@2.7.1
  └─┬ mongodb@2.2.24
    ├── es6-promise@3.2.1
    ├─┬ mongodb-core@2.1.8
    │ ├── bson@1.0.4
    │ └─┬ require_optional@1.0.0
    │   ├── resolve-from@2.0.0
    │   └── semver@5.3.0
    └── readable-stream@2.1.5
La herramienta agrega la definición de la fuente de datos al archivo server/datasources.json cuyo contenido podemos ver más abajo.
{
  “db”: {
    “name”: “db”,
    “connector”: “memory”
  },
  “cmi”: {
    “host”: “localhost”,
    “port”: 27017,
    “url”: “”,
    “database”: “cmi”,
    “password”: “”,
    “name”: “cmi”,
    “user”: “”,
    “connector”: “mongodb”
  }
}
Aquí podemos ver que nuestra fuente de datos ”cmi” se muestra junto a ”db” que es la fuente de datos por default.

Conectando modelos a fuentes de datos

Ahora que ya tenemos nuestra fuente de datos en MongoDB y nuestros modelos Sitios y Puestos debemos conectarlos. Las aplicaciones hechas con LoopBack usan el archivo model-config.json para enlazar los modelos a las fuentes de datos. Vamos a editar este archivo y localizar la entrada del modelo Sitios.
…
  “sitio”: {
    “dataSource”: “db”,
    “public”: true
  },
…
Ahora vamos a cambiar la propiedad dataSource de db a cmi. Esto conecta el modelo Sitios a la fuente de datos de MongoDB que acabamos de configurar.
…
  “sitio”: {
    “dataSource”: “cmi”,
    “public”: true
  },
…

Agregando datos

Usando el API Explorer es posible agregar datos y verificar el funcionamiento de la conexión a la fuente de datos, por ejemplo, si agregamos los mismos datos del ejemplo en el artículo anterior, veremos que hay un cambio importante:
{
  “nombre”: “Junta Local”,
  “direccion”: “Xicohtencatl 7, Centro, Tlaxcala”,
  “telefonos”: {
    “Ejecutiva”: “(246) 123 456”,
    “Secretarial”: “(246) 456 789”,
    “Registro”: “(246) 789 012”
  },
  “id”: “58a8aa5ef1f2dbabf43463a1”
}
El id generado corresponde al tipo de identificador de documento de MongoDB, en vez de un tradicional entero consecutivo que inicia en 1. También podemos verificar el funcionamiento del conector usando la línea de comandos mongo para verificar que el documento creado esté dentro de la colección.
> db.sitio.find()
{ “_id” : ObjectId(“58a8aa5ef1f2dbabf43463a1”), “nombre” : “Junta Local”, “direccion” : “Xicohtencatl 7, Centro, Tlaxcala”, “telefonos” : { “Ejecutiva” : “(246) 123 456”, “Secretarial” : “(246) 456 789”, “Registro” : “(246) 789 012” } }
También podemos agregar datos programáticamente usando la función automigrate() que elimina las tablas indicadas y las crea de nuevo con los datos del archivo. Al colocar este archivo en el directorio /server/boot se ejecuta de forma automática cada vez que se inicia la aplicación. Vamos a intentarlo con este archivo de prueba.
var SitiosData = function(app){};

SitiosData = function(app){ app.dataSources.cmi.automigrate(‘sitio’, function(err){ if(err) throw err;

app.models.sitio.create([
  {
    nombre: 'Junta Local',
    direccion: 'Xicohtencatl 7, Tlaxcala',
    telefonos: {
      'Ejecutiva': '(246) 123 456',
      'Secretarial': '(246) 456 789',
      'Registro': '(246) 789 012'
    }
  },
  {
    nombre: '01 Junta Distrital',
    direccion: 'Xicohtencatl 2112, Apizaco',
    telefonos: {
      'Ejecutiva': '(241) 123 456',
      'Secretarial': '(241) 456 789',
      'Registro': '(241) 789 012'
    }
  },
  {
    nombre: '02 Junta Distrital',
    direccion: 'Carr Ocotlán-Chiautempan, Tlaxcala',
    telefonos: {
      'Ejecutiva': '(246) 123 456',
      'Secretarial': '(246) 456 789',
      'Registro': '(246) 789 012'
    }
  },
  {
    nombre: '03 Junta Distrital',
    direccion: 'Calle Morelos, Zacatelco',
    telefonos: {
      'Ejecutiva': '(246) 123 456',
      'Secretarial': '(246) 456 789',
      'Registro': '(246) 789 012'
    }
  },
], function(err, sitios){
  if (err) throw err;
  console.log('Modelos creados: \n', sitios);
});

}); }

module.exports = SitiosData;

Y una vez que se ejecute lo vamos a mover, para que no suceda de nuevo.

Esta es la salida al reiniciar la aplicación.

> $ node .
Web server listening at: http://0.0.0.0:3000
Browse your REST API at http://0.0.0.0:3000/explorer
Modelos creados:
 [ { nombre: ‘Junta Local’,
    direccion: ‘Xicohtencatl 7, Tlaxcala’,
    telefonos:
     { Ejecutiva: ‘(246) 123 456’,
       Secretarial: ‘(246) 456 789’,
       Registro: ‘(246) 789 012’ },
    id: 58a8b79d2a8bbdb12fb115f9 },
  { nombre: ‘01 Junta Distrital’,
    direccion: ‘Xicohtencatl 2112, Apizaco’,
    telefonos:
     { Ejecutiva: ‘(241) 123 456’,
       Secretarial: ‘(241) 456 789’,
       Registro: ‘(241) 789 012’ },
    id: 58a8b79d2a8bbdb12fb115fa },
  { nombre: ‘02 Junta Distrital’,
    direccion: ‘Carr Ocotlán-Chiautempan, Tlaxcala’,
    telefonos:
     { Ejecutiva: ‘(246) 123 456’,
       Secretarial: ‘(246) 456 789’,
       Registro: ‘(246) 789 012’ },
    id: 58a8b79d2a8bbdb12fb115fb },
  { nombre: ‘03 Junta Distrital’,
    direccion: ‘Calle Morelos, Zacatelco’,
    telefonos:
     { Ejecutiva: ‘(246) 123 456’,
       Secretarial: ‘(246) 456 789’,
       Registro: ‘(246) 789 012’ },
    id: 58a8b79d2a8bbdb12fb115fc } ]
Ahora podemos revisar en el API Explorer el comando GET de nuestra API y ver el resultado. El siguiente paso es extender nuestra API.

Javier Sanchez Toledano

Auditor Líder ISO 9000 ● Desarrollo Web Full Stack ● Django/Python ● JavaScript · NodeJS · Angular · VueJS · EmberJS ● Swift 4 ● WordPress · Genesis Framework ● Lector ● Fotografo aficionado ● Generación X ● Soy de Tlaxcala

Tlaxcala, México

Comentarios