No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Separando la base de datos a un microservicio

19/29
Recursos

Aportes 18

Preguntas 3

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

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

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

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!

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.

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 !!! 馃槷

Es implementaci贸n es interesante, pero por favor el naming ya no se entiende nada; hay demasiadas cosas llamadas 鈥渘etwork鈥 :cr

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)
    }
 }

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 馃槂

Excelente. Vamos a separarlo.