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 39

Preguntas 10

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

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

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.

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

Que bonito es lo bonito!

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

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

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.

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

隆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 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 ?