Introducción al proyecto del curso y su arquitectura

1

Arquitectura de Microservicios: Diseño y Escalabilidad

2

Modelado de Bases de Datos para Redes Sociales

Creando la estructura principal

3

Instalación de JavaScript en Node.js

4

Creación y Gestión de Bases de Datos Ficticias con JS

5

Controladores JavaScript: Inyección de Dependencias y Pruebas

6

Documentación de APIs con Swagger en Node.js

Autenticación basada en tokens

7

Autenticación Segura con JWT en Aplicaciones Web

8

Autenticación de Usuarios con JWT en Node.js

9

Programación asincrónica en JavaScript: Promesas y async/await

10

Cifrado de Contraseñas con Bcrypt en Node.js

11

Protección de APIs con Autenticación JWT en Node.js

12

Programación Orientada a Objetos en Java: Métodos y Clases

13

Gestión de errores en Node.js: Mejora la seguridad de tu app

Almacenando datos: MySql

14

Conexión y gestión de bases de datos con MySQL en Node.js

15

Funciones SQL: Inserción, Búsqueda y Actualización

16

Relaciones entre Tablas en Bases de Datos Relacionales

17

Creación de APIs RESTful con Node.js y Express

Microservicios en Node

18

Arquitectura de Microservicios: Separación y Gestión Eficiente

19

Almacenamiento en Microservicios con Express y MySQL

20

Conexiones Seguras entre APIs y Microservicios

21

Diseño de Microservicios Vertical y Horizontal

22

Gestión de Microservicios con PM2: Logs y Reinicios Efectivos

Puesta en producción serverless

23

Desplegar Aplicaciones Serverless con AWS Lambda

24

Variables de Entorno en Despliegues Serverless con Node.js

Cacheando nuestra aplicación

25

Implementación de Caché con Redis para Microservicios Node.js

26

Conexión y Configuración de Redis con Node.js

27

Implementación de Caché en API con Redis

Puesta en producción en virtual machine

28

Instalación y configuración de Node.js en servidor Linux

29

Instalación y configuración de Nginx como proxy reverso

Crea una cuenta o inicia sesión

¡Continúa aprendiendo sin ningún costo! Únete y comienza a potenciar tu carrera

Creación y Gestión de Bases de Datos Ficticias con JS

4/29
Recursos

¿Cómo estructurar una API para separar la lógica de datos?

Crear una API eficiente y bien organizada requiere separar la lógica de datos de la lógica de negocio. Este enfoque no solo facilita el mantenimiento, sino también la escalabilidad de una aplicación. Aquí te mostramos cómo estructurar tu API para lograrlo.

¿Cómo almacenar y gestionar bases de datos?

La organización es clave al manejar diferentes bases de datos. Sigue estos pasos para optimizar su almacenamiento y gestión:

  • Crear una carpeta dedicada: En el directorio raíz, crea una carpeta llamada storage para almacenar las bases de datos. Esto hace que sean accesibles de manera fácil y organizada.

  • Base de datos falsa: Inicializa inicialmente una base de datos falsa en un archivo llamado db.js. Utiliza un objeto con funciones para listar, obtener, agregar y eliminar datos. Así podrás probar el acceso a datos sin configurar aún una base de datos real.

  • Funciones de datos:

    • list: Requiere el tipo de dato o tabla y devuelve los elementos de la misma.
    function list(table) {
        return database[table];
    }
    
    • get: Recupera un elemento basado en su identificador.
    function get(table, id) {
        let col = list(table);
        return col.filter(item => item.id === id)[0] || null;
    }
    
    • add: Inserta nuevos datos en una tabla especificada.
    function add(table, data) {
        database[table].push(data);
    }
    
    • remove: Elimina un elemento específico a partir de su identificador.
    function remove(table, id) {
        let col = list(table);
        database[table] = col.filter(item => item.id !== id);
    }
    

¿Cómo integrar el almacenamiento con la capa de red?

Tener un archivo dedicado al control de datos y su integración mejora la cohesión. Sigue estas instrucciones para que tu API funcione como un reloj:

  • Crear el controlador controller.js: Este archivo gestionará la interacción entre el almacenamiento de datos y la capa de red. Primero, importa el módulo de almacenamiento de la base de datos:

    const store = require('../storage/db');
    
  • Funcionamiento de los controladores: Por ejemplo, para listar usuarios:

    function listUsers() {
        return store.list('users');
    }
    
  • Integración en la capa de red: En el archivo network.js, como un servidor, importa y utiliza las funciones del controlador para responder las solicitudes. Al integrar el controlador a la respuesta HTTP, el acceso a datos se vuelve consistente y modular:

    const controller = require('./controller');
    
    function response(req, res) {
        const userList = controller.listUsers();
        res.send(userList);
    }
    

¿Cómo asegurar la escalabilidad del sistema?

La separación y la modularización son fundamentales para mantener tu aplicación flexible y fácil de escalar:

  • Abstracción de Datos: Toda la lógica de datos se encapsula en db.js, permitiendo cambiar la implementación sin afectar el resto del código.

  • Inyección de dependencias: En las siguientes etapas, integrarás las dependencias directamente al controlador, permitiendo sencillamente el cambio de base de datos durante la ejecución.

Este enfoque no solo organiza el código, sino que lo prepara para pruebas, mantenimiento y futuras mejoras. ¡Continúa aprendiendo y refinando tus habilidades para construir aplicaciones robustas y eficientes!

Aportes 32

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Tambien se puede usar en la funcion get() de dummy find en lugar de filter, ya que find te regresa el primero que encuentra, y filter te regresa todos los que cumplan con la condicion.

function get(table,id){
    let col = list(table)
    return col.find(item => item.id == id) || null
}

Ya que queremos que regrese el primero nos sirve el find.

¿El archivo network se podría llamar routes, correcto?

Sería bueno que programen todo en ingles o en español pero no mezclar.

El mejor profesor. No hay forma de perderse con él.

Les recomiendo usar la extensión de Chrome JSON viewer para que se vea más comprensible el JSON en la ventana, facilita mucho la lectura. https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh

Me gusta como vamos, solo como sugerencia todas las variables deberían ir en inglés. Hay que irnos acostumbrando al lenguaje y a tener un estandar.

Esta forma de realizar las consultas a la base de datos es simple y ahorra tiempo, pero no la recomiendo para proyectos profesionales, en su lugar, lo mejor es crear procedimientos almacenados

Implementación en TypeScript

controller.ts

import * as store from "../../../data/dummy";

const TABLA = 'user';

function list() {
    return store.list(TABLA);
}

export {
    list
}```

_app.ts_

import { config } from ‘…/…/config’;
import response from ‘…/network/response’;

import {router as user} from ‘./components/user/network’;

const app = express();
app.use(json());

app.use(’/api/user/’, user)

app.get(’/’, (req, res) => {
response.success(req, res, ‘Hello, TypeScript!’, 200);
});```

Aislar el código de la base de datos

Ahora una base de datos de prueba por el momento. Creamos una carpeta ‘store’ en la raíz y dentro un archivo dummy.js:

const db = {
  'user': [
    { id: 1, name: 'Miguel' }
  ]
}

function list(table) {
  return db[table]
}

function get(table, id) {
  let collection = list(table)
  return collection.filter(item => item.id === id)[0] || null
}

function upsert(table, data) {
  db[collection].push(data)
}

function remove(table, id) {
  return true
}

module.exports = {
  list,
  get,
  upsert,
  remove
}

Dentro de ‘components/user/’ creamos controller.js:

//* Debe tener acceso a network

const store = require('../../../store/dummy')

const TABLA = 'user'

function list() {
  return store.list(TABLA)
}

module.exports = {
  list
}

Actualizamos network.js:

const express = require('express')

const response = require('../../../network/response')
const Controller = require('./controller')

const router = express.Router()

router.get('/', (req, res) => {
  const lista = Controller.list()
  response.success(req, res, lista, 200)
})

module.exports = router

Y si ahora vamos a https://localhost:3000/api/user tendremos este json:

{
  "error": false,
  "status": 200,
  "body": [
    {
      "id": 1,
      "name": "Miguel"
    }
  ]
}

adjunto las capturas del codigo necesario para editar y eliminar ademas de logica para insertar

controller

network

db

Este curso está dictado por un español, no sé si está nervio, pero no le entiendo cuando habla.

Yo le agregué un poco de lógica al método remove, para tener un comportamiento un poco más parecido al de una DB!
.

Muy bueno Profe Carlos. Al principio me enrede un poco, pero luego fui conectando. Excelente contenido

Excelente teacher, cada vez se entiende mas todo este tema de Node…

Hola no me funcionó, en el navegador me muestra lista pero no los elementos de la BD, { "error": false, "status": 200, "body": "lista" }

Me parece que es más sencillo si el controlador es una función que recibe el (req, res) de la petición. Para que quede algo como esto:

// user/network.js
router.get('/', Controller.list)

// controller.js
function list(req, res) {
  // @code
}

lo unico que “no me agrada” es que va llamando los metodos antes de crearlos, lo que hace que no sean reconocidos por el texto predictivo.

En el caso de la función get en dummy.js creo que sería mejor usar array.find() es más eficiente y descriptivo.

muy buena practica

Excelente clase, y super interesante como separa lo de la db

Me encanta cómo explica el profesor. Muy bueno.

Me agradó la implementación de la capa de acceso a datos, es bastante escalable para proyectos que evolucionan rápidamente. Y ya quiero ver cómo usarlo para testing :sm

De los profes de Platzi con las clases mejor logradas!
Excelente!

Excelente

cuando escribo: localhost:3000/api/user me da el siguiente error:
RangeError [ERR_HTTP_INVALID_STATUS_CODE]: Invalid status code: Todo correcto
at ServerResponse.writeHead (_http_server.js:208:11)
at ServerResponse._implicitHeader (http_server.js:199:8)
at write
(_http_outgoing.js:585:9)
at ServerResponse.end (_http_outgoing.js:709:5)
at ServerResponse.send (C:…\PlatziSocial\node_modules\express\lib\response.js:221:10)
at ServerResponse.json (C:…s\PlatziSocial\node_modules\express\lib\response.js:267:15)
at ServerResponse.send (C:…\PlatziSocial\node_modules\express\lib\response.js:158:21)
at Object.exports.success (C:…\PlatziSocial\network\response.js:4:24)
at C:…\PlatziSocial\api\components\user\network.js:10:14
at Layer.handle [as handle_request] (C:…\PlatziSocial\node_modules\express\lib\router\layer.js:95:5)

Me imagino que podemos usar un archivo para cada base de datos que queramos usar, en el caso que usemos mas de un tipo de BD.

Genial 😃

Excelente practica.

Me imagino que podemos usar un archivo para cada base de datos que queramos usar, en el caso que usemos mas de un tipo de BD.

para este caso el archivo user/network.js vendria siendo el “controlador” (que interactua con la vista) y el archivo controller.js vendria siendo lo que en java es el “service” o DAO

Muy pero muy buena explicación de manejo de datos dummys