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

A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Errores: C贸mo presentarlos e implicaciones en la seguridad

13/33
Recursos

Aportes 53

Preguntas 2

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Para agregar colores al mensaje de error podemos instalar chalk

npm i chalk

Luego en nuestro archivo

// response.js
const chalk = require('chalk')

// ...

exports.error = (req, res, error, status, details) => {
  console.log(chalk.red('[response error]: ' + details))

  res.status(status || 500).send({
    error: error,
    body: ''
  })
}

En consola lo veremos as铆:

En el caso puntual de los console.log no es necesario hacer concatenacion de variables. simplemente pueden agregar cadenas de texto separadas por coma asi:

console.log('Response Error: ',details)

Output: Response Error: Es solo una simulacion de errores

Hola Devs:
-Aqui les dejo un recurso que nos puede ayudar para personalizar los errores dependiendo del status code, muy bueno, sobre todo para usar un switch para cada codigo de error y ahorrarnos escribir el mensaje:
-Link: Click Aqui
-Implementacion: (Los mensajes deben ser mejor descritos como menciona el profesor, solo coloque una descripcion para ayudarme a mi entender cada codigo, pero en produccion debemos evaluar bien cada codigo).

-Uso:

-Aqui esta el commit exacto de esta clase por si gustan: Click Aqui
-Recuerda, #NuncaParesDeAprender 馃挌

Recomendacion de seguridad en control de errores
El profesor recomienda separar el detalle de la informaci贸n en el control de errores.

  • Al usuario se le informa un mensaje general en el response.send: ocurrio un error interno
  • Al programador/desarrollador se le informa un mensaje detallado en el console.log: error en la base de datos, el usuario existe y la contrase帽a es incorrecta, etc.

Mediante este tratamiento sencillo de implementar se atiende la necesidad de informaci贸n de dos tipos diferentes de clientes: el usuario y el desarrollador.

para entender mas de seguridad vean la serie de Mr Robot鈥 es genial

No devolver info sensible.

Buen铆sima la clase. Muy bueno Node.JS. Por ahora me est谩 pareciendo m谩s f谩cil que Django 馃槂

A帽adir color a los mensajes de la consola de Node


Pueden a帽adir color a sus mensajes de consola
sin necesidad de una biblioteca


Con una estructura como la siguiente

console.error('codigo_color%sReset', 'Texto', 'Otro texto');

Por ejemplo

Para que 鈥橻response-error] ' sea Amarillo

console.error('\x1b[33m%s\x1b[0m', '[response-error] ', details);

A continuaci贸n les dejo . . .

C脫DIGOS PARA LA CONSOLA DE NODE

Reset = "\x1b[0m"
Bright = "\x1b[1m"
Dim = "\x1b[2m"
Underscore = "\x1b[4m"
Blink = "\x1b[5m"
Reverse = "\x1b[7m"
Hidden = "\x1b[8m"

FgBlack = "\x1b[30m"
FgRed = "\x1b[31m"
FgGreen = "\x1b[32m"
FgYellow = "\x1b[33m"
FgBlue = "\x1b[34m"
FgMagenta = "\x1b[35m"
FgCyan = "\x1b[36m"
FgWhite = "\x1b[37m"

BgBlack = "\x1b[40m"
BgRed = "\x1b[41m"
BgGreen = "\x1b[42m"
BgYellow = "\x1b[43m"
BgBlue = "\x1b[44m"
BgMagenta = "\x1b[45m"
BgCyan = "\x1b[46m"
BgWhite = "\x1b[47m"

Esta clase es muy valiosa. Carlos es muy buen profesor.

Una muy buena practica seria agregar un try catch para los errores no controlados y poder enviarlos a una BD o escribirlos en un archivo de texto. En un caso mas avanzado podr铆amos usar alg煤n tercero como greylog

He aprendido mucho en este curso de verdad que bueno

Como programadores del back debemos de ser muy cuidadosos con la info que le entregamos al cliente.

Para ello tenemos los logs, estos nos quedan a nosotros como devs, y al cliente le podemos presentar que el error fue algo distinto. Algo interno.

Es 隆MUY! importante jam谩s devolver el error o info confidencial de los errores al cliente

Esto me recuerda a esta imagen que vi hace tiempo, recuerden nunca dar al cliente m谩s informaci贸n de la que necesita!

muy pero muy importante no devolverle informacion confidencial al cliente para hacer la api mas segura

驴como hago para guardar el log de errores en un archivo de texto?

Saludos!

exports.error = (req, res, message, status, details) => {
    console.error(`[response error] ${details}`);
    res.status(status || 500).send({
      error: message,
      body: ''
    });
}

Pueden usar los backticks para la concatenaci贸n de texto con los par谩metros o variables. A esta parte ${details} se le llama interpolaci贸n.

Que interesante tema

Carlos es muy buen profesor, genial!

Interesante el uso de los logs para proteger informaci贸n de los errores propios de nuestra aplicaci贸n

Sus clases son buenisimas para aprender!

Q practicas tan geniales鈥

buenas practicas, para el manejo de errores

Me gusta la forma en como infatiza en cosas que otros maestros solo mencionan. Adminstrar un backend es una responsabilidad importante y Carlos se asegura que seamos consientes de eso. Definitivamente esta formando profesionales, muchas gracias por eso.

Pregunta de examen:
驴Es una buena pr谩ctica devolver la traza del error y una descripci贸n detallada?

en los 煤ltimos segundos del video ya no se escucha el audio, no se si solo es en mi equipo o el video no contiene sonido en los 煤ltimos 15 segundos

entonces los details son para los que mantienen el backend

Excelente clase

este profesor es lo M脕XIMO !!! hasta parece f谩cil node viendolo con 茅l

Para el uso de colores en la consola utilizaba esta librer铆a

npm i cli-color

luego utilizaba esta funci贸n con la cual mostraba un color por el tipo de mensaje que queria enviar.

const Colors = require ("cli-color");
const message = (text, type = "") => {
        let log = "";
        let msg = "";
        let space = "";
        const long = (text.length < 90) ? (100 - text.length) : 0;

        switch (type) {
        case "e":
            log = Colors.xterm(15).bgXterm(124).bold;
            msg = " 鉀  ERROR   ";
            break;
        case "s":
            log = Colors.xterm(15).bgXterm(34).bold;
            msg = " 馃檶  SUCCESS ";
            break;
        case "w":
            log = Colors.xterm(232).bgXterm(214).bold;
            msg = " 鈿狅笍  WARNING ";
            break;
        default:
            log = Colors.xterm(15).bgXterm(12).bold;
            msg = " 鈩癸笍  INFO    ";
            break;
        }
        for (let i = 0; i < long; i += 1) {
            space = `${space} `;
        }
        console.log(log(`[' ${msg} '] => ${text}${space}`));
    }

    message("ALGO SALIO MAL", "e");
    message("TODO ESTA GENIAL", "s");
    message("ALGO  DE INFORMACION", "i");
    message("ADVERTENCIA", "w");

el resultado era este

espero le sea de utilidad

隆Genial!

Excelente y s煤per 煤til el feedback acerca de mostrar la info de los errores a los usuarios en 茅sta clase @Carlos Hern谩ndez !!!

Tengo una duda!!! Sucede que al enviar los errores por ejemplo con c贸digo 400, en el POSTMAN se ve el message del error que mando, pero al frontend me llega 鈥淩equest failed with status code 400鈥, 驴Alguien sabe por que no se env铆a completo el objeto? Es como si no se enviar谩 nada y vue tomar谩 un mensaje por defecto para mostrar. Ayuda pls

Que buena claseee

馃敀

Se podr铆a resumir en un 煤nico exports nuestra respuesta, por supuesto esto depende de la l贸gica y el tama帽o del proyecto. Un ejemplo para el caso de este video:

exports.resp = (req,res,title,messg,status,details=false) 
=> {
    details ? console.error("[response error] ", details) 
    : console.log("Okay")
    res.status(status).send({title: title, messg: messg})
}
exports.error = function (req, res, message, status, details) {
    console.error(chalk.yellowBright('[response error]: ' + details));

    res.status(status || 200).send({
        error: message,
        codigo: 200,
        message: true, 
        body: req.body,
        method: req.method
    })
}

Buena tactica

Excelentes clases! muy conforme con este curso

el famoso log de errores

Excelente curso!

Excelente, el manejo de errores es muy importante 馃槃

Muy buen curso y muy buen profesor 馃榿

Debemos tener cuidado con la informaci贸n que regresamos al usuario, pueden crear vulnerabilidades en nuestro sistema.

exports.success = (req, res, message, status) => {
    res.status(status || 200).send({
        'error': '',
        'body' : message
    })
}

exports.error = (req, res, message, status, details) => {
    console.error(`[Response error]: ${details}`)
    res.status(status || 500).send({
        'error': message,
        'body' : ''
    })
}

![](

//	El primer c贸digo (\x1b[31]) colorea de rojo las letras.
//	El segundo c贸digo (\x1b[0m) reinicia el color a blanco.
console.log('\x1b[31m [response error] \x1b[0m' + details)

Excelente tema siempre debes tener cuidado con la informaci贸n que compartes al usuario final

si la clase dura 4:20 significa algo?

Muy buena acotaci贸n hecha por el profesor. Es muy importante tener ese tipo de cosas en cuenta

Si les sale un error asi en la consola

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

Lo unico que tienen que hacer es

router.post('/message', (req, res) => {
  if (req.query.error == 'ok') {
    response.error(req, res, 'Error simulado', 500, 'es solo una similacion')
  } else {
    response.success(req, res, 'Add message')
  }
})

Esto ocurre porque se esta llamando dos veces a .send y salta ese error

en que momentos se debe usar el try y catch?

Es muy muy muy importante jamas devolver informacion confidencial de los errores al cliente

Muy interesante el tema sobre no devolver informaci贸n confidencial, esto puede disminuir el delito de distintos tipos de hackers a la sociedad.

pr谩ctica:

隆No, nunca, jam谩s, en ninguna ocasi贸n le des informaci贸n confidencial de los errores al cliente!
Esto no es un comercial jaja