Conocer y comprender c贸mo se realizan las conexiones hacia los servidores a trav茅s de internet y sus implicaciones en el desarrollo de servidores

1

Bienvenida y presentaci贸n del curso

2

Qu茅 es Node y c贸mo instalarlo

3

驴Qu茅 son y c贸mo se usan las peticiones HTTP?

4

M茅todos, cabeceras y estados

5

Cuerpo y query de la petici贸n

Crear un servidor HTTP en Javascript, y comenzar a escuchar y responder peticiones desde un cliente .

6

Crear un servidor HTTP desde NodeJS

7

驴C贸mo pueden venir las peticiones?

8

Recibir informaci贸n desde el cliente: Body y Query

9

Informaci贸n contextual: Leer las cabeceras

10

Tipos de respuesta: Vac铆a, plana, con datos y estructurada

11

Respuestas coherentes

12

Servir archivos est谩ticos

13

Errores: C贸mo presentarlos e implicaciones en la seguridad

Comprender y desarrollar la arquitectura b谩sica de un backend en NodeJS, y comunicarse entre m贸dulos

14

Conceptualmente: Rutas, controladores y bases de datos

15

Rutas y capa de red: Responsabilidades y l铆mites

16

Controladores: Definiendo la l贸gica de negocio

17

Almacenando la informaci贸n en una base de datos

Utilizar una base de datos para definir, modelar, almacenar y recuperar la informaci贸n de nuestra aplicaci贸n

18

Tipos de Bases de Datos: Relacionales y No Relacionales

19

Crear y Configurar tu Base de Datos con MongoDB

20

MongoDB: Almacenar y leer datos

21

MongoDB: Actualizar datos

22

MongoDB: Consultar datos

23

MongoDB: Eliminar Datos

24

Gestionar conexiones a la base de datos desde la API

Uso de entidades para crear aplicaciones escalables

25

Escalando la arquitectura: M煤ltiples entidades

26

Relacionando nuestras entidades

27

C贸mo recibir ficheros desde NodeJS

28

Guardar el fichero en el servidor

Conocer el protocolo de websockets, e implementar comunicaci贸n cliente/servidor con SocketIO.

29

WebSockets: Qu茅 son, por qu茅 son interesantes y c贸mo usarlos

30

Manejo de Websockets con NodeJS

31

Conectar la API al servidor de WebSockets

Revisi贸n de lo aprendido, y pr贸ximos pasos

32

Revisi贸n y pr贸ximos pasos

33

Tips para escalar nuestro proyecto

No tienes acceso a esta clase

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

Almacenando la informaci贸n en una base de datos

17/33
Recursos

En esta clase veremos c贸mo crear mocks (simulaci贸n de una base de datos) para probar nuestras funciones, rutas y servidor.

Aportes 43

Preguntas 10

Ordenar por:

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

o inicia sesi贸n.

Deb铆 seguir esta ruta antes de iniciar con la Escuela de JavaScript.

Cuando Realizamos getMessages de controller.js no me retornaba nada usando solo store.list - se le debe especificar que es una funci贸n,

//message/controller.js
const getMessages = () =>{
    return new Promise((resolve, reject) =>{
        resolve(store.list())
    });
}

Este curso es tan bueno que parece serie de pel铆cula. Tipo 鈥渆n el pr贸ximo cap铆tulo descubrir谩s por qu茅, no te lo pierdas鈥.
Excelente profesor Carlos!!!

Lo que yo entiendo de MOCKS es que es un objeto que simula o imita el comportamiento de uno real con el fin de poder hacer testing sin la necesidad de tener una capa compleja de base de datos.

Hola Devs:
-Aca les traigo mi solucion hacinendo uso de TypeScript:
Capa de Network del componente Message:

Capa de Controller del componente Message:

Capa del Store del componente Message:

-Aca tienen el commit exacto de esta clase, recuerden que pueden enviar un PR si ven alguna mejora: Click Aqui
-Recuerda, #NuncaParesDeAprender 馃挌

No es m谩s facil usar async await y el codigo queda m谩s simple? Digo osea, queda entendible y facil de mantener segun yo

Que bonito es lo bonito!

No sienten que el profe como que se lo goza. Como que le mete misterio y emoci贸n cuando acaba y nos introduce a la clase siguiente. Ya casi llegamos a la clase 20 y no se siente. Que incre铆ble profesor

Codigo con arrow functions y async await:

//	Controller.js (getMessages)
const getMessages = () => {
    return new Promise((resolve, reject) => {
        if(storage.list()){
            resolve(storage.list())
        }else {
            reject('No messages saved')
        }
    })
}

//	Network (get '/'):
router.get('/', async (req, res) => {
    try {
        const allMessages = await controller.getMessages();
        response.success(req, res, allMessages, 200);
    } catch (error) {
        response.error(req, res, error, 400, 'Error getting getting messages');
    }
});

mocks (Simulando base de datos)

Qu茅 locura, es hermoso el backend, aunque me toca ver las clases varias veces (;

En lo que llevo visto del curso no se utiliza el paradigma de programacion orientada a objetos(clases, constructores, objetos interfaces etc. ) esto tiene alguna ventaja en node ? es una mejor manera de hacer las cosas?. Gracias de antemano por responder

Un Mock es un intento de simular algo o una burla, si queremos una traducci贸n m谩s exacta.
Son muy usados en las pruebas unitarias para simular la interacci贸n con la DB y as铆 mantener las pruebas en el ambiente controlado de nuestro sistema - la interacci贸n de distintos sistemas, ya ser铆a una prueba de integraci贸n -
Por ejemplo, si el desarrollador del FrontEnd de nuestro Telegram, necesitar谩 un Mock de la REST API que estamos creando en este curso, podr铆a utilizar el paquete JSON Server.

Creamos un nuevo archivo store.js dentro la carpeta message que contendr谩 un mock con la simulaci贸n a una base de datos y lo exportamos como un modulo
components/message/store.js:

const list = []

function addMessage (message){
    list.push(message)
}

function getMessages (){
    return list
}

module.exports = {
    add: addMessage,
    list: getMessages,
}

procedemos a importar el modulo store dentro del controller del componente message y hacer uso de el para a帽adir un mensaje, al igual que tenemos la funci贸n para a帽adir un mensaje en el controller, creamos una nueva funci贸n as铆ncrona para poder obtener los mensajes
components/message/controller.js:

const store = require('./store') 

function addMessage (user,message){
    const fullMessage = {
        user,
        message,
        date: new Date(),
    }

    return new Promise((res,rej)=> {
        if (!user || !message){
            rej('data incorrecta')
            return 
        }
        store.add(fullMessage) 
        res(fullMessage)
    })
}

function getMessages (){ 
    return new Promise((res,rej)=> {
        res(store.list())
    })
} 

module.exports = {
    addMessage,
    getMessages 
}

luego procedemos a modificar el GET del network del componente message, importando y ejecutando la funci贸n creada en el controller para obtener los mensajes y modificando la l贸gica de tal manera que todo funcione correctamente y pasemos la lista de mensajes
components/message/network.js:

const express = require('express');
const response = require('../../network/response')
const controller = require('../message/controller')

var app = express()
app.get('/', (req,res)=> {
    controller.getMessages() 
        .then(list => response.sucess(req,res,list)) 
        .catch(error => response.error(req,res,"error al obtener mensajes", 500,error)) 
})

app.post('/', (req,res)=> {
    controller.addMessage(req.body.user, req.body.message)
        .then(fullMessage => response.sucess(req,res, fullMessage,201))
        .catch(error => response.error(req,res, error,500,"detalles del error"))
})

module.exports = app 

si hacemos una petici贸n con el m茅todo GET a URL 鈥/message鈥, el servidor nos responder谩 de esta forma:

{
	"error": "",
	"body": []
}

vemos una lista vac铆a, si queremos a帽adir mensajes podemos hacer una petici贸n con el m茅todo POST a la url 鈥/message鈥 con el cuerpo del body

{
	"user": "Juan",
	"message": "Mensaje Uno"
}

y luego hacemos lo mismo pero cambiamos el contenido del mensaje

{
	"user": "Juan",
	"message": "Mensaje Dos"
}

estar铆amos a帽adiendo 2 nuevos mensajes a la lista, si hacemos una petici贸n con el m茅todo GET a la url 鈥/message鈥 nuevamente como al principio, esta ves el servidor nos responder谩 diferente y veremos:

{
	"error": "",
	"body": [
		{
			"user": "Juan",
			"message": "Mensaje Uno",
			"date": "2022-11-04T20:58:17.176Z"
		},
		{
			"user": "Juan",
			"message": "Mensaje Dos",
			"date": "2022-11-04T20:58:51.080Z"
		}
	]
}

se han a帽adido correctamente los 2 nuevos nuevos mensajes que enviamos con el m茅todo POST

Todos los cursos de este sujeto son una maravilla.

隆Node.Js es genial! 馃槃

Yo recomiendo iniciar por el curso de Fundamentos de node.js (dictado tambi茅n por Carlos) y luego seguir en este.

驴C贸mo se puede agregar un formulario en el frontend para hacer el post? Para que se asemeje m谩s a un chat 馃槄

No es clara la forma en la que estructuras el proyecto, en especial con el router, tal vez no es tan necesario separarlos en carpetas tan alejadas.

En el minuto 7:47 al ejecutar el GET en INSOMNIA me sal铆a un error:

TypeError: controller.getMessages is not a function

El error est谩 en que en el archivo controller.js no se export贸 el nuevo m茅todo getMessages al crear dicha funci贸n en el minuto 5:58

module.exports = {
addMessage,
getMessages
}

genial habia hecho esto pero no sabia que se llamaba mock

No conoc铆a los Mocks

Que clase de brujer铆a es esta !, no sabia que le llamaban mocks 馃憤!

cuando suben el repositorio

Que geniaaaal!!

En el network.js realice el metodo de la siguiente manera

router.get(鈥/鈥,async (req,res)=>{

try {
    const msg= await controller.getMessages();
   response.success(req,res,msg,201)  
} catch (e) {
    response.error('ERROR',500,'estamos presentando problemas en nuestra plataforma')
}

})

dentro de la carpeta message creamos el archivo store
store.js

const list = [];

function addMessage(message) {
聽 聽 list.push(message);
}

function getMessages() {
聽 聽 return list;
}

module.exports = {
聽 聽 add: addMessage,
聽 聽 list: getMessages,
聽 聽 //get
聽 聽 //update
聽 聽 // delete
}

modificamos el controller de message
controller.js

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

function addMessage(user, message) {
聽 聽 return new Promise((resolve, reject) => {
聽 聽 聽 聽 if (!user || !message) {
聽 聽 聽 聽 聽 聽 console.error('[messageController] No hay usuario o mensaje');
聽 聽 聽 聽 聽 聽 return reject('Datos incorrectos');
聽 聽 聽 聽 }
聽 聽 聽 聽 const fullMessage = {
聽 聽 聽 聽 聽 聽 user: user,
聽 聽 聽 聽 聽 聽 message: message,
聽 聽 聽 聽 聽 聽 date: new Date(),
聽 聽 聽 聽 };
聽 聽 聽 聽 store.add(fullMessage);
聽 聽 聽 聽 resolve(fullMessage);
聽 聽 }); 聽
}

function getMessages() {
聽 聽 return new Promise((resolve, _reject) => {
聽 聽 聽 聽 resolve(store.list());
聽 聽 });
}

module.exports = {
聽 聽 addMessage,
聽 聽 getMessages,
};

finalmente cambiamos el m茅todo get en network de la carpeta message
network.js

router.get("/", async(req, res) => {
聽 聽 try {
聽 聽 聽 const allMessages = await controller.getMessages();
聽 聽 聽 response.success(req, res, allMessages, 200);
聽 聽 } catch (error) {
聽 聽 聽 response.error(req, res, error, 500, "Error getting messages");
聽 聽 }
});

En mi caso no me funcionaba el Get. Pero me di cuenta que en el 鈥渘etwork.js鈥 no me funcionaba el 鈥渟uccess鈥 como lo escribe el profesor. Me toco usar response.sucess(req, res, messageList, 200);

Aqu铆 dejo mi codigo; donde utilize async/await y reestructure algunas cosas con javascript moderno

network.js

const express = require('express')
const response = require('../../network/response')
const { addMessage, getMessages } = require('./controller')
const router = express.Router()

router.get('/', async (req, res) => {
    try {
        const messagesList = await getMessages()
        response.success(req, res, messagesList, 200)
    } catch (error) {
        response.error(req, res, 'Unexpected Error', 500, error)
    }
})

router.post('/', async (req, res) => {
    try {
        const { body, query } = req
    
        const fullMessage = await addMessage(body.user, body.message)
        
        if(query.error === "ok") {
            return response.error(req, res, 'Error inesperado', 500, 'Error simulado')
        }
        
        response.success(req, res, fullMessage, 201)
    } catch (error) {
        response.warning(req, res, 'Informaci贸n no valida', 400, 'No hay usuario o mensaje', 'messageController')
    }
})

module.exports = router

controller.js

const { add, list } = require('./store')

const addMessage = (user, message) => {
    return new Promise((resolve, reject) => {
        if(!user || !message) {
            return reject('Los datos son incorrecto')
        }

        const fullMessage = {
            user,
            message,
            date: new Date(),
        }
    
        add(fullMessage)
        resolve(fullMessage)
    })
    
}

const getMessages = () => {
    return new Promise((resolve, reject) => {
        resolve(list())
    })
}

module.exports = {
    addMessage,
    getMessages,
}

store.js

const list = []

const addMessage = (message) => {
    list.push(message)
}

const getMessage = () => {
    return list
}

module.exports = {
    add: addMessage,
    list: getMessage,
    //get
    //update
    //delete
}

El momento por el que he esperado a帽os

hola estoy haciendo las pruebas con postman y noto que tengo que colocar en el header en campo content-length y la longitud exacta, si no lo hago no obtengo respuesta del servicio que estamos desarrollado en el curso, alguien me podria explicar el por que o alguna solucion???

鉂わ笍 quien este volviendo a tomar el curso!! no entend铆a bien como funcionan o para que los Mocks pero ahorra me queda mucho mas claro !! 馃槃

esta clase nos da un panorama m谩s amplio de lo que estamos haciendo. Y se va a poner a煤n mejor cuando se elija una base de datos!!

Alguien ya ha intentado con una base de datos relacional como Sql server? cuando trato de imprimir mi query con .recordset solo me imprime un array vac铆o

tengo una duda, lo que el profesor llama 鈥渟tore鈥 seria como el modelo en el patr贸n MVC? ya que en el modelo es donde esta la logica y las funciones que se conectan con la BD

mocks tiene que ver con TDD?

Asi me quedo mi controller, le agregue el extra de simular un id auto-increment.

const store = require("./store");

const getMessages = () =>
  new Promise((resolve, reject) => {
    resolve(store.list());
  });

const addMessage = (user, message) =>
  new Promise((resolve, reject) => {
    if (!user || !message) {
      reject("Faltan datos");
      return false;
    }

    const fullMessage = {
      id: store.list().length + 1,
      user,
      message,
      date: new Date()
    };

    store.add(fullMessage);

    resolve(fullMessage);
  });

module.exports = {
  getMessages,
  addMessage
};

No sabia de los mocks

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

function addMessage(user, message) {
    return new Promise((resolve, reject) => {
        if (!user || !message) {
            console.error('[messageController] no hay usuario o mensaje');
            reject('Datos incorrectos');
            return false;
        }
        const fullMessage = {
            user: user,
            message: message,
            date: new Date()
        };
        store.add(fullMessage);
        console.log(fullMessage);
        resolve(fullMessage);
    })
}

function getMessages() {
    return new Promise((resolve, reject) => {
        resolve(store.list());
    })
}

module.exports = {
    addMessage,
    getMessages
};

Separar f铆sicamente nuestro c贸digo permite una f谩cil refactorizaci贸n en los m贸dulos que lo necesiten, as铆 no afectar谩 otros m贸dulos.

Viendo esta clase, si considero que hizo falta un m贸dulo un poco m谩s espec铆fico de Bases de datos en este lado del Backend, pero bueno, si lo hicieron de esta manera por algo ser谩

Me esta volando la cabeza, pero no me desanimar谩

Pr谩ctica:

Me confunde un poco cuando pone el .then con messageList como parametro, como hace el codigo para reconocer que es la lista ?