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