Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Separando la base de datos a un microservicio

19/29
Recursos

Aportes 17

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Un microservicio es una pequeña aplicación que se encarga de una parte de un software más complejo de manera aislada, y se comunica con el resto del software mediante diferentes métodos: peticiones HTTP, o algún sistema de colas. micro.js es una librería muy pequeña (alrededor de 100 líneas de código) de JavaScript, que nos permite usar Node.js para crear fácilmente microservicios que funcionen sobre el protocolo HTTP, y haciendo uso de Async/Await y todas las características que se incluyeron en ECMAScript 2015 para facilitarnos el programarlos.

Me he visto esta clase ya 3 veces cada ciertos meses este profesor es muy bueno explicando este concepto. me parece muy muy buena

Una barbaridad lo que se aprende en cada curso con el profe Carlos

de verdad que claro me esta quedando esto de los microservicios

wooo creo que esto es complicado, más porque el profe no esta usando un metodología estructurada de trabajo como lo es MVC. Se que ese modelo no aplicaría para APIs pero creo que es complicado seguirle el hilo he ir entendiendo todo!

Separando la base de datos a un microservicio

Creamos ./mysql/index.js:

const express = require("express");
const app = express();
const config = require('../config')
const router = require('./network')


app.use(express.urlencoded({extended: true}))
app.use(express.json())

//* RUTAS
app.use('/', router)

app.listen(config.mysqlService.port, () => {
  console.log(`Servidor MySQL escuchando en el puerto ${config.mysqlService.port}`);
})

Creamos ./mysql/network.js:

const express = require('express');

const response = require('../network/response');
const Store = require('../store/mysql');

const router = express.Router();

router.get('/:tabla', list)
router.get('/:tabla/:id', get)
router.post('/:tabla', insert)
router.put('/:tabla', upsert)

async function list(req, res, next) {
  try {
    const datos = await Store.list(req.params.tabla);
    response.success(req, res, datos, 200);
  } catch (error) {
    next(error);
  }
}

async function get(req, res, next) {
  try {
    const datos = await Store.get(req.params.tabla, req.params.id);
    response.success(req, res, datos, 200);
  } catch (error) {
    next(error);
  }
}

async function insert(req, res, next) {
  try {
    const datos = await Store.insert(req.params.tabla, req.body);
    response.success(req, res, datos, 201);
  } catch (error) {
    next(error);
  }
}

async function upsert(req, res, next) {
  try {
    const datos = await Store.upsert(req.params.tabla);
    response.success(req, res, datos, 200);
  } catch (error) {
    next(error);
  }
}

module.exports = router;

Actualizamos ./config.js:

module.exports = {
  api: {
    port: process.env.API_PORT || 3000,
  },
  jwt: {
    secret: process.env.JWT_SECRET || 'notASecret!'
  },
  mysql: {
    host: process.env.MYSQL_HOST || 'sql5.freemysqlhosting.net',
    user: process.env.MYSQL_USER || 'sql5437281',
    password: process.env.MYSQL_PASS || 'xMYIzS32wz',
    database: process.env.MYSQL_DB || 'sql5437281',
  },
  mysqlService: {
    port: process.env.MYSQL_SRV_PORT ||3001
  }
}

Ahora si hacemos GET https://localhost:3001/post o GET https://localhost:3001/user obtendremos la información de la base de datos.

I N C R E I B L E !!! 😮

Primera vez que veo los Microservicios lo que vi lo entendi, seguimos.!!

Algo me dice que aquí se pueden hacer ataques de inyección de SQL y que deberíamos validar los datos antes de guardarlos en la base de datos.

super!

La idea es hacer un pequeño api que exponga únicamente el CRUD a base de datos.

El uso del Store, ¿no tendríamos que ponerlo dentro del controller?

Muy bueno

muy chevere

genial 😃

Algo que me gustaría agregar a esta clase es que los errores del network.js de mysql deberían ser manejados, aún no comprendo bien para que sirve la función next así que mi código quedó así:

async function list(req, res, next) {
    try {
        const dataList = await store.list(req.params.table)
        response.success(req, res, dataList, 200)
    } catch (error) {
        response.error(req, res, 'Internal error', 500, error)
    }

}
async function get(req, res, next) { 
    try {
        const data = await store.get(req.params.table, req.params.id)
        response.success(req, res, data, 200)
    } catch (error) {
        response.error(req, res, 'Internal error', 500, error)
    }
}
async function insert(req, res, next) {
    try {
        const data = await store.insert(req.params.table, req.body)
        response.success(req, res, data, 201)
    } catch (error) {
        response.error(req, res, 'Internal error', 500, error)
    }
 }
async function update(req, res, next) {
    try {
        const data = await store.upsert(req.params.table, req.body)
        response.success(req, res, data, 201)
    } catch (error) {
        response.error(req, res, 'Internal error', 500, error)
    }
 }

Excelente. Vamos a separarlo.