El curso definitivo de Node JS 2026: Express, MongoDB, API REST, Socket y más | Code Bless You | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

El curso definitivo de Node JS 2026: Express, MongoDB, API REST, Socket y más

teacher avatar Code Bless You, Make Coding Easy To Learn

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      Introducción

      2:57

    • 2.

      Sección 01: qué es NodeJS

      5:51

    • 3.

      Historia de NodeJS

      2:40

    • 4.

      Cómo funciona NodeJS

      5:48

    • 5.

      Instalación de Node JS en el sistema

      3:17

    • 6.

      Escribir código para el primer nodo

      5:26

    • 7.

      Haz que el código VS sea genial [OPCIONAL]

      1:59

    • 8.

      Sección 02: qué son los módulos

      3:52

    • 9.

      Creación de un módulo propio

      6:47

    • 10.

      Cómo acceder a módulos en otro módulo

      5:10

    • 11.

      Ejercicio para módulo propio

      3:04

    • 12.

      Uso del módulo de trayectorias

      7:13

    • 13.

      Cómo obtener detalles del sistema operativo

      3:08

    • 14.

      Módulo del sistema de archivos

      4:13

    • 15.

      Creación de servidor con el módulo HTTP

      5:18

    • 16.

      Cómo manejar las diferentes rutas

      3:41

    • 17.

      Sección 03: introducción a las NPM

      2:27

    • 18.

      Crear paquete

      4:20

    • 19.

      Instalación del paquete en el proyecto

      4:07

    • 20.

      Desinstalación de paquetes

      1:03

    • 21.

      Instala el paquete como dependencia del desarrollador

      1:46

    • 22.

      Paquetes obsoletos y actualízalos

      5:56

    • 23.

      Elimina los paquetes no utilizados del proyecto.

      1:48

    • 24.

      Sección 04: API vs. API REST

      7:41

    • 25.

      Lista de API de planificación para el proyecto 01

      1:49

    • 26.

      Configura una nueva aplicación

      1:08

    • 27.

      Cómo crear un servidor con Express

      6:39

    • 28.

      Ejercicio para crear Express Server

      2:36

    • 29.

      Creación de API para obtener la lista de todos

      3:34

    • 30.

      Cómo configurar el reinicio automático de nodemon

      1:55

    • 31.

      Variables ambientales

      3:42

    • 32.

      Parámetros de ruta y parámetros de consulta

      5:43

    • 33.

      Obtén un solo todo por ID

      4:47

    • 34.

      API POST para agregar un nuevo todo

      11:06

    • 35.

      Validación de datos de usuarios

      3:20

    • 36.

      Código de paso

      3:10

    • 37.

      res.send y res.json

      3:12

    • 38.

      Actualiza todo simple con solicitud PUT

      5:29

    • 39.

      Ejercicio: eliminar todo específico

      3:48

    • 40.

      Sección 05: introducción al middleware

      4:09

    • 41.

      Creación de middleware personalizado

      3:17

    • 42.

      Construido en Middleware

      4:51

    • 43.

      Cómo compartir archivos estáticos desde el servidor

      4:28

    • 44.

      Middleware útil de terceros

      4:58

    • 45.

      Cómo codificar según el entorno

      4:02

    • 46.

      archivo env y paquete dotenv

      3:47

    • 47.

      Diferentes ajustes para diferentes ENV

      3:43

    • 48.

      Motores de plantillas en la aplicación Node

      5:59

    • 49.

      Cómo limpiar la estructura del código de la aplicación

      5:34

    • 50.

      Sección 06: asíncrona vs. síncrona

      9:45

    • 51.

      Callbacks en Javascript

      6:32

    • 52.

      Resolución de problemas mediante Callback

      7:31

    • 53.

      Infierno de devolución de llamadas

      3:39

    • 54.

      Promesas en Javascript

      5:51

    • 55.

      Reemplazo de devoluciones de llamadas por promesas

      7:51

    • 56.

      Async:await en Javascript

      6:51

    • 57.

      Sección 07: conceptos básicos de MongoDB

      1:16

    • 58.

      Introducción a la base de datos

      4:34

    • 59.

      Instala MongoDB en Windows

      4:19

    • 60.

      Conecta MongoDB con la aplicación Node

      5:41

    • 61.

      Importancia del esquema

      3:15

    • 62.

      Definición de esquema para documento

      4:05

    • 63.

      Creación de modelos

      3:48

    • 64.

      Guardar un nuevo dato

      4:46

    • 65.

      Consulta los datos

      7:48

    • 66.

      Operadores de comparación en MongoDB

      6:17

    • 67.

      Operadores lógicos en MongoDB

      6:56

    • 68.

      Expresión regular en MongoDB

      5:23

    • 69.

      Contar y estimar el número de documentos

      2:46

    • 70.

      Paginación y consulta infinita

      6:37

    • 71.

      Actualiza los datos

      9:20

    • 72.

      Actualiza operadores en MongoDB

      1:42

    • 73.

      Eliminar los datos

      3:01

    • 74.

      Ejercicio 01: configuración de MongoDB

      7:16

    • 75.

      Ejercicio 02: para almacenar datos

      5:59

    • 76.

      Ejercicio 03: cómo buscar datos

      5:52

    • 77.

      Ejercicio 04: actualización y eliminación de tareas

      8:21

    • 78.

      Sección 08: validadores incorporados

      6:42

    • 79.

      Validadores personalizados

      4:28

    • 80.

      Validadores asíncronos

      1:59

    • 81.

      Opciones útiles de SchemaTypes

      0:55

    • 82.

      Relación entre modelos

      5:05

    • 83.

      Enfoque híbrido de la relación

      2:23

    • 84.

      Aplicación del enfoque de referencia

      4:41

    • 85.

      Cómo extraer datos de una referencia [Poblar]

      2:47

    • 86.

      Aplicar el enfoque de incrustación

      4:25

    • 87.

      Aplicación de un enfoque híbrido

      3:11

    • 88.

      Índices en MongoDB

      10:54

    • 89.

      Cómo funcionan los índices en MongoDB

      9:47

    • 90.

      Sección 09: proyecto 02 y planificación

      1:51

    • 91.

      Creación de un nuevo servidor

      2:39

    • 92.

      Conexión a la base de datos

      2:15

    • 93.

      Ejercicio: creación de modelo de usuario

      4:10

    • 94.

      Creación del nuevo usuario

      12:26

    • 95.

      Hashing de la contraseña para seguridad

      5:16

    • 96.

      Validación de entrada de usuarios con Joi

      8:45

    • 97.

      Cómo funciona la autenticación

      3:30

    • 98.

      Generar el token de JWT para el usuario

      5:45

    • 99.

      Cómo establecer la expiración del token

      2:19

    • 100.

      Protege la clave de seguridad en el entorno

      2:13

    • 101.

      Ejercicio Crear ruta de inicio de sesión

      8:11

    • 102.

      ¿Cómo autenticar el usuario? ¿Has iniciado sesión o no?

      12:56

    • 103.

      OAuth en detalles

      5:44

    • 104.

      OAuth en una aplicación de nodos: inicia sesión con Google

      15:03

    • 105.

      OAuth con JWT

      16:36

    • 106.

      Inicia sesión en Facebook con OAuth

      10:37

    • 107.

      Simplifica el código

      3:00

    • 108.

      Problema con un solo token [ACTUALIZACIÓN]

      2:16

    • 109.

      Acceso a token y actualización de la lógica del token [ACTUALIZACIÓN]

      7:17

    • 110.

      Implementar token de acceso y actualizar token [ACTUALIZACIÓN]

      9:24

    • 111.

      Actualizar ruta para el nuevo token de acceso [ACTUALIZACIÓN]

      10:37

    • 112.

      OAuth con dos tokens [ACTUALIZACIÓN]

      2:21

    • 113.

      Ruta para cerrar la sesión de usuarios [ACTUALIZACIÓN]

      3:55

    • 114.

      Sección 10: creación del modelo de categoría

      3:58

    • 115.

      Crea una nueva API de categoría con la función de carga de imágenes.

      11:27

    • 116.

      Establece nombre de archivo y filtro en multer

      11:55

    • 117.

      Cómo obtener todas las categorías API

      1:39

    • 118.

      Cómo compartir imágenes estáticas desde el servidor

      2:06

    • 119.

      Ejercicio: definición de modelo de productos

      6:56

    • 120.

      Autorización basada en roles

      8:59

    • 121.

      Autorización personalizada basada en roles

      5:40

    • 122.

      Cómo manejar varias imágenes de productos

      3:30

    • 123.

      Crea nuevos productos

      7:16

    • 124.

      Cómo obtener todos los datos de productos

      11:37

    • 125.

      Paginación o consulta infinita

      5:58

    • 126.

      Envío de productos por categoría

      3:17

    • 127.

      Envía producto por búsqueda

      2:25

    • 128.

      Ejercicio: obtener datos de un producto único

      5:50

    • 129.

      Ejercicio: eliminar el producto

      10:52

    • 130.

      Buscar productos por título [OPCIONAL]

      4:05

    • 131.

      Sección 11: ¿por qué manejamos los errores?

      2:44

    • 132.

      Manejo de las promesas rechazadas

      3:25

    • 133.

      Crear Error Middleware

      3:26

    • 134.

      Eliminar los bloqueos de prueba

      1:44

    • 135.

      Errores de registro en el archivo

      11:46

    • 136.

      Registro de errores en mongoDB

      2:24

    • 137.

      Excepciones no capturadas

      7:16

    • 138.

      Rechazos de promesas no manejadas

      3:23

    • 139.

      Resumen del manejo y registro de errores

      1:50

    • 140.

      Sección 12: creación de modelo de carrito

      6:50

    • 141.

      Definición de lista de API para el carrito

      1:22

    • 142.

      Cómo agregar productos al carrito

      20:38

    • 143.

      Cómo llegar al carrito del usuario

      2:23

    • 144.

      Aumenta la cantidad de productos

      9:22

    • 145.

      Disminuye la cantidad de productos

      3:58

    • 146.

      Cómo eliminar un solo producto del carrito

      5:34

    • 147.

      Creación de un modelo de pedidos

      4:27

    • 148.

      Flujo de trabajo de pagos

      3:53

    • 149.

      Implementa la pasarela de pago Razorpay

      49:43

    • 150.

      Pago internacional con Paypal

      49:15

    • 151.

      Cómo obtener el historial de pedidos

      2:21

    • 152.

      Actualización del estado por administrador

      5:17

    • 153.

      Limpieza del código para el archivo índice

      3:27

    • 154.

      Sección 13: introducción al proyecto 03

      1:05

    • 155.

      Configuración del proyecto 03

      5:14

    • 156.

      Crear modelo de usuario

      4:23

    • 157.

      Registro de un nuevo usuario

      10:35

    • 158.

      Ejercicio: API de inicio de sesión del usuario

      0:28

    • 159.

      Solución: API de inicio de sesión de usuario

      4:53

    • 160.

      Implementar token de acceso y actualizar token [ACTUALIZACIÓN]

      5:16

    • 161.

      Ruta de actualización y cierre de sesión [ACTUALIZACIÓN]

      9:00

    • 162.

      Detalles de usuario registrados actuales

      7:27

    • 163.

      Restablecer la contraseña del usuario

      13:11

    • 164.

      Formas de enviar correos electrónicos en Node JS

      2:17

    • 165.

      Cómo configurar Amazon SES para enviar correos electrónicos

      21:09

    • 166.

      Envío de correos electrónicos GRATIS

      10:13

    • 167.

      - Lógica de seguidores y seguimiento

      2:18

    • 168.

      Sigue al usuario

      9:08

    • 169.

      Acepta la solicitud de seguimiento

      7:45

    • 170.

      Ejercicio: consigue la lista de seguidores y sigue tus seguidores

      6:24

    • 171.

      Ejercicio: deja de seguir al usuario

      3:34

    • 172.

      Sección 14: introducción

      0:26

    • 173.

      Crear modelo de publicación

      3:43

    • 174.

      Crea una publicación nueva

      15:43

    • 175.

      Cómo obtener publicaciones de usuarios actuales

      4:16

    • 176.

      Informaciones en casa

      9:31

    • 177.

      Eliminar la publicación

      6:51

    • 178.

      Al igual que al comentario en la publicación

      4:56

    • 179.

      Implementar la función de comentarios

      6:15

    • 180.

      Agregar una respuesta a los comentarios

      5:21

    • 181.

      Ejercicio: eliminar un comentario específico

      4:37

    • 182.

      Gestión de errores

      3:06

    • 183.

      Sección 15: Introducción

      1:10

    • 184.

      Creación de chat: modelo de mensaje

      6:23

    • 185.

      Cómo conseguir chats para el usuario

      6:32

    • 186.

      Cómo recibir mensajes de chat específicos

      3:44

    • 187.

      API para enviar mensajes

      10:02

    • 188.

      Qué son los sockets web

      5:16

    • 189.

      Conexión del zócalo

      8:20

    • 190.

      Emisión y métodos de conexión

      8:07

    • 191.

      Recibe mensajes para ambos usuarios

      2:02

    • 192.

      Lógica de la unión en una sala de chat

      3:00

    • 193.

      Implementación de la conexión a una sala de chat

      4:35

    • 194.

      Ejercicio: indicador de tipeo

      8:48

    • 195.

      Cómo aplicar un código de mensaje de envío real

      5:33

    • 196.

      Autenticar al usuario en Socket

      10:52

    • 197.

      Marcar a los usuarios como en línea y sin conexión

      3:44

    • 198.

      Zócalos múltiples para un usuario único

      5:50

    • 199.

      Actualizar los mensajes entregados

      17:15

    • 200.

      Actualizar el estado del mensaje para que se vea

      8:53

    • 201.

      Incorporación de campos de grupo en el esquema

      2:42

    • 202.

      Crea una nueva API de grupo

      3:41

    • 203.

      Cómo agregar lógica de chat de grupo en los eventos de socket

      14:22

    • 204.

      Sección 16: Opciones de despliegue

      2:32

    • 205.

      Simplifica el código

      8:18

    • 206.

      Preparación de la aplicación de nodos para la producción

      2:58

    • 207.

      Descripción del proceso de implementación

      0:39

    • 208.

      Cómo subir una aplicación de nodo en Github

      5:52

    • 209.

      Implementación de una aplicación de nodo en el procesamiento

      3:37

    • 210.

      Cómo agregar MongoDB Cloud

      6:51

    • 211.

      ¿Qué es la arquitectura MVC? [EXTRA]

      7:00

    • 212.

      Aplica arquitectura MVC [EXTRA]

      20:56

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

69

Estudiantes

--

Proyectos

Acerca de esta clase

Te damos la bienvenida a la clase magistral definitiva de Node.js 2025: un viaje completo de 20 horas por el desarrollo de backend moderno. En esta clase, irás más allá de la teoría y realmente construirás proyectos del mundo real con Node.js, Express, MongoDB, Socket.IO y más.

Tanto si quieres convertirte en desarrollador full-stack, conseguir tu primer rol de backend o simplemente entender cómo funciona Node.js de forma secreta, esta clase te ofrece todo lo que necesitas en un solo lugar.

Lo que aprenderás:

  • Comprende los conceptos centrales de Node.js, incluidos los módulos y las bibliotecas incorporadas.

  • ¿Qué es Node JS? Cómo funciona el nodo debajo del capó
  • Construye y estructura API RESTful con Express.

  • Trabaja con MongoDB y Mongoose para almacenar, consultar y administrar datos.

  • Implementa la autenticación de usuarios con tokens JWT.

  • Cómo agregar el inicio de sesión OAuth con Google y Facebook.

  • Crea flujos de restablecimiento de contraseña con Amazon SES y SMTP.

  • Cómo integrar pasarelas de pago como PayPal y Razorpay.

  • Crea funciones en tiempo real (chat 1 a 1 y chat de grupo) con Socket.IO.

  • Despliega aplicaciones Node.js

  • Much more

Por qué deberías participar en esta clase:

El desarrollo de backend es el núcleo de todas las aplicaciones web y móviles modernas. Al dominar Node.js, podrás hacer lo siguiente:

  • Crear API escalables y listas para la producción que impulsen aplicaciones reales.

  • Agrega características del mundo real, como autenticación, pagos y chat, a tus proyectos.

  • Aplica tus habilidades a roles de freelance, proyectos de startup o desarrollador profesional.

  • Mantente actualizado con los estándares de la industria del desarrollo de backend del 2025.

Diseñé esta clase para llevarte de principiante a desarrollador de backend seguro paso a paso, centrándome en el aprendizaje práctico y en casos de uso en el mundo real.

Para quién es esta clase

Esta clase es para:

  • Principiantes que quieren iniciar el desarrollo de backend con Node.js.

  • Desarrolladores de front-end que quieren convertirse en ingenieros full-stack.

  • Estudiantes, emprendedores y aspirantes a desarrolladores que quieran desarrollar aplicaciones completas para el mundo real.

No se requieren conocimientos previos de backend, pero ya deberías estar familiarizado con JavaScript básico (variables, funciones, matrices y objetos).

Materiales/recursos

Para tomar esta clase, necesitarás: 

También tendrás acceso a código de inicio, plantillas de proyectos y archivos de ejemplo para ayudarte a seguir.

 

Conoce a tu profesor(a)

Teacher Profile Image

Code Bless You

Make Coding Easy To Learn

Profesor(a)

Hi! I'm a passionate software engineer from Code Bless You and I love to teach about coding and general skills in less time. I've taught many people how to become professional software engineers.

My goal is to make coding fun for everyone. That's why my courses are simple, animated, and with practical implementation.

Learn by doing

Step-by-step tutorials and project-based learning.

Get support

One-on-one support from experts that truly want to help you.

don’t stress. have fun.

I can't wait to see you in class!

- Code Bless You

Ver perfil completo

Level: Beginner

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. Introducción al curso: Bienvenido al curso definitivo de NOJs. En este curso, aprenderás todo sobre nodejs desde básico hasta avanzado en lenguaje sencillo y fácil de entender Al final de este curso, comenzarás a construir aplicaciones pend rápidas, escalables y seguras sin confundirte Déjame contarte algunas de las principales características cubiertas en este curso. Entonces aprenderás conexión de base de datos. Paginación e infinance scrolling, autenticación de usuarios, así como iniciar sesión con Google e iniciar sesión con funciones de Facebook, enviar correos electrónicos desde nuestro backend, subir múltiples imágenes, manejar y registrar errores, aplicar integración de pago completa usando papel, y también funciones de chat en tiempo real usando y también funciones de chat en tiempo real socket enviando mensajes uno a uno autenticación de usuarios, así como iniciar sesión con Google e iniciar sesión con funciones de Facebook, enviar correos electrónicos desde nuestro backend, subir múltiples imágenes, manejar y registrar errores, aplicar integración de pago completa usando papel, y también funciones de chat en tiempo real usando socket enviando mensajes uno a uno, mostrando mecanografía indicadores, manejo del estado del mensaje, se envía entregado o visto, y también funciones de chat grupal. Ahora para aprender estos conceptos avanzados, necesitamos una base fuerte. Entonces primero, comenzaremos con el aprendizaje básicos de nodejs como conceptos centrales de nodo, módulos integrados, Express, que es el framework de nod Js más popular y más utilizado, algunos conceptos represores de JavaScript como devoluciones de llamada, algunos conceptos represores de JavaScript como promesas, Además, veremos Mongo DB y mangos, y si entiendes conceptos básicos claramente, entonces puedes implementar cualquier tema avanzado de node jazz muy fácilmente También, quiero aclarar una cosa. En este curso, no vamos a crear front end porque no es el alcance de este curso, pero probaremos algunas características con front end para que obtengas una comprensión clara del flujo de trabajo completo de estas características. Te voy a dar código de front-end listo para probar, así que solo tienes que ejecutar ese archivo y puedes probar algunas características. Es muy divertido. Entonces, si sabes un poco de node jazz, o estás confundido en conceptos, si no sabes nada de no Jazz, entonces este curso es para ti. Durante este curso, construiremos tres aplicaciones back-end. En primer lugar, hacer aplicación para el aprendizaje de conceptos básicos, y luego dos grandes proyectos de aplicación de comercio electrónico y aplicaciones de redes sociales back-end, para el aprendizaje de conceptos avanzados de Jazz de nodo. Ahora podrías preguntar ¿quién soy yo? Soy ingeniero de software y además enseño programación en lenguaje fácil de explicar usando mi canal de YouTube, Dios los bendiga, y con mis cursos en línea. En general, en este curso, obtendrás más de 200 lecciones en video SD, implementación en el mundo real, montón de ejercicio, para que no aprendas Js con implementación práctica, algunos consejos y trucos, y mucho más. Después de completar este curso, escribirás código No JS con confianza y usando las mejores técnicas, así que inscríbete rápidamente y conviértete en no Js o to No Jazz hero. CU en este curso. 2. Sección 01: qué es NodeJS: NodeJS es el más popular para los desarrolladores, pero no es un lenguaje de programación o no es un framework Entonces, ¿qué es realmente asentir Js? A ver eso. Nojs es simplemente un entorno de tiempo de ejecución para ejecutar código JavaScript fuera del navegador. ¿ Qué quiero decir con eso? Entonces, como sabemos, usamos código JavaScript para cambiar los datos en la página web o implementar alguna lógica, pero no podemos ejecutar Ja Script fuera del navegador. Tenemos que vincular nuestro archivo JavaScript con nuestro archivo SDML, y luego podemos ejecutarlo en nuestro navegador Pero con nodejs, podemos ejecutar código JavaScript fuera del navegador Nodejs proporciona un entorno de tiempo de ejecución para ejecutar código JavaScript. Los desarrolladores utilizan principalmente Nojz para construir servicios backend llamados API o podemos dice interfaz de programación de aplicaciones Ahora podrías preguntar ¿qué es una API? Básicamente, es una forma para dos programas se comuniquen entre sí. Yo te explico eso con el ejemplo. Entonces aquí hay un restaurante. Estamos sentados en la mesa n, y queremos pedir algo de comida. En este caso, ¿qué haremos? No podemos ir directamente a la cocina y ordenar nuestra comida al chef. En lugar de eso, llamaremos a un mesero. Mesero, tomará nuestro pedido y luego se lo dará a la cocina Después de eso, la cocina comienza a hacer proceso de nuestro pedido y darle comida al mesero, y luego Mesero entregará la comida a nuestra mesa Entonces aquí, el agua es como un mensajero que toma nuestra solicitud y pasa esa solicitud a nuestro destino. Y luego Mesero recibirá mensaje de respuesta de ese destino y nos lo traerá de vuelta Entonces en el mundo real, esta tabla n en la que estamos sentados es nuestra aplicación cliente o front-end. Queremos obtener algunos datos sobre los alimentos que están disponibles en el back-end. Llamaremos a Mesero, que es una API y le enviaremos solicitudes Ahora, API transferirá esa solicitud al servidor o base de datos, que es nuestra cocina, y ese servidor o base de datos compartirá la respuesta, que son los datos que queremos. Y API entregar los datos de respuesta a nuestro cliente. Ahora entiendes lo que es una API. API es una forma para dos programas se comuniquen entre sí. Con NodeJS, podemos construir API del mundo real. Además, podemos construir aplicaciones súper rápidas en tiempo real con el nodo JS Estos servicios dan potencia a nuestras aplicaciones cliente como aplicaciones web y aplicaciones móviles muy útiles. ¿Sabes, Netflix, Paper, Uber, Lin DIN, y muchas compañías más famosas usan No Jazz? Sí, porque Noe Jaz hace que sus servicios sean súper rápidos y eficientes Además, P hizo una gran investigación sobre Noe Jaz. Eso te lo diré en tan solo un minuto. Entonces, para resumir, Node Jazz es un entorno de tiempo de ejecución, y es la opción ideal para construir aplicaciones relacionadas con datos altamente escalables y en tiempo real Ahora podrías preguntar, hay muchos frameworks y lenguajes como Java y asp.net, que también pueden construir servicios wegen ¿Qué tiene de especial Node Jazz? ¿Por qué deberíamos aprender node jazz? ¿Por qué es tan popular? En primer lugar, sin jazz, podemos construir servicios backend súper rápidos y altamente escalables con bajo costo Además, la gente hizo un gran experimento sin jazz. En ese experimento, la gente crea su aplicación back-end sin usar jazz y además construye la misma aplicación con Java plus spring. Y ¿conoces el resultado de ese experimento? Es realmente impactante. Encontraron una aplicación de nodo construida dos veces más rápida que la aplicación Java más primavera y con menos personas. En Java plus spring, tienen cinco desarrolladores, luego en node, solo necesitan dos desarrolladores, y aún así esos dos desarrolladores construyen aplicaciones más rápido en nodejs Además, la aplicación de nodo toma 40% menos archivos. También, en Java, tienen 5 mil líneas de código, pero en nodejs, solo tienen 1,500 líneas de código, que es tres x menos Por lo que la aplicación de nodo es súper más rápida, un 35% más rápido de tiempo de respuesta que la aplicación Java, y la aplicación de nodo puede servir casi dos X solicitudes por segundo que la aplicación Java. Este resultado conmociona a todos y la gente inmediatamente migró muchos servicios de Java al nodo Jz Es realmente genial, ¿verdad? Segundo, con node jazz, obtenemos una base de código más limpia y consistente porque con menos código, podemos hacer muchas cosas complejas. Además, es ideal para la creación de prototipos, lo que significa que node Jazz es rápido y fácil usar al construir la primera versión de una aplicación La primera versión se llama como prototipo. También, como sabemos, en node jazz, usaremos JavaScript. Entonces, si eres amigo desarrollador final, puedes aprender fácilmente node Jazz sin aprender un nuevo lenguaje de programación. Y si aprendes tanto frontend como backend, entonces puedes cambiar tu rol laboral como desarrollador full stack y mejorar tu carrera y obtener más salario Y un beneficio más de Nojs es que Nojz tiene un gran ecosistema de bibliotecas de código abierto, lo que significa que hay código predefinido para hacer cosas particulares Para que podamos usar el código de otra persona e implementar sus características en nuestra aplicación. Entonces, en general, aprender nodejs en 2025 o en el futuro definitivamente te beneficiará a ti y a tu carrera de programación 3. Historia de NodeJS: En la lección anterior, vemos que No Jazz es un entorno de tiempo de ejecución para ejecutar código JavaScript fuera del navegador. Pero veamos cómo inventó Noe Jazz con una historia interesante Antes de 2009, JavaScript era como un superhéroe atrapado dentro de un navegador como Chrome, Firefox y muchos más navegadores En todos estos navegadores, hay motor JavaScript. Cuando ejecutamos nuestro código JavaScript dentro del navegador, navegador pasa ese código al motor JavaScript. El motor JavaScript procesa ese código y lo convierte en código de máquina, que nuestro equipo puede entender. Por ejemplo, Microsoft Taj usa Chakra Engine, Firefox, usa el motor Spider Monkey, y Google Chrome, usa Fiat Engine, que es el motor JavaScript más potente entre todos los navegadores Debido a estos diferentes motores JavaScript, a veces el código JavaScript funciona manera diferente en diferentes navegadores. Cuando usamos JavaScript solo dentro de los navegadores, entonces hay muchas limitaciones. No podemos construir servidores ni realizar tareas de Bend como manejar bases de datos, autenticación de usuarios o API. Ahora, en su momento desarrollador, Yandll entra en escena Él piensa, y si tomamos el motor Vat y dejamos que JavaScript se ejecute en servidores en lugar de solo navegadores. Toma el motor Vet, que es el motor Js más rápido y registra ese motor en código CPlusPlus Puede ejecutar código Jascip en nuestra máquina y llamar a ese software nodejs y eso es SOO nodejs inventado. Nod Js es un entorno de tiempo de ejecución para ejecutar código JavaScript porque tiene el motor V JA Script Este entorno es poco diferente al que tenemos en nuestro navegador. Al igual que en el script del navegador Ja, tenemos objeto de documento para tratar con documento SDML También tenemos objeto Window. Estos objetos no nos metemos en node Jazz y además no queremos acceder a los objetos document y Window porque en node jazz, estamos creando servicios back-end, y los objetos document y Window son para tareas front-end. Entonces, ¿por qué necesitamos documento y ventana en el back-end? Con el nodo js, podemos hacer muchas más cosas como podemos acceder al sistema de archivos para leer y escribir archivos. Podemos conectarnos con la base de datos y almacenar datos en la base de datos, y también podemos construir APIs rápidas y muchas más cosas. Ahora, una pregunta que podrías hacer cómo es súper rápido nodejs, cómo funciona ningún Jz, y eso lo veremos en la 4. Cómo funciona NodeJS: Así que hemos visto que nodejs se utiliza para aplicaciones backend súper rápidas y altamente escalables Pero cómo asentir Js es súper rápido. Entonces la razón por la que ningún Js es súper rápido es por su no bloqueo o podemos decir naturaleza asincrónica del nodo js su no bloqueo o podemos decir naturaleza asincrónica del nodo Ahora podría preguntarse ¿qué es asíncrono? Déjame explicarte con un ejemplo sencillo. Imagina que aquí hay un restaurante. Tenemos una cocina aquí y tenemos múltiples mesas. Ahora el primer cliente quiere dar orden. Entonces aquí, nuestro mesero, ve a la mesa uno, consigue orden Digamos una pizza. Y entonces nuestro mesero le da esa orden al chef en la cocina Ahora mientras sef elabora pizza, nuestro mesero mirará otras mesas Digamos que la Mesa dos quiere dar otro pedido, entonces mesero toma ese pedido y también lo da en la cocina Nuestro mesero individual puede manejar muchas mesas. No necesita esperar a que el chef complete un pedido, y luego puede servir otro pedido. No hace falta que haga eso. Esto se llama de manera no bloqueante o asíncrona, y así es como funciona la aplicación de nodo Este único weiter está funcionando como un solo hilo del nodo JS, cuya tarea es manejar la solicitud Por lo que este solo hilo puede usar para manejar múltiples solicitudes sin bloqueo. Ahora al otro lado de esta forma asíncrona, también tenemos forma síncrona o de bloqueo Entendamos eso también con el mismo ejemplo. Entonces aquí, el cliente Vn quiere dar orden. Nuestro mesero toma el pedido de la mesa uno y se lo da a la cocina y nuestro auto comienza a prepararse para ese pedido como pizza Ahora, como sabemos, la pizza puede tardar tiempo en prepararse. En ese momento, en lugar de manejar otras mesas, nuestro mesero espera ahí en la cocina para completar ese pedido Supongamos que tarda 10 minutos, así nuestro mesero esperará ahí 10 minutos en la cocina Después de eso, entrega esa pizza a la mesa uno. Ahora, en ese momento, los clientes de otras mesas tienen que sentarse porque nuestro mesero está bloqueado por 10 minutos A esto se le llama como forma de bloqueo o sincrónica. La mayoría de los marcos de back-end más antiguos como w.net o Rails funcionan de manera sincrónica o de bloqueo Entonces, cuando alguien envía solicitudes en el servidor, servidor asigna un hilo para manejar esa solicitud. Nuestro ejemplo, es weiter. Ahora imagina que tenemos solicitud para obtener la lista de usuarios. Esta tarea necesita una operación de base de datos que puede llevar tiempo. Ahora bien, si en ese momento obtenemos otra solicitud, entonces para manejar esa nueva solicitud, necesitamos darles también un nuevo hilo o weiter Ahora imagina en nuestro servidor, hay mil solicitudes. ¿Deberíamos crear hilo para todas esas solicitudes? En caso afirmativo, entonces tenemos que aumentar el número de hardwares de servidor, lo cual es realmente costoso y lento Es por eso que las aplicaciones que están construidas en asp.net o rieles necesitan más cantidad de servidores y más mantenimiento Ahora, en ese momento, el nodo viene en la imagen, y como hemos visto, nodo usa forma asincrónica o no bloqueante Por supuesto, podemos hacer que la aplicación asp.net o Rails funcione como aplicación sin bloqueo o asíncrona Pero para eso, necesitamos hacer un trabajo extra. otro lado, las aplicaciones de nodo son trabajos por defecto de manera asincrónica o no bloqueante Por lo que es realmente rápido y fácil de administrar. Cuando obtenemos múltiples solicitudes en el servidor del nodo, el nodo tiene un solo hilo. Ese solo hilo puede manejar una solicitud. Ahora, si esa tarea lleva tiempo, busca algo de la base de datos, entonces nuestro hilo único agrega esa tarea en la lista llamada evento Q y pasa a otra solicitud y comienza a manejar esa solicitud. Este evento Que notificará al nodo cuando obtengan datos de la base de datos, y luego nuestro nodo enviará esos datos a la solicitud. Entonces, de esta manera, nuestro único hilo puede servir a múltiples usuarios, y es por eso que nodejs es una gran opción para aplicaciones de uso intensivo de datos o relacionadas con la red Puede servir a más clientes sin agregar más servidores, y es por eso que las aplicaciones de nodo también son altamente escalables. Ahora la pregunta es, ¿deberíamos usar node Jazz para todo tipo de aplicaciones? Y la respuesta es no. No debemos usar nodo para aplicaciones intensivas de CPU. Ahora bien, ¿qué es el intensivo CIPI? uso intensivo de CPU significa aplicaciones que tienen tareas relacionadas con la CPU como aplicaciones de edición de video o edición de fotos. En este tipo de aplicaciones, tenemos mucho cálculo que puede usar CPU pocas opciones, que hace el sistema de archivos o red. Y como sabemos, nodo es una aplicación de un solo hilo cuando realiza operaciones relacionadas con el CPI cuando otros clientes tienen que esperar para completar esa tarea Aquí, node perderá su ventaja de ser asíncrono, y por eso no debemos usar node para la aplicación SIPEIntensivo Puede usar el nodo para aplicaciones de entrada y salida, relacionadas con la red o relacionadas con datos en tiempo real. Solo recuerda que no debemos usar nodo para aplicaciones intensivas de CIPI De lo contrario, el nodo se puede utilizar para la mayoría de todo tipo de aplicaciones. Entonces entendemos cómo asentir Jazz es más rápido que otros frameworks back-end No te preocupes por las teorías. A medida que construyes proyectos en el nodo Jaz, entenderás todo muy fácilmente Entonces comencemos a aprender nodo Jaz prácticamente. 5. Instalación de Node JS en el sistema: Veamos cómo instalar NodeJS en nuestro sistema. En primer lugar, comprobaremos si Nojs ya está en nuestro sistema o no Así que abre el símbolo del sistema en Windows, y si estás usando Mac o Linux, luego abre tu terminal y escribe el nodo, versión dash dash, y presiona Enter. Ver aquí me sale este tipo de mensaje de error, nodo no es reconocido como un comando interno o externo. Esto significa que el nodo no está instalado en mi sistema. Si llegas aquí la versión nodejs, lo que significa que el nodo ya está instalado en tu sistema, pero te recomiendo encarecidamente que instales la última versión de tabla del nodo Así que dirígete a browser y opennjs.org. En este sitio web, obtenemos una versión descargada de Nodjs LTS, lo que significa la última versión de tabla que nodo recomienda oficialmente usar En el momento que estoy grabando este curso, versión latestable es 22.14 0.0 Pero en el futuro, podría haber versión actualizada disponible. Así que simplemente haz clic en esta versión, y comenzará la descarga. Una pregunta que podrías hacer, este curso es relevante para las futuras versiones de nodo? Y la respuesta es sí. Este curso seguirá siendo relevante para cualquier versión de JS de nodo porque en este curso, nos vamos a centrar fuertemente en los fundamentos del nodo JS, y puedes usar esos fundamentos en cualquier versión de JS de nodo Así que no tienes que preocuparte por ninguna actualización de JS. Si ocurre alguna actualización importante, entonces actualizaré este curso de acuerdo a eso. Ahora nuestra configuración está lista para instalar. Así que vamos a abrirla. Déjame poner aquí Da clic en siguiente, acepta los términos y condiciones y da click en siguiente. A partir de aquí, cambias la ruta de instalación, pero en mi sugerencia, déjala como está. Nuevamente, da clic en siguiente y siguiente e instálelo. Y ya está hecho. Ahora, vamos a comprobar que Nojs está instalado correctamente o no. Así que vuelva al símbolo del sistema o terminal y escriba la versión de los nodos, y presione Enter. Ver, ahora llego aquí asentir Gs versión 22.14 0.0. Así que instalamos con éxito nodo en nuestro sistema. Otra cosa que necesitamos en este curso es editor de código. El editor de código favorito personal es código de Visual Studio o código VS, que es uno de los mejores editores de código. Por supuesto, puedes usar cualquier otro editor de código, pero no muchos editores tienen ese poder que tiene el código VS. Y también, en este curso, voy a compartir mis consejos y trucos para el código VS. Entonces, si no tienes código VS, entonces puedes ir a code.visualstudio.com, descargar código VS e instalarlo Es realmente simple. Ahora en la siguiente lección, escribiremos nuestro código JS de primer nodo. 6. Escribir código para el primer nodo: Escribamos nuestro código JS de primer nodo. Abra una carpeta en la que desee crear un proyecto. Aquí, abro la carpeta Project, y en esta carpeta, creo una nueva carpeta, digamos, primer proyecto y simplemente abro este proyecto en código VS. Bueno. Este código VS parece un poco más pequeño para este curso. Así que déjame acercarlo. Por lo general, no me acerco tanto, pero con este Zoom, se puede ver lo que estoy haciendo con claridad. Perfecto. Ahora vamos a crear un nuevo archivo aquí. Digamos índice punto js. Puedes usar cualquier nombre. Depende totalmente de ti. Ahora dentro de este archivo, podemos escribir nuestro código JavaScript normal, que estamos acostumbrados a escribir. Así que simplemente vamos a crear una variable llamada saludo igual a buenos días. Y después de eso, simplemente consultamos ese registro. Hola coma y simplemente adhiera la variable de saludo. Guarde este archivo. Ahora podría preguntarse, ¿cómo podemos ejecutar este código sin nuestro navegador? Porque anteriormente, estamos ejecutando JavaScript usando navegador. Entonces, para ejecutar este código sin sillas, necesitamos terminal. Y usa nuestro terminal del sistema y abre nuestra carpeta de proyectos en esa terminal, o podemos usar el terminal de código VS. Siempre uso terminal VSCode porque es fácil de abrir, ir al menú del terminal y seleccionar nueva terminal, o puedes presionar Control más Se abrirá aquí terminal. Ahora para ejecutar este archivo index dot js, simplemente escribimos node, space, y nuestro nombre de archivo, que es index dot js. Tu nombre de archivo es apt Gs, entonces tienes que escribir aquí nodspace app dot js y presionar Enter Ver, aquí tenemos nuestra línea de Consola. Entonces enhorabuena. Escribes tu primer código de nodejs. Ahora para ocultar esta terminal, podemos volver a presionar Control más Bectig Ahora aquí también podemos agregar función y llamar a esa función, igual que estamos haciendo en JavaScript regular. Así que después de la consola punto log en la nueva línea, podemos crear una función print message. Y en los corchetes de Cully, simplemente consolamos el registro de puntos. Que tengas un buen día. Y después de esta función, simplemente llamamos a esta función print message, para que podamos obtener este mensaje de consola, guardar este archivo, y para volver a ejecutar este archivo, ¿qué escribimos en el terminal? Escribir, escribimos espacio de nodo índice punto js. Mira aquí conseguimos esto tanto Consola Loui. Así que podemos usar aquí establecer la función de tiempo de espera, establecer la función de intervalo, etcétera. Podemos agregar casi todo el código JavaScript en la aplicación de nodo. Ahora podrías preguntar qué tipo de código JavaScript no podemos agregar aquí en el proyecto JS del nodo. Así que en el proyecto NodeJS, podemos agregar todo tipo de código JavaScript, excepto escribir código de manipulación de doom como punto de documento Obtener elemento o ubicación de punto de ventana, etcétera, porque como sabemos, cualquier código que escribamos en la aplicación de nodo, se ejecutará en servidor y en servidor, ejecutará en servidor y en servidor, ¿cómo podemos acceder a los objetos document Déjame mostrarte prácticamente lo que sucederá si usamos documento en este archivo JS de punto índice. Comento todo este código usando Control plus slash o Command plus slash y simplemente aquí mismo, consola dot log Imprimir aquí objeto de documento. Guarda este archivo, y en el terminal, volvemos a ejecutar node index dot js, o simplemente podemos presionar un perro. Traerá mando previo para nosotros. Ver, aquí obtenemos error que dice documento no está definido, y es A mostrándonos la línea. Entonces no podemos usar aquí el código de manipulación de fatalidad. Otra cosa es que tampoco podemos usar aquí eventos específicos del navegador como Alert. Entonces en el lugar de esta consola agregamos Alert, saluda. Guarde este archivo y volvamos a ejecutar este archivo. Ver aquí obtenemos La alerta no está definida porque de nuevo, estos son eventos relacionados con el navegador. El servidor no puede mostrar Alert en el navegador. Es el front-end quien puede mostrar Alert. Así que para resumir en archivo índice Js o cualquier otro archivo en el proyecto de nodo, escribimos código JavaScript para servidor podemos usar varios módulos, manejar SDDPRquest, acceder a los archivos de nuestro sistema, conectarnos a la base de datos, construir aplicaciones en tiempo real, y muchas cosas más que aprenderemos paso a paso en No te preocupes, dominarás nodo después de este curso. Solo tienes que codificar junto conmigo e intentar escribir código después de entenderlo correctamente. No solo copiar y pegar. Hay que entender por qué escribimos ese código específico y luego lo implementamos. Es realmente simple. 7. Haz que el código de VS sea genial [OPCIONAL]: En la lección anterior, si te preguntas cómo se vuelve a formatear mi código cuando guardo el archivo Para eso, estoy usando una de las mejores y más populares extensiones de código VS llamada pretty. Instale esta extensión. Ahora tenemos que hacer poco ajustes para instalación de Pretty E. Así que en la sección de instalación, desplácese hacia abajo hasta la sección de formateador por defecto Y aquí, copia estas dos líneas de código sin corchetes Cully. Ahora, abre la configuración desde el icono de engranaje inferior, ve a ajustes, y en la esquina superior derecha, desde aquí, abre ajustes, toques y archivo, y en la última línea, agrega coma y luego en la nueva línea, más allá de esas líneas Ver este archivo. Ahora vuelve a la configuración y el formato de búsqueda al guardar y asegúrate de que esté verificado y hecho. Además, muchos alumnos me preguntan qué tema y fuentes utilizo para mi código VS. Entonces actualmente, estoy usando mi tema favorito, que es Au Mirage Warder Puedes descargarla desde el panel de extensión. Este tema no es muy brillante ni muy oscuro, así que es bueno para nuestros ojos y se ve bien. El nombre de la fuente que estoy usando es Monisa. Cual es la fuente paga, puedes descargar esta fuente de la manera que quieras No puedo decir nada más. Instálelas en tu sistema. Y luego desde la configuración del código VS, busca aquí familia de fuentes y agrega tu nombre de fuente desde el principio, y eso es todo. Puedes usar cualquier tema y fuentes que te gusten. Depende totalmente de ti. Y si tienes un gran combo, entonces puedes agregar tus capturas de pantalla de código VS en la sección de preguntas y respuestas Me encanta ver eso, y eso es todo. Estamos listos para irnos. Así que vamos a sumergirnos en este nodo código JS. 8. Sección 02: qué son los módulos: Bienvenido a la segunda sección del curso Ultimate Node JS. En esta sección, aprenderemos todo lo que necesitamos saber sobre los módulos como ¿qué son los módulos? ¿Cómo podemos crear nuestros propios módulos? Además, tenemos algunos módulos integrados como path, sistema operativo, file system, módulo DTP para crear servidor, y mucho más Empecemos con lo que son los módulos. Pero antes de eso, déjame darte una situación. En la sección anterior, creamos este archivo JS de punto índice. Ahora imagina que este es el proyecto Comenzó de Netflix, que es el proyecto realmente grande. Este proyecto tiene muchas características como conexión a base de datos, autenticación de usuarios, pasarela de pago, también muchas otras API. Ahora imagina que agregamos este código de todas las características en un archivo G de punto de índice único. ¿Cómo lograrás esto? O si alguien te dijo que agregaras otra característica en un mismo proyecto, entonces imagina lo confuso y difícil que será. ¿Cuál es la solución aquí? Piénsalo. Aquí, podemos crear por separado estas características en diferentes archivos y luego simplemente ingresarlas en el archivo de índice principal NodeJS Estos diferentes archivos pequeños se denominan como módulos en el nodo JS. Si tuviera problema en la conexión a la base de datos, puedo ir al módulo de conexión a la base de datos y resolver o mejorar ese código de forma independiente. En resumen, el módulo es una pieza de código que realiza una tarea específica. Ejemplo, imagina que estás construyendo un auto. Un auto tiene muchas partes como motor, llantas, hojas, etcétera Cada pieza se construye por separado, y también puede ser reemplazada o reparada sin afectar a todo el automóvil. Ahora en el nodo JS, los módulos funcionan de manera similar. Cada módulo representa una parte diferente de nuestra aplicación, y estos módulos pueden trabajar juntos para formar una solicitud completa. Y es por eso que los módulos son parte muy importante del nodo JS. Ahora podemos dividir los módulos en tres tipos. El primero son los módulos locales. Estos son los módulos que crearemos para nuestra propia aplicación como módulo DB para conexión a base de datos, módulo de pago para manejo de pagos, etc. El segundo son los módulos centrales. Estos son los módulos incorporados que obtenemos con el nodo JS. Ya están disponibles en todas las aplicaciones de nodo. Por ejemplo, FS para file system, STTP para crear servidor STTP o hacer STTPRquest SO para la funcionalidad relacionada con el sistema operativo , y muchos más. No te preocupes, te explicaré nuestros módulos centrales en las próximas lecciones de esta sección. Ahora el tercero son los módulos de terceros. Estos son los módulos que son creados y publicados por otros desarrolladores. Si queremos usarlos, entonces tenemos que instalar manualmente esos módulos en nuestro proyecto. Por ejemplo, express dot js es un módulo de terceros, lo que nos ayuda a construir API rápidamente. Otro módulo es Mangosta para Mongo Div etcétera. Se trata de módulos de terceros construidos por otra persona, y también podemos utilizarlos en nuestro proyecto. No te preocupes por todas estas cosas, iremos paso a paso y aprenderemos cada una de ellas. Entonces, para resumir rápidamente, módulo es un trozo de código que realiza una tarea específica Podemos almacenarlos en archivos separados, y luego podemos usarlos en cualquier otro archivo. Ahora en la siguiente lección, crearemos nuestro propio módulo. 9. Crear tu propio módulo: Construyamos nuestro propio módulo personalizado. Así que aquí en nuestra aplicación, creamos un nuevo archivo llamado math operations dot js. En este módulo, agregaremos alguna operación matemática básica y luego reutilizaremos en nuestro archivo principal index dot js. Entonces, antes que nada, vamos a crear una nueva función llamada AD y pasar aquí dos parámetros llamados A y B. Y dentro de esta función, simplemente escribimos adición de estos dos parámetros, A más B. Podrías preguntar, ¿cómo podemos usar esta función dentro de nuestro archivo index dot js? Porque todos sabemos cuando definimos la función dentro de un archivo, solo podemos usarla en ese archivo, no fuera del archivo. Entonces, para usar esta función ad en otro archivo, tenemos que exportar esta función desde este módulo de operaciones matemáticas, y luego podemos importarla en el archivo index dot js. Pero antes de eso, déjame mostrarte algo. Así que en nodejs todos los archivos tienen un objeto llamado en ese objeto módulo, tenemos muchas propiedades lo que da información sobre ese módulo en particular Déjame mostrarte eso prácticamente. Después de esta función, simplemente escribimos el registro de puntos de la consola e imprimimos aquí el objeto del módulo. Ahora tenemos que ejecutar este módulo de operaciones Mth. Así que abra terminal y escriba nodo, matemáticas, y presione tabulador. Se autocompletará el nombre del archivo. Ver, aquí obtenemos este objeto módulo con un montón de propiedades. El primero es ID, que es el ID único para el módulo. A continuación, tenemos camino, que es el camino completo de nuestro proyecto. Después de eso, tenemos export y se establece en objeto vacío. Adivina correctamente, si queremos exportar add function, entonces tenemos que agregar su función en este objeto de exportación. Después de eso, tenemos el nombre de archivo actual con la ruta completa y un montón de otras propiedades. Ahora bien, ¿cómo podemos agregar función dentro de este objeto de exportación? Es realmente simple. Así que aquí escribimos módulo dot export dot add, que es el nombre de la propiedad es igual a agregar función. Asegúrate de que no llamamos aquí add function. Simplemente agregamos aquí el nombre de la función. Sé que piensas que esto es un poco confuso, pero créeme, no lo es. Déjame mostrarte eso. Así que simplemente mueve este registro de puntos de consola debajo de este módulo exportaciones de puntos. Guarde este archivo, y en la terminal, nuevamente ejecutamos este archivo. Se puede ver en el objeto export, tenemos add property y está configurado para agregar función. Entonces, si confundes por el mismo nombre de propiedad, entonces también podemos cambiar aquí el nombre de la propiedad como agregar números Guarde este archivo y volvamos a ejecutar este archivo. Ver, aquí obtenemos números de anuncio nombre de propiedad para agregar función. Ahora también podemos exportar más de una función desde el módulo. Así que aquí creamos una función más llamada sub pista. Nuevamente, necesitamos aquí dos parámetros, A y B, y dentro de esta función, simplemente devolvemos A menos B. Ahora, ¿me pueden decir cómo exportar esta función? Bien, simplemente escribimos aquí módulo dot export dot resta igual a nuestra función substract Mira si los cambios y échale un vistazo. Volvamos a ejecutar este archivo. Ver, aquí obtenemos esta nueva propiedad substract a nuestra función abstracta Además, no es necesario que solo podamos exportar funciones desde nuestro módulo. También podemos exportar variables u objetos o array, básicamente cualquier cosa que queramos. Supongamos que aquí en la parte superior, creamos una variable llamada name. Igual a digamos código más U y otra variable, número de la suerte es igual a, digamos siete. Ahora bien, si queremos exportar solo la variable name, entonces solo podemos agregar aquí module dot export dot name equals to name. No necesitamos exportar la segunda variable si no la vamos a usar en ningún otro archivo. Sólo exportar variables o funciones que necesitamos usar en algún otro lugar de nuestra aplicación. Ahora aquí hay una cosa. Estas tres líneas de código se ven un poco feas porque estamos repitiendo las exportaciones de punto de módulo. ¿Hay alguna forma de atajo para escribir esto? Sí, déjame mostrarte. Entonces aquí podemos escribir algo como esto. El punto del módulo exporta es igual a, y aquí pasamos objeto y agregamos todas las propiedades que queremos exportar en este único objeto. Entonces escribimos, agregamos, cool, función, agregamos otra propiedad, función de colon de subpila, subpila y podemos establecer name a nombre de variable Este código y estas tres líneas de código funcionan igual porque aquí estamos configurando propiedades una por una. Pero aquí los ponemos directamente en objeto. Eliminemos estas tres líneas. No lo necesitamos. Guarde este archivo. Vamos a borrar terminal usando CLS, y luego ejecutar el mismo archivo y ver aquí obtenemos el mismo objeto de exportación que antes Entonces, si sabemos cuando nuestro nombre de propiedad y el nombre del valor de paso es el mismo, entonces podemos eliminar esta columna y nombre de variable. Entonces este agregar significa agregar columna agregar. Igual que eliminamos esta columna substract y también nombre de columna Entonces hay múltiples formas de escribir el mismo código. Guarda esto y vamos a ejecutarlo una vez más. Ver aquí nuevamente obtenemos el mismo objeto de exportación. Ahora tenemos propiedades en el objeto de exportación y podemos acceder a este objeto de exportación en cualquier otro archivo de este proyecto, y lo veremos en la siguiente lección. 10. Cómo acceder a módulos en otro módulo: En la lección anterior, creamos nuestro módulo de operones matemáticos y exportamos tres propiedades Déjame también quitar esta línea de consola. No lo necesitamos. Ahora veamos cómo podemos acceder a estas propiedades en el archivo JS punto índice o cualquier otro archivo. Eliminemos este código anterior. No lo queremos. Ahora para importar cualquier módulo en nuestro archivo, hemos requerido función en el nodo Js. Llamamos a esta función aquí y dentro de esta función en códigos, entraremos en nuestra ruta de módulo. Entonces como podemos ver estos dos archivos están en la misma carpeta, así podemos escribir aquí dot forward slash, que representan carpeta actual Y aquí escribimos nuestro nombre de archivo, operaciones matemáticas punto js. O también podemos eliminar esta extensión dot js porque si no pasamos extensión con nuestro nombre de módulo, entonces por defecto, nodejs tomará punto js como ¿Y si tenemos este archivo de operaciones matemáticas en la subcarpeta? Entonces tenemos que escribir aquí el nombre de la carpeta primero, y después agregamos el nombre del archivo de barra diagonal Y si tenemos este módulo de operaciones Mth en la carpeta padre, entonces aquí en el lugar de punto único, usaremos punto doble No te preocupes con la práctica, aprenderás esto. Por ahora, solo escribe operaciones matemáticas de barra diagonal. Esta función requerida devuelve objeto de exportaciones de este módulo que obtenemos aquí interminal. Déjame mostrarte. Aquí, almacenamos este valor en una variable llamada operaciones matemáticas. Puedes tomar cualquier otro nombre, pero sobre todo, usamos el mismo nombre que ese módulo. Entonces no necesitamos recordar otro nombre, así que no necesitamos recordar otro nombre. Aquí simplemente consil punto log operaciones matemáticas, guardar los cambios, y ahora podemos ejecutar este índice punto js archivo Nodo índice punto js. Ver, aquí obtenemos el objeto con esas tres propiedades que agregamos en el objeto export en Mth Operations Aquí en el lugar de operaciones matemáticas simples, podemos hacer metoperones punto AD Y aquí pasamos argumentos, digamos 20 y 30. Guarde estos y volvamos a ejecutar este archivo. Ver, aquí obtenemos la suma de dos números. Así que usamos con éxito una función de otro módulo. puede ver lo sencillo que es crear módulo y usarlo en otros archivos. Simplemente tenemos que exportar desde ese módulo, y luego con require, podemos usar esa exportación en cualquier otro archivo. Así podemos usar otras propiedades como metoperones punto Subpila o metoperones punto Pero podemos ver cuando necesitamos usar alguna de estas propiedades, necesitamos escribir este punto de operaciones matemáticas. Así que podemos usar aquí el tema Javascript llamado destructuración de objetos Probablemente sepas de esto porque es puro tema de Javascript. Pero veamos esto rápidamente. Entonces aquí escribimos nuestro objeto y queremos extraer sus propiedades como variables. Entonces en el lugar de los metoperones punto AD, solo tenemos que escribir edD Entonces al principio, escribimos Cs ahora aquí, tenemos que usar llaves iguales a nuestro nombre de objeto, que es operaciones matemáticas. Ahora bien, ¿puedes pensar lo que tenemos que escribir en estas llaves? Tenemos que escribir aquí nombre de propiedades, que queremos extraer de este objeto como variable. Escribimos aquí add, que es nuestra función, substract, que es otra función, name, que es nuestra variable Ahora, en el lugar de este anuncio de punto de operaciones matemáticas, simplemente podemos usar este add y también podemos agregar aquí nombre. Guarda este archivo y vamos a ejecutarlo en nuestra terminal. Ver, aquí sacamos 50 y nuestro nombre. Además, en el lugar de hacer reestructuración de objetos en otra línea, algunos desarrolladores experimentados les gusta a algunos desarrolladores experimentados les gusta hacer en la misma línea requerida. Entonces simplemente obtuvieron este objeto de aquí y simplemente lo pegaron en el lugar de este nombre de operaciones matemáticas. Entonces no necesitamos esta línea extra, guarda este archivo y volvamos a ejecutarlo. Ver, aquí obtenemos el mismo resultado. Si te confundes de esta manera de estructuración objetiva, entonces simplemente puedes usar el método de anuncio de punto de operaciones Mth Está totalmente bien. Al final del día, nuestro código debería funcionar. 11. Ejercicio para el módulo propio: Ahora es el momento de poco ejercicio, para que puedas revisar los módulos. Entonces aquí tienes que crear un nuevo módulo en tu aplicación llamado Logger. Y dentro de esto, hay que exportar dos funciones. Una función devolverá fecha actual con esta expresión, y otra función devolverá año actual con esta expresión. Y luego hay que consolar este resultado en el archivo JS index dot, igual que lo hacemos en el módulo de operaciones matemáticas, y nuestra salida debería verse así, probarlo y luego ver la solución. Entonces espero que completes este ejercicio o al menos intentes resolver este ejercicio. Ahora veamos la solución. En primer lugar, creamos un nuevo archivo llamado logger dot js. Ahora aquí, tenemos que agregar dos funciones. Entonces la primera función es fecha actual, y en el corchete GLY, simplemente devolvemos nueva fecha punto dos cadena de tiempo Ahora vamos a duplicar esta función, seleccionarla y presionar Mayús más alterar más flecha hacia abajo o Mayús más Opción más flecha hacia abajo. Cambiemos el nombre de la función al año actual y en el lugar de dos cadenas de tiempo, escribimos obtener año completo. Ahora, ¿recuerdas cómo exportamos estas funciones? Usamos exportaciones de punto de módulo, y aquí simplemente lo configuramos para objetar y dentro de él, escribimos fecha actual a fecha actual y año actual a año actual función. O podemos simplificarlos quitando el mismo nombre. Genial. Entonces exportamos estas funciones. Ahora solo necesitamos ingresar estas funciones en nuestro archivo JS de punto índice. Entonces en la parte superior, agregamos función requerida y simplemente pasamos aquí nuestra ruta del módulo, que es dot forward slash porque este módulo también está en la misma carpeta y logger Ahora podemos almacenar su valor de exportación en la variable llamada logger. O como hicimos en la lección anterior, podemos desestructurarlo así Así que agregue aquí calibrakets y vea aquí obtenemos propiedades de fecha actual y año Ahora, después de esta consola, agregamos otra consola y simplemente llamamos aquí ambas funciones una por una, fecha actual y año en curso. Guarde los cambios y ejecutemos este archivo en la terminal. Es un nodo índice sillas, y vea aquí obtenemos nuestra salida. Para que puedas ver lo sencillo y fácil que es crear nuestros propios módulos y acceder a ellos en otros módulos. 12. Uso del módulo de trayectorias: Entonces, hasta ahora, hemos visto cómo trabajar con módulos locales. Ahora veamos algunos módulos core o podemos decir módulos que ya están disponibles en el nodo JS. Así que dirígete a nodjs.org, y desde el encabezado, abre su documentación Asegúrate de que aquí seleccionamos otra versión y seleccionamos la versión Ts porque es la versión estable. Aquí obtenemos toda la información sobre el nodo JS, como objeto simple, consola. Además, tenemos muchos temas explicados y cómo utilizarlos. Tenemos algunos módulos principales como file system. Dentro de esto, explican todos sus métodos y propiedades. Además, tenemos módulo STP, módulo OS, módulo path, y mucho más Aquí veremos algunos módulos principales importantes que necesitamos para crear nuestro back end. Si te gusta aprender todos estos, entonces puedes leer esta documentación. Pero en mi sugerencia, voy a cubrir todos los módulos importantes. Empecemos con el módulo Path. El módulo Path se utiliza para trabajar con rutas de archivos y directorios. Por ejemplo, cuando queremos almacenar la imagen cargada en nuestro servidor, entonces mediante el uso de este módulo path, podemos darle a esa imagen ruta adecuada para guardarla en una carpeta específica. Entonces, si quieres fusionar dos rutas u otras cosas relacionadas con la ruta, entonces puedes usar este módulo de ruta. Déjame mostrarte eso. Además, puedes ver aquí, nos muestran cómo podemos acceder a este módulo en nuestra aplicación. Igual que estamos accediendo a nuestros módulos locales en la función requerida. Pero en el lugar de la ruta del archivo, escribimos nuestro nombre de módulo. Entonces en nuestra aplicación, simplemente elimino este código. No lo necesitamos ahora aquí escribimos require function, y en los códigos, escribimos node column y nuestro nombre de módulo core, que es path. En la versión anterior del nodo, solo escribimos el nombre del módulo principal sin prefijo de columna de nodo. También, esto funcionará en versión actual. Yo uso esta sintaxis anterior, puedes usar cualquier sintaxis, depende totalmente de ti. Ahora, igual que antes, esto requiere función escrita exporta objeto de este módulo de ruta. Tenemos que almacenarlos en ruta variable. Ahora podría preguntarse ¿por qué no desestructuramos aquí este objeto como lo hicimos anteriormente? Sí, podemos hacer lo mismo aquí, pero aún no conocemos su propiedad. Entonces es mejor no desestructurar aquí. Ahora, déjame mostrarte algunos métodos útiles del módulo path. Supongamos que queremos ver alguna información sobre un archivo específico. Entonces aquí tenemos el método path dot parse, y en esta función parse, cómo pasar la ruta completa de nuestro archivo. Pero, ¿cómo podemos obtener la ruta completa de nuestro archivo? Así que en el nodo js anteriormente vimos que todos los archivos tienen objeto módulo, que utilizamos como módulo de exportaciones de punto. Además, todos los archivos tienen otras dos variables. Uno es subrayado subrayado nombre de archivo, que devuelve la ruta completa del archivo actual y subrayado subrayado Dname que es la ruta de directorio Déjame mostrarte estos dos primero. Entonces por ahora, comento este método de pase de ruta y rápidamente consol dot log, subrayado subrayado Dname console dot log, Underscrendscre, nombre este método de pase de ruta y rápidamente consol dot log, subrayado subrayado Dname console dot log, Underscrendscre, nombre de archivo. Guarde los cambios y ejecutemos este archivo. Ver, aquí obtenemos la ruta completa del directorio actual. Directorio significa carpeta, y debajo de eso para Underscore desceFlecename, tenemos ruta completa Ahora volvemos a nuestro archivo, eliminamos esta tanto Consola y eliminamos comentario de aquí usando Control plus slash o Command plus slash y simplemente en esta función de análisis, pasamos nombre de archivo Underscredsc Obtenemos algunos detalles sobre esta ruta de archivo y para imprimir su resultado, simplemente lo envolvemos con el registro de puntos de consola. Bien, guarda los cambios, y vamos a ejecutar este archivo. Ver, aquí obtenemos este objeto. Primero, obtenemos la propiedad root, que es la ruta raíz de la ruta actual. Aquí en Windows, obtenemos C colon, slash hacia atrás. Si eres usuario de Mac o Linux, entonces llegarás aquí adelante slash A continuación, tenemos DR, que es ruta de directorio después de eso, tenemos base, que es la última parte de esta ruta, que es índice punto Js. Después de eso, tenemos EXT para extensión y último, obtenemos nombre de la última parte, que es índice. Este método parch se utiliza para obtener detalles sobre la ruta específica Ahora veamos un método más útil de módulo path que es join. Supongamos que en nuestra base de datos, queremos almacenar la ruta en donde almacenamos nuestra imagen subida como foto de perfil. Entienda que las fotos de perfil en carpeta llamadas subidas en Aquí podemos usar el método path dot join. Aquí al principio, necesitamos la ruta del proyecto actual, y ¿cómo podemos obtener esta ruta de carpeta? ¿Deberíamos usar guión bajo nombre de archivo de guión bajo? No, tenemos que usar underscore undisco dirname. En el segundo argumento, pasaremos el nombre de nuestra carpeta que se carga. Obtendremos una ruta de nuestra carpeta de proyectos y nos unimos a carpeta Uploads al final de esta ruta del proyecto. A ver lo que obtenemos. Eliminamos esta consola y almacenamos esta ruta en variable llamada profile Path y console dot log esta ruta de perfil. Guarde este archivo y ejecutemos este archivo. Ver, aquí obtenemos camino completo. Esta primera parte es subrayado subrayado, querido nombre, y nos unimos a la carpeta Uploads al Sé que esto es un poco confuso, pero no te preocupes cuando usemos estos módulos en nuestro proyecto, todo esto tendrá sentido. Ahora, aquí podrías preguntar, ¿podemos unir dos partes manualmente? Por qué necesitamos usar tu módulo path. Entonces, como sabemos, para una ruta de archivo, Windows usa una diagonal hacia atrás, y los usuarios de Mac y Linux usan la diagonal hacia adelante Por lo que obtenemos diferentes resultados en diferentes sistemas. Si escribimos ruta manualmente con slash hacia atrás, entonces en Mac no podemos encontrar nuestra ruta Y también, actualmente, nuestro proyecto está disponible localmente, y por eso sabemos que es camino. Pero en el mundo real, implementamos nuestra aplicación backend en algún lugar de Internet y no conocemos la ruta de ese servidor Por lo que este módulo path es muy útil en este tipo de situaciones. 13. Cómo obtener los detalles del sistema operativo: A veces necesitamos algunos detalles de nuestro sistema operativo de servidor como qué sistema operativo está usando o cuánta memoria tienen, etcétera Para eso, tenemos otro módulo core llamado OS, que significa sistema operativo. Entonces quitamos este código anterior, y ¿me pueden decir cómo podemos acceder a este sistema operativo? Derecha, podemos usarlo por función require y simplemente pasar aquí nodo, columna OS. Podemos usar solo OS. Ahora podemos almacenar esto en una variable llamada OS. Supongamos que aquí queremos ejecutar un código específico para el sistema Windows y para Mac, queremos ejecutar otra cosa. Aquí podemos escribir si condición s punto plataforma, esto devolverá el nombre de la plataforma en la que se está ejecutando este código. Si st plataforma es igual a ganar 32, si esto es cierto, entonces ejecutaremos código para Windows. Por ahora, solo escribimos consola dot Log, hola, Windowsser Después de eso, queremos ejecutar algún código para el sistema Mac. Agregamos s y comprueba la plataforma de puntos es igual a Dawn. Este es el nombre de la plataforma para macOS. Dentro de esto, ejecutamos consola dot log, hola McUser. Por fin, simplemente pasamos ls y Consol dot log Hellouser. Comprueba que esto esté funcionando o no. Ver los cambios y echar un vistazo. Ver, aquí obtenemos Hola usuario de Windows, por lo que está funcionando. Ahora en el módulo OS, tenemos muchas más propiedades. No quiero aburrirte explicándote todas las propiedades porque eso llevará mucho tiempo. Pero déjame explicarte dos propiedades más útiles del módulo OS. En primer lugar, podemos obtener la memoria total del sistema operativo utilizando este módulo del sistema operativo. Así que Os dot MM total para la memoria, y simplemente podemos imprimirlos usando el registro de puntos de consola. También tenemos otra propiedad llamada MM gratis para obtener la memoria libre. Entonces duplicamos esta línea usando Shift más alter, más flecha abajo o Shift plus opción, más flecha abajo y cambiar esta función MM total con FreeMM Guarda los cambios y echa un vistazo. Mira, aquí tenemos memoria en bocados. Tengo ocho GB de memoria total y la memoria libre es de casi dos GB. Puedes ver que esta es la importancia del nodo js. Antes del nodo js, al usar JavaScript simple, no podemos obtener este tipo de detalles. Así es como se utiliza el módulo OS para obtener información del sistema operativo. 14. Módulo de sistema de archivos: Hay otro módulo de núcleo popular que utilizamos para interactuar con archivos. Por ejemplo, con sistema de archivos o módulo FS, podemos escribir el archivo, leer el archivo, actualizar el archivo, y también podemos eliminar un archivo específico. Así que aquí en la documentación del nodo, abrimos el módulo del sistema de archivos. Podemos ver que tiene tantos métodos y propiedades. Déjame mostrarte cómo podemos usar el Módulo FS. Eliminemos este código anterior. No te preocupes. Voy a añadir todo este código en archivo separado para que puedas verlo más tarde. Aquí queremos acceder al módulo core, requerir código Fs, y lo almacenamos en la variable llamada Fs. Ahora simplemente escribimos Fs punto y vemos aquí obtenemos la lista de todos los métodos. Pero, ¿qué es esto? Todos estos métodos tienen dos variaciones. Uno es síncrono o métodos de bloqueo, y otro es sin synkyword que significa asíncrono Ahora, como sabemos, el nodo es popular por su forma asíncrona o no bloqueante Tenemos que usar siempre métodos asíncronos en el nodo js. Nodo nos dan método sincrónico para la simplicidad. Déjame mostrarte uno por uno ambos. Aquí, queremos obtener la lista de archivos que tenemos en la carpeta actual. Para ello, tenemos método llamado read directory sync, y aquí pasamos la ruta del directorio que queremos leer. Period slash que es el directorio actual, y almacenamos estos datos en una variable llamada data Y al final, simplemente registramos estos datos. Guarde los cambios, y veamos qué obtenemos aquí. Ver, aquí obtenemos la lista de todos los archivos dentro de esta carpeta. Ahora veamos también cómo podemos usar el método Asynrns. Entonces como directorio punto rojo, y igual que antes, en la primera posición, pasamos nuestra ruta de directorio, que es periodo slash Ahora en casi todo el método asíncrono, hay que pasar segundo argumento, que es la función callback, que es la función ejecutar cuando este trabajo asincrónico Y también, eso lo podemos ver en sugerencias. Ahora, hay dos posibilidades para todo el trabajo asíncrono. Obtenemos un error o completamos con éxito ese trabajo. Sé que esto es un poco confuso si estás lidiando con trabajo asincrónico por tiempo, pero no te preocupes en las próximas secciones, tengo sección completa para JavaScript asincrónico Aprenderás todo esto en profundidad. Ahora en esta función en la primera posición, obtenemos error, y en el segundo parámetro, obtenemos nuestros datos. Si obtenemos error, entonces obtenemos null en estos datos. Y si obtenemos nuestros datos, entonces obtenemos nulos en este error. Entonces para manejar este escenario, podemos pasar su condición. Si el error está disponible, entonces registraremos el error. Como vamos a consola dot log nuestros datos. Tan simple como eso. Ahora vamos a comentar esta consola para el método sincrónico. Guarda los cambios y echa un vistazo. Ver, aquí volvemos a obtener los mismos datos. Ahora, si quieres verificar, obtenemos error o no, entonces podemos cambiar esta ruta a otra cosa, guardar esto y volver a ejecutar este archivo. Ver, aquí obtenemos error, no hay tal archivo o directorio. Entonces ahora entiendes cómo funcionan estos métodos de acing. Además, no te preocupes por esta complejidad porque apenas usamos estos módulos centrales en nuestro proyecto. Actualmente, te estoy mostrando solo módulos, y este módulo de archivo está poco avanzado para esta etapa. Así que no te preocupes por esto. Lo dominarás cuando los utilicemos en nuestros proyectos. 15. Creación de servidor mediante el módulo HTTP: Veamos uno de los módulos centrales más importantes del nodo JS, que es el módulo SDTP El módulo SDDP nos permite crear un servidor SDDP y también para manejar diferentes Como sabemos, NodeJS se utiliza crear backend para nuestra aplicación cliente, pero actualmente, solo accedemos a este backend ¿Y si nuestro front end quiere acceder a nuestro back end? Así que para interactuar con web en nodo, tenemos módulo SDDP Déjame mostrarte recticamente como podemos crear servidor. Así mismo que antes, acceda al módulo STDP usando la función requerida y pase aquí SDDP y almacene eso en la variable llamada Ahora bien, ¿me puede decir qué está escrito este módulo STDP? Voy a devolver el método SDDB. Ahora, este STDP tiene un método llamado Crear servidor que se utiliza para crear servidor para nuestra aplicación backend Ahora ¿qué pasaremos dentro de esta función de crear servidor? Simplemente, aquí pasamos la función de devolución de llamada. Cuando alguien envía solicitudes a nuestro servidor, esta función de devolución de llamada se ejecutará Déjame preguntarte algo. ¿Cuál es el trabajo principal de nuestro servidor? Entonces, cuando el usuario envía la solicitud al servidor, el servidor tiene que devolver la respuesta de acuerdo a la solicitud de datos. Entonces aquí en nuestra función de servidor, necesitamos la información sobre la solicitud del usuario, qué API solicita, etcétera Entonces aquí, en este argumento de función, obtenemos request object, que es los detalles de la solicitud del usuario. Ahora aquí tenemos información sobre solicitud. Entonces nuestro servidor hace su proceso y supongamos que queremos devolver la respuesta como mensaje hola mundo. Para enviar respuesta aquí en el argumento de función, obtenemos aquí objeto de respuesta después de este objeto de solicitud. Además, a muchos desarrolladores les gusta escribir nombre corto, Rg para solicitud y Rs para respuesta Ahora para regresar Hola mundo mensaje, escribimos respuesta punto R. Y en códigos, pasamos nuestro mensaje Hola mundo. En el mundo real, devolveremos datos de aquí, por ahora solo estamos escribiendo mensaje cuando alguien envía solicitud en el servidor. Y aquí, tenemos que decir también que esta respuesta es terminar aquí. Entonces escribimos respuesta punto N. Esto asegurará que nuestro proceso de respuesta termine aquí. Ahora aquí creamos nuestro servidor, pero necesitamos iniciar este servidor en algún puerto. Si no reaccionas, nuestra aplicación se ejecutará en host Local 5173 si es creada por y. ahora, igual que eso tenemos que iniciar este servidor en algún puerto Veamos cómo podemos hacer esto. Aquí este punto stp Crear método servidor, devolver nuestro objeto servidor, lo almacenamos en la variable llamada servidor Y después de esto en la parte inferior, escribimos server dot LISN Y en esta función, pasaremos nuestro puerto en el que queremos iniciar este servidor. A muchos desarrolladores les gusta ejecutar servidor en 5,000 o 3,000. Pero puedes dar cualquier puerto, asegúrate de que ese puerto no se use en tu sistema. Aquí, me gusta usar 3 mil. En el mundo real, cuando desplegamos nuestro servidor, entonces este puerto será reemplazado por nuestro nombre de dominio Bend como catwis.com o tasrag dotben.com Además, en esta función, podemos pasar otra función de devolución Esta función se ejecutará cuando nuestro servidor se inicie correctamente. Aquí simplemente escribimos consol dot log server start listening on port 3,000 Guarda los cambios y vamos a ejecutar este código porque sin este código ejecutándose, cómo el servidor creará el nodo index dot js. Ver, aquí conseguimos servidor empezar a escuchar en el puerto 3,000. Si estás usando Mac y usas el puerto 5,000, entonces podrías obtener un error de 5,000 puerto ya está en uso porque en Mac ARP las encuestas del receptor se ejecutan en este puerto Puede usar otro puerto como 5,001, 5,002, o incluso puedes usar 3,000 No hay regla para el número de puerto siempre y cuando el puerto ya esté en uso por otro servicio en nuestro sistema. Ahora para verificar esto, necesitamos enviar solicitudes en este puerto. Así que abre un navegador y simplemente escribe aquí URL, Host local Columna 3,000 o tu número de puerto. Ver, aquí nos llega nuestro mensaje, Hola Mundo. Así que creamos con éxito nuestro servidor y también iniciamos este servidor. Entonces cada vez que alguien envía solicitudes en el servidor, esta función se ejecutará e imprimirá este mensaje tan simple como eso. 16. Cómo manejar las diferentes rutas: Ahora actualmente estamos enviando solicitudes sobre la ruta de ruta portuaria, lo que significa ruta de origen. Pero en el mundo real, el usuario puede enviar solicitudes al host local Columna 3,000 barra diagonal Acerca o cortar productos Así que también tenemos que manejar estas diferentes rutas en nuestro servidor. Y para manejar diferentes rutas, primero, necesitamos información para qué ruta el usuario envía solicitud. Y para eso tenemos aquí solicitar objeto. Escribimos aquí condición solicito punto URL igual a en códigos, barra diagonal hacia adelante Esta barra diagonal simple representa la ruta raíz. En los corchetes CL, podemos simplemente mover esta respuesta punto escribir función retención alter u opción, y flecha hacia arriba Después de eso, queremos manejar, digamos de ruta. Así que aquí agregamos si request dot URL es igual a en códigos sobre y si es cierto, entonces simplemente devolvemos otro mensaje respuesta punto derecho. Se trata de ruta. Así, podemos agregar tantas solicitudes como queramos. Y después de todas las rutas, pasaremos, lo que significa rutas de paso de usuario, que no se maneja aquí. Y es por eso que aquí volvemos respuesta simple punto derecho, ruta no encontrada. También asegúrese de que esta función de punto de respuesta se llame al final de esta función de servidor. Guarda los cambios y vuelve a nuestro navegador. Si cambiamos nuestra URL para cortar, ¿ me puede decir qué vamos a conseguir aquí? A ver. Mira, aquí nos sale el mismo mensaje hola mundo porque en nuestra terminal, todavía se está ejecutando nuestro código antiguo en el que no manejamos rutas. Para ejecutar este nuevo código, tenemos que volver a ejecutar nuestra aplicación. En terminal primero, detendremos la aplicación pulsando Control más C en Windows y Mac ambos. Después de eso, nuevamente ejecutamos node index dot js. Bien, llegamos hasta aquí, los servidores empiezan a escuchar en puerto, y en navegador si actualizamos nuestra página, mira, ahora nos llega aquí mensaje. Se trata de ruta. Y si tratamos de solicitar alguna otra ruta, entonces aquí obtenemos ruta no encontrada. Así manejamos diferentes rutas API usando el módulo SGDP Ahora imagina que tenemos 20 rutas API diferentes y para manejarlas, tenemos que escribir 18 bloques sf más. Y si todas esas rutas tienen cientos de señales de código, entonces administrar nuestro propio servidor se volverá tan desordenado Entonces en el mundo real, no vamos a utilizar este módulo SDDP. O que tenemos un módulo de terceros muy popular llamado Express y Express tiene muchos más beneficios que este módulo SDTP Además, usando Express, podemos dividir nuestras rutas en diferentes archivos, para que no nos confundamos cuando tenemos que hacer alguna actualización o queremos agregar nuevas funcionalidades. Te explico todos estos módulos para que entiendas poco cómo está funcionando el nodo y te pongas cómodo con alguna sintaxis de JavaScript. Espero que disfruten de esta sección, nos vemos en la siguiente sección. 17. Sección 03: introducción a las NPM: Ven a la tercera sección de las puntuaciones de JS del nodo definitivo. En esta pequeña sección divertida, veremos todo sobre el gestor de paquetes de nodos o en resumen NPM. Entonces, ¿qué es el administrador de paquetes de nodos? Node package manager es una herramienta que nos ayuda a administrar paquetes o bibliotecas para nuestro proyecto de nodo. En palabras simples, NPM es como un gran almacén para desarrolladores En este almacén, los desarrolladores almacenan su código JavaScript para otros desarrolladores puedan buscar ese código y descargar el código reutilizable en su proyecto. Déjame mostrarte eso. Así que dirígete a NPM. JS.com. Aquí podemos buscar nuestro paquete o nombre de biblioteca. Paquete o biblioteca significa una pieza de código reutilizable. Por ejemplo, en la sección anterior, te dije que usaremos Express Library para crear servidor STD. Ver, aquí obtenemos muchos resultados para esta búsqueda. Simplemente, abrimos este paquete Express. Ver en el lado izquierdo, obtenemos documentación básica, cómo usarla, etcétera, y en el lado derecho, obtenemos información sobre el paquete En primer lugar, en la parte superior, obtenemos el comando de instalación, que verás en la próxima lección. A continuación, tenemos el enlace del repositorio Github para que podamos ver el código y también obtenemos el enlace de su página web oficial. Aquí podemos ver estas son las descargas mensuales de este paquete. Por esto, podemos ver la popularidad de este paquete. Además, obtenemos información de versión y muchas otras cosas. Entonces en NPM, obtenemos paquetes para casi todas las funcionalidades que queremos agregar en nuestra aplicación Y lo asombroso es esto todos los paquetes que podemos usar de forma gratuita. Entonces hay paquetes premium, pero es raro que compremos paquete. En realidad, no compré ningún paquete hasta ahora. Entonces en esta sección, veremos comandos de cómo instalar diferentes paquetes. También desinstalaron paquetes, instalamos la dependencia del desarrollador, actualizamos algunos paquetes, etcétera. Entonces, por esta pequeña sección, te sentirás cómodo con comandos del NPM y no te confundirás con ellos. Son extremadamente simples y fáciles. Entonces comencemos esta sección. 18. Crear paquete: Entonces, como vemos en la lección anterior, usamos tantos paquetes como queramos en nuestro proyecto. Ahora cuando instalamos cualquier paquete, ese paquete tiene un montón de archivos y carpeta, cuales descargaremos en nuestro proyecto y lo almacenaremos en la carpeta llamada Node Modules. Ahora imagínese que instalamos diez o 20 paquetes en nuestra aplicación. Todos esos archivos se almacenarán en esta carpeta de módulos de nodo. Cuando queremos compartir nuestro proyecto o queremos subir nuestro proyecto en Github, entonces no subimos esta carpeta de módulos de nodo porque aumentará el tamaño del proyecto y también aumentará el número de archivos. Entonces no subimos la carpeta de módulos de nodo. Ahora podrías preguntar si no compartimos esta carpeta de módulos de nodo con alguien, cómo sabe qué paquetes tienen que instalar. Para resolver este problema en nuestro proyecto de nodo, crearemos un archivo llamado paquete punto JCN En este archivo, los nodos almacenan toda la información principal sobre nuestro proyecto. Así que cada vez que empezamos a trabajar en cualquier proyecto de nodo, lo primero y más importante que hacemos es crear Gs empaquetados y archivar para nuestro proyecto. Veamos cómo podemos crear paquete archivo Gn. Así que aquí creo una nueva carpeta llamada NPM Dash Commands y abro esa carpeta en vis code Bueno. Ahora aquí, antes que nada, tenemos que crear paquete archivo GSN para eso, abrimos nuestro terminal usando Control Plus Batak, y aquí escribimos NPM, init, init, Vea, esta utilidad le guiará a través de la creación de un archivo sn de paquete. En la parte inferior, nos pide el nombre de nuestro proyecto. Si quieres cambiarlo, entonces puedes escribir un nuevo nombre aquí, pero asegúrate de usar letras minúsculas y también sin espacio. Estoy contento con este nombre actual, así que simplemente golpeé Enter. Después de eso, pedirá el nombre de la versión. Nuevamente, no queremos cambiar este valor predeterminado, así que golpeamos Enter. Ahora aquí, podemos escribir la descripción de nuestra aplicación. Por ahora, solo me salto esto. A continuación, tenemos el punto de entrada, que es el nombre de archivo predeterminado de nuestro proyecto. Entonces, cuando implementemos nuestra aplicación, esa plataforma sabrá cuál es el archivo principal de nuestra aplicación. Después de eso, tenemos el comando test, el repositorio Git, luego la palabra clave, el autor y la licencia. Pulse Enter para todo esto y vea aquí obtenemos este objeto que va a agregar en el paquete a jcnfle se está preguntando, ¿está bien Si estás de acuerdo con estos detalles, entonces simplemente podemos escribir aquí, y o sí. Y hecho. Ver, aquí obtenemos el paquete JSNFLE en nuestra carpeta de proyectos. Si abre ese archivo, vea, aquí obtenemos este objeto con detalles de la aplicación y en el futuro, también podemos cambiar estos detalles. Ahora bien, si le prestas poca atención, cuando estamos dando respuesta al paquete archivo GSN, en realidad no cambiamos nada y aún así tenemos que pasar por todas esas preguntas ¿Hay algún truco de atajo para esto? La respuesta es sí, tenemos atajo com creando paquetes y archivo. Aquí, eliminemos este paquete actual Gs y archivo. En la terminal, anteriormente, escribimos NPM en ella. Con eso, tenemos que responder a todas esas preguntas. Pero si queremos saltarnos esas preguntas, entonces escribimos aquí NPM en él Y para todos, sí Y hecho. Ver, volvemos a recibir paquete DSNfle en tan solo un segundo Y también objeto es el mismo. En resumen, cuando iniciamos cualquier nuevo proyecto de nodejs, antes que nada, necesitamos crear paquete Gn file con el comando NPM 19. Instalación del paquete en el proyecto: En la lección anterior, te dije que este paquete archivo GSN tiene información de aplicación con la lista de paquetes, pero no podemos ver ningún nombre de paquete aquí Es porque en nuestra esta aplicación, aún no instalamos ningún paquete. Así que vamos a instalar algunos paquetes. Para ello, necesitamos ejecutar un comando en la terminal. Es realmente sencillo. Simplemente tenemos que escribir NPM install, o podemos usar aquí taquigrafía, que es solo espacio Aquí, escribimos nuestro nombre de paquete, digamos Express. Además, obtendrá este comando en la página de ese paquete en el sitio web de NPM. Puedes copiar de esto también, y aquí golpeamos Enter. Consulta en nuestra carpeta proyectos, obtenemos la carpeta de módulos de nodo en la que todos nuestros paquetes de terceros guarda sus archivos y carpeta. Y si abrimos eso, mira, aquí obtenemos muchas carpetas y muchos archivos. No te preocupes por eso porque en el mundo real, nunca abrimos esta carpeta. O creamos esa carpeta, borramos esa carpeta, pero nunca abrimos esa carpeta, no te preocupes. Después de eso, también obtenemos el paquete log dot jsnfle. Packageog dot JSNFle se utiliza para registrar dependencias a un número registrar dependencias En otras palabras, el paquete log dot JSNFle asegura que todos los desarrolladores y también el sistema de implementación utilicen la misma versión del paquete para Además, no te preocupes por eso. Apenas tocamos este archivo. Y si vemos en el paquete punto jcnfle aquí en la parte inferior, obtenemos nueva propiedad llamada dependencias, y en eso, obtenemos todas nuestras dependencias Dependencias son de lo que dependen nuestros proyectos. Sin estos paquetes, nuestra aplicación no puede funcionar, y por eso la llamamos dependencia. Esta es la versión de nuestro paquete Express. Si instalamos otro paquete, entonces ese paquete se agregará en esta lista de dependencias con su versión Ahora bien, esta versión es la última versión que los desarrolladores implementan en el sitio web de NPM. Pero a veces los desarrolladores al implementar erróneamente versión empantanada o nueva versión, introducen alguna nueva sintaxis En ese caso, también podemos instalar versión anterior de cualquier paquete NPM. Entonces aquí en el lado derecho, tenemos la versión Puñalada Ver, aquí podemos ver el historial completo de este paquete. Podemos instalar cualquiera de estos paquetes. Supongamos que queremos instalar esta versión 4.18 0.1. Entonces damos click en esa versión. Abrirá su página de inicio para esa versión específica. Y podemos ver aquí se cambia la versión, y también se cambia el comando de instalación. Agregan AdSign y después de eso, escriben versión de paquete, así de simple Así que volvamos al código VS aquí, nuestra versión actual es esta. Ahora, copiamos este comando de este sitio y simplemente lo pegamos en nuestro terminal de proyecto y pulsamos Enter. La versión C cambió. Así es como instalamos paquetes con comando NPM I package name Además, aquí podemos agregar múltiples nombres de paquetes. Y si queremos instalar verson específico entonces escribimos NPM, nombre del paquete en el número de versión roja, y eso es todo Así de sencillo instalar el paquete en el proyecto de nodo. Y después de instalar los paquetes, podemos empezar a usarlos en todos los archivos JavaScript de este proyecto. 20. Desinstalación de paquetes: Ahora veamos como desinstalar paquete. Pero antes de eso, instalemos otro paquete llamado Mongo DB Dime qué comando usamos. Usamos NPM install o I, y luego escribimos nuestro nombre de paquete Mongo DB Lo estás haciendo muy bien. En este paquete dot jcnfle, se puede ver otro paquete en Intentemos desinstalar este paquete. Para eso, necesitamos escribir NPM, desinstalar, o también tenemos taquigrafía para eso, que es Entonces escribimos nuestro nombre de paquete que es Mongo DV. Este comando hace dos cosas. Primero, eliminará archivos y carpetas de ese paquete en particular de la carpeta de módulos de nodo. En segundo lugar, actualizará los archivos de configuración, que es el paquete JSN y packslogt Por eso, en el futuro, nuestra aplicación no instalará paquetes innecesarios. 21. Instala el paquete como dependencia del desarrollador: Ahora a veces en nuestro proyecto, queremos instalar paquete solo para usar en el entorno de desarrollo, no en la producción. Por ejemplo, tenemos algunos paquetes de prueba que solían probar nuestra implementación de código. No necesitamos probar paquetes en nuestro entorno de producción. Innecesario aumentará el tamaño del servidor. En el nodo Jazz, podemos instalar paquetes en la dependencia del desarrollador o en definitiva, dependencia dave, lo que significa que ese paquete solo agregará en nuestro entorno de desarrollo, no en la producción. Así que en nuestra aplicación, vamos a instalar un paquete de prueba como Do dependencia. Para eso, escribimos NPM. Aquí escribimos nuestro nombre de paquete, que es Mocha. Este es el comando normal para instalar el paquete. Ahora para instalar el paquete como Do dependencia, tenemos que agregar opción aquí, d s Dev y golpear Enter. Ahora vamos a verificar esto. Pun package dot jcnfle en la parte inferior, podemos ver dependencias dev, y en eso, tenemos nuestro Podemos instalar cualquier paquete como dependencias dev, tenemos que usar Dev al final del comando install Pero ten en cuenta que solo agregará en el entorno de desarrollo. Además, si queremos desinstalar paquetes de dependencias dv, entonces usamos el mismo comando que vemos en la lección anterior, NPM Uninstall o el nombre del paquete UN, que es Mocha. Y hecho. 22. Paquetes obsoletos y actualízalos: Veamos algunos comandos útiles de NPM. A veces en nuestra aplicación, instalamos algunos paquetes que podríamos quedar obsoletos y NPM tiene su versión más reciente Por ejemplo, en esta sección, instalamos la versión anterior del paquete Express. Ahora bien, ¿cómo podemos identificar qué paquetes tiene actualizaciones? Para eso, tenemos un comando en NPM, que está desactualizado. Escribimos NPM anticuado y golpeamos Enter. Y mira, aquí tenemos la lista. Tenemos nombre del paquete. Es versión actual, buscado significa última versión del paquete que satisfaga la gama de versiones. Última versión, que es la última versión de tabla de este paquete, ubicación, que es la ubicación de este paquete, que se encuentra en la carpeta express non module. Por fin, dependiendo de cual sea el proyecto o dependencia que sea depende de este paquete. Por esto, podemos ver rápidamente qué paquetes están desactualizados en nuestro proyecto. Ahora actualmente solo obtenemos un paquete, pero imagina que estamos trabajando en viejo proyecto grande y aquí obtenemos muchos paquetes obsoletos. Ahora para demostrarlo, permítanme instalar otro paquete con versión anterior. Escribimos NPM instalar Mongo Debi a razón 4.14 0.0. Golpea Enter. Bueno. Ahora volvemos a ejecutar NPM comando obsoleto Ver, aquí conseguimos nuestros dos paquetes. Ahora podría preguntarse ¿por qué la versión deseada y la última versión son diferentes? ¿Qué significa eso? Como te dije, quería fuentes de columna, que es la última versión del paquete que satisface el rango de versiones. Actualmente, tenemos la versión 4.14 0.0 en nuestro proyecto. Se trata de la gama de versiones sólo la versión cuatro relacionada. Por ejemplo, 4.15 0.1, 4.16 0.0, 4.17 0.1, etcétera Este tipo de versión es el rango de versiones para 4.14 0.0, no 6.15 Pero podría preguntarse, ¿cuál es el problema para actualizar nuestra versión a 6.15 0.0 permite la versión? Eso lo podemos hacer. Pero cuando los desarrolladores cambian el número de versión como la versión cuatro a la versión cinco o la versión seis, entonces podrían hacer algunas actualizaciones que pueden darte error para el código antiguo de acuerdo con la versión 4.14 0.0 Por eso siempre actualizamos nuestro paquete a esta versión deseada, no a la última versión. Por eso, no vamos a romper nuestra aplicación. Ahora queremos actualizar todos estos paquetes desactualizados de una sola vez. Tenemos otro comando para actualizar paquetes desactualizados. El comando es NPM update. Eso es. Actualizará todos los paquetes a su última versión dentro del rango específico, pero no actualizará archivos package dot Json y packago Json Ver, en el paquete GSN, todavía tenemos nuestra versión antigua llamada paquete Express Ahora, hasta que actualicemos el paquete dot JSN o packaglot JCNFle no tiene sentido Es necesario, necesitamos actualizar paquete perros y archivo. Para eso, usamos otro paquete subido en NPM, que es NPM check updates. Escribimos NPM, I y aquí agregamos G para instalar globalmente este paquete en nuestro sistema En las otras aplicaciones de nodo, no necesitamos instalar este paquete. Estará disponible a nivel mundial en nuestro sistema. Aquí escribimos nuestro nombre de paquete, que es NPM check Updates Asegúrate de escribir el mismo nombre con guión, no guión bajo Además, si estás usando MG, entonces al inicio de este comando global, tienes que agregar pseudo prefijo De lo contrario, obtendrá un error y después de eso, ingrese la contraseña de su sistema. Ahora podemos simplemente ejecutar actualizaciones de verificación de NPM. Ver, comprueba el paquete dot jcnfle y dice que nuestro Express y Mongo Aquí se muestra esta última versión, pero queremos actualizar nuestro paquete con la versión deseada. Entonces tenemos que escribir aquí NCU, que es la taquigrafía de las actualizaciones de verificación de NPM. T para Target. Nos dirigimos a menor, que son las versiones buscadas. Esto devolverá solo versiones principales. Ver, aquí obtenemos la versión deseada para ambos paquetes. También en la parte inferior, sugiere ejecutar NCT menor para actualizar el paquete J y el archivo Ejecutamos actualizaciones de verificación de NPM, o podemos escribir NT, menor y golpear Enter C, cambió la versión en los paquetes y archivo. Nuevamente, sugiere ejecutar NPM install para instalar nuevas versiones Escribimos NPM install o NPM I y golpeamos Enter y listo. Todos nuestros paquetes están actualizados, así es como identificamos los paquetes obsoletos y cómo actualizar los paquetes a su última gama específica. Para que nuestra aplicación no se rompa por la nueva versión del paquete. 23. Eliminar los paquetes no utilizados del proyecto: A veces en nuestra aplicación, podríamos instalar tantos paquetes al inicio de nuestro proyecto, pero algunos paquetes realmente no usamos, por lo que podemos eliminar esos paquetes no utilizados porque ocuparán espacio innecesario en la producción. Así que olvidando la lista de paquetes no utilizados, necesitamos otro paquete llamado DP check, que es la comprobación de dependencia. Entonces escribimos verificación de profundidad NPM IG. Nuevamente, estamos instalando este paquete para nivel global. En toda aplicación, podemos usarlo. Además, si eres Mcuser, asegúrate de agregar sudo al inicio del comando global package e ingresa la contraseña de tu sistema Ahora puedes simplemente ejecutar aquí dep check, y devolverá la lista de dependencia no utilizada y también dependencia dab no utilizada Actualmente, no usamos ninguna dependencia ni paquetes. Es por eso que obtenemos todos los paquetes de terceros como no utilizados. Mediante el uso de desinstalación de NPM o UN Express Mongo DB, podemos desinstalar todos los paquetes Genial. Ahora si volvemos a checar dap, entonces no lleguemos aquí nada, preciosa. Así es como podemos eliminar paquetes no utilizados de la aplicación de nodo. Eso es todo acerca del administrador de paquetes de nodos o NPM. Si quieres revisar rápidamente lo que aprendes en esta sección, obtendrás un PDF resumido al final de cada sección, para que puedas descargarlo y recapitular lo que aprendiste Ahora, a partir de la siguiente sección, comenzaremos a construir nuestro primer proyecto real No Js. 24. Sección 04: API vs. API REST: Bienvenido a la cuarta sección del curso Ultimate Node JS. En esta sección, comenzaremos a trabajar en nuestro primer proyecto. Entonces comenzamos con lo básico, Qué es RS API, configuramos nuestro servidor usando Express JS, luego crearemos diferentes tipos de STB request, get, post, put, y delete Además, vemos validación de datos y mucho, mucho más. Entonces comencemos esta sección. Ahora como sabemos, API significa interfaz de programación de aplicaciones, y es la forma dos programas se comunican entre sí. Recuerda nuestro ejemplo de restaurante, veamos otro ejemplo del mundo real. Imagine que el usuario quiere registrarse en nuestro sitio web, por lo que rellena el formulario y luego lo envía. En el momento en que envían, llamamos API para registrar un nuevo usuario, y en el back-end, creamos un nuevo usuario. Al igual que estas, podemos crear muchas APIs para registrar al usuario existente, obtener la lista de todos los productos, agregar productos al carrito, eliminar productos del carrito, etcétera En palabras simples, API se utiliza para transferir datos entre front-end a backend y back end a front end. Eso ya lo sabemos. Ahora podrías preguntar qué es la API de descanso. API Rest significa API de transferencia de estado representacional. Rest API es una forma específica de construir nuestras API simples. No te preocupes por su nombre. Es muy sencillo. Rest API es la misma API, pero tenemos que seguir algunas reglas para construir esa API. Si seguimos algunas reglas, esa API simple se convierte en API de resto. Ahora veamos algunas reglas que tenemos que seguir. Hacer resto API. Una regla es que tenemos que definir una URL API separada para cada dato. Por ejemplo, supongamos que estamos creando API para operaciones relacionadas con el usuario como registrar usuario, obtener la información de un solo usuario, etcétera En este caso, nuestra API debe ser nuestro nombre de dominio y luego cortar usuario para registrarse Y si queremos obtener información sobre un solo usuario, entonces creamos URL API como slash users 123 Aquí 123 es un ID único de usuario. Igual que si creamos API relacionadas con productos, entonces nuestra URL debería ser como esta slash products, slash products, slash 123, slash products, slash Añadir al carrito, Entonces, simplemente mirando esta URL de API, obtenemos la idea básica relacionada con nuestras API, y por eso, podemos hacer cambios fácilmente y nuestra aplicación mantenerse limpia. Otra regla son diferentes tipos de acciones como leer, agregar, actualizar o eliminar datos. Se deben utilizar métodos específicos del PIB. Ahora podría preguntarse qué son los métodos SGDP. Entonces, como sabemos, SDDP significa protocolo de transferencia de hipertexto, y permite a nuestro front-end solicitar y recibir páginas web y otros recursos de servidores usando API Entonces solo por SGDP somos capaces de enviar y recibir datos del backend usando API Ahora bien, este SDDP tiene cinco métodos principales. Obtener, publicar, poner, parchear y delt. Déjame explicarte esto uno por uno. El primero es el método Get. Utilizamos el método Get cuando solo queremos obtener datos del servidor. Por ejemplo, queremos obtener todos los detalles de los usuarios, o queremos obtener todos los detalles de los productos o queremos obtener detalles de un solo producto. En este caso, definimos nuestra API con el método GT. Para entender estos métodos, utilizaremos analogía de biblioteca El método Get es como pedirle a un bibliotecario que te muestre un libro o varios libros No te preocupes por la implementación. Veremos todos los métodos paso a paso en esta sección. Segundo, tenemos el método post. Utilizamos el método post cuando queremos publicar o enviar algunos datos desde el front-end para crear nuevos datos en nuestro servidor. Por ejemplo, para registrar un nuevo usuario, tenemos que enviar datos de usuario desde el front-end y eso creará un nuevo dato en nuestro servidor. Piensa que es como que le estamos dando nuevo libro a bibliotecario para en el libro en biblioteca A continuación hemos puesto método. Utilizamos el método Put cuando queremos actualizar un dato existente en el servidor con nuevos datos. Por ejemplo, si cambias información de tu perfil en un sitio web y la guardas, entonces se envía una solicitud de put para actualizar tu perfil con los nuevos detalles. Piensa que es como darle al bibliotecario una versión actualizada de un libro para reemplazar al anterior A continuación, tenemos el método de página. Utilizamos el método de página cuando queremos actualizar una pieza de datos pequeños, no datos completos. Ejemplo, si queremos actualizar solo nuestra dirección de correo electrónico en nuestro perfil sin cambiar nada más, entonces se puede usar una solicitud de página. Piensa que es como si le estuviéramos dando al bibliotecario solo las páginas actualizadas de un libro para actualizar en lugar de reemplazar todo el libro Imagínese, aquí tenemos objeto de usuario en nuestro servidor. Quieres actualizar, completar este objeto de usuario, luego qué método usaremos, usamos método put. Y si queremos actualizar solo una contraseña de este usuario, entonces qué método usaremos, usaremos el método patch. Lo estás haciendo muy bien. El método put se utiliza para la actualización de datos completos, y el método de parche se utiliza para poca actualización en los datos existentes. El último método es delete. Y adivina correctamente, usaremos el método delete para eliminar datos del servidor. Por ejemplo, cuando eliminamos una publicación o un comentario en las redes sociales, entonces se envía una solicitud de eliminación para eliminarla del servidor. Y para eso, no creo necesitemos analogía bibliotecaria, ¿verdad Y además, no es práctico. Piensa que es como pedir a las bibliotecas que quiten un libro de la biblioteca. Se puede ver que los métodos SGDB son muy simples. Utilizaremos estos cinco métodos SGDP para definir nuestros diferentes tipos de API Estas son solo algunas reglas que vemos actualmente, pero no te preocupes, aprenderemos todas estas reglas a medida que construimos APIs. Ahora podrías preguntar por qué necesitamos resto API. ¿Por qué necesitamos seguir reglas para construir API? Siguiendo cualquier regla, podemos organizar las cosas, y eso también es cierto para RS API. Las reglas harán que nuestra API sea más organizada. Además, siguiendo las reglas de la API REST, creamos una API simple y fácil de usar porque utilizan métodos SDDP específicos para realizar tipos específicos de trabajo Además, con reglas, podemos crear una API limpia y mantenible, que cualquier desarrollador puede entender y comenzar a trabajar en ellas. Por ahora, no te preocupes por las reglas. Como dije, aprenderás estas reglas mientras creas APIs. Celeste comienza a ganar nuestro primer proyecto JS de nodo. Estoy muy emocionada y sé que tú también. 25. Lista de API de planificación para el proyecto 01: Ahora antes de comenzar cualquier proyecto, es mejor planear aproximadamente sobre el proyecto Ted. Entonces como sabemos, nuestro primer proyecto se trata gestionar la tarea y aquí cómo se ve su front-end. Además, este es el primer proyecto de mi curso React JS, y construiremos este proyecto backend como nuestro primer proyecto backend No te preocupes, no vamos a crear aquí front end porque nuestro enfoque principal está en los NodeJS y construir el mejor backend para Desde el front-end, solo necesitamos llamar a APIs. Ahora podría preguntarse, ¿cómo podemos planificar el proyecto NodeJS? Es muy sencillo. Este es el método que usé para planear mi proyecto Bend, incluso grandes proyectos. En lugar de construir primero el proyecto y luego hacer modificaciones importantes, es mejor dedicar un poco de tiempo a la planificación antes de comenzar nuestro proyecto. Para el proyecto Ben, si creamos la lista de APIs, eso es muy útil porque Bend es casi todo sobre APIs. Para este proyecto, primero, necesitamos la lista de todos, una API para obtener todos. Después de eso, necesitamos crear API para agregar una nueva tarea, y después de eso, podemos actualizar los detalles de una sola tarea, una API para actualizar la tarea, y al final, necesitamos eliminar single to do, otra API para eliminar tarea específica. Actualmente, sabemos que necesitamos estas cuatro API, y crearemos dos, tres API adicionales para la práctica. Si mientras construimos proyecto, necesitamos crear más APIs, entonces crearemos más APIs. No hay nada de malo en eso. Esto es sólo un plan rudo para reducir la confusión. 26. Cómo configurar una nueva aplicación: Ahora vamos a crear una nueva aplicación para nuestro proyecto. Entonces abre la carpeta en la que quieres crear el proyecto, y lo nombro como pista de tareas y simplemente abre esta carpeta en el código VS. Este es el nombre de nuestro proyecto. ¿Suena bien? Espero que lo sea. Si tienes mejor nombre, entonces también puedes usarlo. Depende totalmente de ti. Ahora ¿qué tenemos que hacer para no crear aplicaciones JS? ¿Recuerdas que acabamos de hacer eso en nuestra sección anterior? Sí. Simplemente, abrimos nuestra terminal e inicializamos nuestro proyecto usando NPM en ella para Como usaremos y aquí Verás, obtenemos pgSNFle con alguna configuración predeterminada. Aquí, podemos ver que nuestro archivo principal es index dot js, que es el archivo que se ejecuta cuando iniciamos nuestra aplicación. Vamos a crear index dot js file, y eso es todo. Aquí en este archivo, escribiremos código para nuestro back end. 27. Construir un servidor con Express: Así que en la sección anterior, creamos nuestro servidor utilizando el módulo STTP El problema con el módulo STTP es que tenemos que definir nuestros diferentes endpoints API en estas declaraciones I y LSI, lo cual no es muy claro y tampoco es fácil de mantener para grandes proyectos Entonces es por eso que usamos paquete o módulo muy popular llamado express dot js. Express Dogs es mínimo y flexible para crear mejores aplicaciones de nodo. En palabras simples, al usar express dot js, podemos simplificar nuestras rutas. Podemos manejar fácilmente la solicitud y respuesta de STIP, middlewares y muchas más cosas Déjame mostrarte algo. Aquí está el paquete Express en el sitio web de NPMJS. Se puede ver que sus descargas semanales son casi 37.2 millones, lo que es una locura y casi el 90% de los desarrolladores de proyectos de NODJS utilizan paquete Express Es muy importante Master Express. En primer lugar, instalemos este módulo en nuestro proyecto. Abrir terminal y escribir y pm Instalar Express. En el momento que estoy grabando este curso, su última versión es 5.1 0.0. Quieres obtener la misma experiencia que yo estoy obteniendo, entonces puedes escribir aquí NPM install Express airear 5.1 0.0 y presionar Enter No te preocupes por Express. Es un paquete realmente sencillo. D. Ahora queremos usar este módulo Express en este archivo js de índice. ¿Me puedes decir qué tenemos que hacer? Bien, ingresaremos el módulo express usando require function, express, y esta función requerida devuelve una función. Simplemente lo almacenamos en una variable llamada express. Ahora, para crear una aplicación express, llamamos aquí a esta función express, que devuelve un objeto y lo almacenamos en una variable llamada aplicación o app. Se le puede dar cualquier otro nombre, pero probablemente todos los desarrolladores lo llamaron app. Vamos con la app. Ahora en este objeto app, obtenemos muchos métodos útiles. Por ejemplo, tenemos aquí app dot get app dot post, app dot pot. App dot patch, app dot DLD, etcétera. ¿Recuerdas dónde vemos estos cinco métodos? Son métodos SDDP para crear diferentes tipos de API Si queremos definir nuestra API para el método sddpgt, entonces usamos app dot Si queremos definir el método SDDP delete, entonces usamos app dot DLD Igual que podemos crear post, put y patch request. La manera de definir todos estos cinco métodos es la misma. Aún así, veremos todos los métodos en esta sección uno por uno. Por ahora, comencemos con la solicitud de GAD. En este método GAT, en el primer parámetro, tenemos que escribir nuestro nombre de punto final API. Supongamos que queremos definir G API para URL, SGDP, Columna doble slash, host local, Columna 3,000 slash Ahora, ¿cuál es nuestro punto final en esta URL? Tudos es nuestro punto final de API Eso es lo que tenemos que escribir aquí en el primer parámetro. Asegúrate de que primero le añadamos el corte de Hefward . De lo contrario, esto no funcionará correctamente. Ahora bien, y si queremos definir get API para URL, SDDP columna doble slash localizada columna 3,000, que es la URL raíz de En ese momento, solo podemos adherir slash hacia adelante, que representa el punto final raíz Ahora tenemos que definir qué pasará cuando nuestro front-end envíe solicitudes al punto final. ¿Te acuerdas? Déjame mostrarte. Aquí, pasamos la función de devolución de llamada, y en esto, obtenemos dos objetos, request y response Esta solicitud tiene todos los detalles sobre solicitud de URL y con este objeto de respuesta, podemos enviar detalles relacionados con la respuesta. Ya lo vimos en la lección del módulo STP. Ahora lo que queremos enviar cuando alguien envía solicitud en esta API. Por ahora, simplemente devolvemos un punto de respuesta de texto SEND Task Track project. Cuando alguien envía Get request en este punto final, esta función se ejecutará y luego simplemente devuelve este texto en respuesta, simple como establecido. Por estas dos líneas, se crea nuestro servidor Express, pero tenemos que ejecutar o escuchar este servidor en algún puerto. Si no escuchamos nuestro servidor, entonces nuestra API no funcionará. Aquí al final, escribimos app dot L ISE y simplemente aquí pasamos nuestro número de puerto en el segundo parámetro, volvemos a pasar la función Callback, que se ejecutará cuando nuestro servidor empezara a escuchar en este puerto Aquí podemos simplemente consol punto servidor de registro se está ejecutando o escuchando en este puerto 3,000 Guarda los cambios y ejecutemos nuestro archivo index dot js. Nodo de escritura, índice punto js. C Server está escuchando en el puerto 3,000. Bonito. Ahora volvemos al navegador y ejecutamos Local host Columna 3,000, que es la URL raíz y vemos aquí obtenemos el texto del proyecto de seguimiento de tareas, que enviamos desde nuestro servidor. Puedes ver que Express hace que nuestro código sea realmente simple. Podemos comparar nuestro código actual con el código del módulo SGDP anterior Express lo hace realmente simple. Además, esta es nuestra primera API. Por eso escribimos solo texto en respuesta. Ahora, a medida que avancemos en nuestro proyecto, comenzará una verdadera emoción 28. Ejercicio para crear un servidor Express: Es tiempo de poco ejercicio. Quiero que elimines todo el código del archivo JS de punto índice y vuelvas a crear servidor Express y crear API para root y point. Mediante este ejercicio, se familiarizará con hacer servidor Express. Literalmente, tomará solo 1 minuto. Intenta completar este ejercicio y luego ver la solución. Bien. Espero que resuelvas el ejercicio o trataste de resolverlo. Ahora veamos la solución. En primer lugar, necesitamos módulo Express en nuestro archivo. Requerir Express y almacenarlo en variable llamada Express. Este express es una función, por lo que la llamamos aquí y devolverá nuestro objeto servidor u objeto de aplicación. Así que vamos a almacenarlo en una variable llamada app. Aquí creamos nuestro servidor Express usando estas dos líneas, pero tenemos que escuchar nuestro servidor solo entonces podremos ejecutar nuestra API. Entonces al final, simplemente agregamos app dot Lisen y al primer parámetro, ¿qué pasaremos? Bien, pasamos puerto, que son 3 mil. Y en el segundo parámetro, pasamos la función callback y dentro de ella simplemente consola dot log server se está ejecutando en el puerto 3,000 Una cosa es, escucho servidor antes de agregar API porque muchas veces me olvidé de escuchar servidor, y va a perder mucho tiempo. Siempre escucho el servidor cuanto creo el servidor. Ahora, en el medio, podemos definir nuestra API cualquier cosa. Entonces para Get request, agregamos app dot GAT. Al principio, agregamos nuestra API y punto, y luego en el segundo parámetro, anunciamos la función de devolución de llamada, que tiene dos parámetros, request y response Dentro de esta devolución de llamada, simplemente enviamos texto usando el punto de respuesta SNG Este es un proyecto de seguimiento de tareas. Guarda los cambios, y aquí tenemos que detener nuestra aplicación desde la terminal porque todavía está ejecutando código antiguo. Nuevamente ejecutamos node index dot js file. Ver, servidor esta escuchando, y en nuestro navegador, obtenemos el texto actualizado, muy sencillo. 29. Creación de API para obtener la lista de todos: Ahora vamos a crear API para obtener toda la lista de todos. ¿Me puede decir qué método SDP tenemos que usar? Correcto, para obtener los datos del servidor, utilizamos el método Get DP. Entonces aquí escribimos app dot GT. Y digamos que queremos darle a esta API nombre todos. Entonces pasamos aquí slash todos, y después de eso, en el segundo parámetro, pasamos la función callback, que tiene dos parámetros request y response Ver, para todas las API, esta estructura seguirá siendo la misma. Solo este cambio de método SDP, este cambio de punto final y lógica dentro de esta función web de llamada cambiarán Así es como Express JS hace que nuestro proyecto sea simple y limpio. Ahora, actualmente, no vamos a trabajar con una base de datos porque no queremos agregar complejidad extra para nuestro primer proyecto. Aprenderemos todas estas cosas paso a paso. Así que no te preocupes por la base de datos. Ahora aquí, tenemos que enviar todos los array. En la parte superior, defino un dummidata llamado todos array y simplemente agrego algunos todos en este Aquí, cada tarea es objeto con cuatro propiedades. ID, vamos a citarlo a una tarea, que es un texto de tarea. Vamos a crear todas las APIs para el proyecto uno. Etiquetas, que son las etiquetas relacionadas con tarea, que es una matriz, no solo coma JavaScript. Y estatus para hacer. Estas propiedades, ID, tarea, etiquetas, estado es definido por noches developer, lo que significa que tú como quieres llamarlo, cuántas propiedades necesitas, estas cosas tienes que decidir en función de qué datos queremos almacenar y qué datos no queremos. Ahora vamos a duplicar este objeto dos veces más usando Sift más alter más flecha abajo o Sift más Opción más flecha abajo. Cambiamos este ID a dos tareas para crear EPI para lista de todas las etiquetas a hacer, no Js y estado a hacer Por fin, simplemente cambiamos ID a tres tareas para planificar proyecto uno, JavaScript de texto y estado para hacer. Quiere simplemente devolver esta matriz como respuesta cuando alguien envía una solicitud Gut a API que recorta todos y Point Lo que escribimos aquí, nosotros, escribimos respuesta punto SN y simplemente pasamos nuestra matriz todos. Guarde los cambios y verifiquemos que esta API funciona o no. Abra el terminal, cierre el servidor actual en ejecución usando Control más C, y vuelva a ejecutar este archivo. Ahora en el navegador en el lugar del sitio web raíz, simplemente llamamos slash Todos y Point Ver, aquí obtenemos nuestra matriz. Así de sencillo enviar datos desde el back-end usando G API. 30. Cómo configurar el reinicio automático de nodemon: Actualmente, cuando hacemos algún cambio en nuestro proyecto, tenemos que cerrar nuestro servidor anterior en ejecución y reiniciar nuestra aplicación, lo cual es realmente molesto. Para reiniciar automáticamente nuestra aplicación, tenemos un paquete llamado nodemon Es realmente útil. Abra el terminal y escriba NPM install o IG nodemon. Aquí utilizamos DSG para instalar este paquete Norman globalmente De lo contrario, tenemos que instalar ni luna en cada proyecto de nodo. Además, si estás usando Mac, entonces para instalar paquete global, tienes que escribir sudo al inicio del comando y luego te pedirá la contraseña del sistema Ahora bien, ¿cómo podemos ejecutar el archivo usando el nodo uno? Déjame mostrarte. En el terminal, anteriormente, estamos ejecutando file usando node, index dot js. Ahora para asentir M, escribimos nodemon index dot js. Tan simple como eso. Ver, aquí obtenemos nuestra versión nodo M. O reiniciando, podemos ingresar a RS. También, nos está diciendo viendo Path period, lo que significa raíz de este proyecto. Después de eso, está viendo extensiones como Js, MGs , Cgs, JSON, etcétera. Un archivo que tiene este tipo de extensiones, Nod moon está constantemente vigilando esos archivos, y si algo cambia en esos archivos, reiniciará nuestra aplicación Al final, vea, nodemon también está ejecutando Command node index dot js Al usar nodemon, no tenemos que reiniciar nuestra aplicación Se reiniciará automáticamente cuando cambiemos algo en esos archivos con esas extensiones. 31. Variables del entorno: Ahora actualmente estamos configurando manualmente el pod de nuestro servidor. Pero en el mundo real, ese pod se establece por entorno en el que se está ejecutando nuestra aplicación. Específicamente, es administrado por el proveedor de hosting o plataformas de desarrollo como render, Heroku, AWS, etcétera. Cuando implementamos nuestra aplicación, en estas plataformas, nuestro puerto 3,000 podría ser utilizado ya por otro servidor. En su momento, si codificamos duro nuestro puerto, entonces nuestro servidor no se ejecutará en ese puerto, y nos dará error en el despliegue. Entonces, ¿cuál es la solución aquí? Es realmente simple. Revisaremos una condición. Si en nuestro entorno de aplicación, se define la variable de puerto, entonces usamos esa variable de puerto, lo contrario, usamos nuestro puerto codificado duro. Déjame mostrarte que es realmente sencillo. Entonces aquí, antes de escuchar nuestro servidor, creamos una variable llamada port equals to now here, ¿cómo podemos comprobar que nuestro servidor tiene puerto en su entorno o no? Entonces para eso, tenemos un objeto llamado process dot ENV. Esta ENV es para el medio ambiente. En este entorno, obtenemos todas las variables que se establecen mediante plataformas de alojamiento y puerto para la variable Port. Entonces, si alguna plataforma de hosting quiere establecer un puerto diferente, entonces ellos los almacenarán este proceso punto Env dot port variable Esa es una convención común. Además, todo el nombre de variable de entorno es todo letras mayúsculas, y es por eso que también le damos a esta variable nombre como todo puerto capital. Entonces con solo mirarlo, sabemos que puede ser variable de entorno. Si este proceso dot nw dot port está disponible, entonces no hay problema. Pero si no está disponible o establecido, entonces tenemos que pasar nuestro valor de puerto codificado duro. Nosotros adde u operador, que es par símbolo dos veces, es la clave arriba enter o return Aquí pasamos nuestro puerto, que es de 3 mil. Ahora pasemos esta variable de puerto en el lugar de este puerto codificado duro, y también cambiaremos este mensaje de consola. Hagamos esta cadena como cadena de plantilla usando acti porque en las cadenas de plantilla, podemos acceder fácilmente a la variable y cambiar esta 3,000 con corchetes de coli de dólar, pot Si este puerto de entorno está disponible, entonces lo usamos o si es falso o nulo, entonces usamos este puerto 3,000. Tan simple como eso. Actualmente, en nuestra aplicación, el entorno Port no está configurado. Es por eso que nuestra aplicación se ejecutará continuamente en el puerto 3,000. No te preocupes si estás un poco confundido acerca de este proceso punto ENV, lo veremos en detalle en los próximos proyectos Déjame darte un atajo para configurar la aplicación de nodo. Primero, requiere Express, crear aplicación express, crear esta variable de puerto usando esta expresión y escuchando la aplicación express en el puerto. Estas cuatro cosas permanecerán igual en todas las aplicaciones de nodo. Sí, podemos agregar más funcionalidad en otras líneas, pero nada cambiará en estas cuatro líneas. 32. Parámetros de ruta y parámetros de consulta: Anteriormente, creamos API para obtener la lista de todo lo que hay que hacer en nuestra aplicación. Pero y si necesitamos obtener la información sobre solo single para hacer como hacer con ID uno o ID tres. Para eso, necesitamos pasar ID en URL API. Nuestro APIURL se ve así. Todos ON, lo que significa que queremos buscar uno para hacer información cuyo ID es uno tipo de variable que pasamos en nuestra URL se llama parámetro route. Es muy importante para proporcionar la información específica sobre la solicitud de API como ID, estado, fecha, cualquier cosa. Déjame mostrarte cómo podemos establecer este tipo de URL API y acceder a los parámetros de ruta. Agregamos nuevo punto final de API GAT para reducir todo slash. Ahora aquí para definir el parámetro de ruta, usamos dos puntos y damos nuestro nombre de variable de ruta como ID. Este ID es nuestro parámetro de ruta. Podemos llamarlo como todo ID, pero ID es corto y dulce, así que vamos con ID, y eso es todo. Así es como podemos definir el parámetro de ruta en nuestra URL API. Accedamos a este parámetro de ruta en nuestra lógica API. Nuevamente, nos adherimos a la función callback con dos parámetros, request y response Ahora, dentro de esta función, ¿qué opinas? En qué objeto, obtenemos información sobre nuestro parámetro de ruta, solicitud o respuesta. Ocho. Obtenemos información sobre el parámetro de ruta en solicitud. Así que solicita PAMs de punto. En este objeto perms, obtendremos todos los parámetros de ruta, y podremos acceder a él por ID de punto Ver, aquí también obtenemos sugerencias de auto. Ahora simplemente vamos a enviar este ID en nuestra respuesta punto SND guardar los cambios, y volver a nuestro navegador Dirígete al host local, Columna 3,000 todo slash one S, aquí obtenemos ID uno Estamos obteniendo con éxito el parámetro de ruta. Ahora aquí hay una cosa. También podemos pasar múltiples parámetros de ruta en nuestra API. Por ejemplo, podemos pasar el estado de la tarea todo. Ahora en el back end, agregamos aquí parámetro de ruta. ¿Cómo podemos hacer eso? Derecha. Agregamos slash Clan status, y ¿cómo podemos acceder al parámetro de ruta Derecha. Utilizamos solicitud punto Perms estado punto Déjame mostrarte toda la ruta Perms objeto. Guarde los cambios, y vuelva al navegador, pasamos aquí el valor de estado después de nuestro valor de ID. Asegúrese de que el orden sea el mismo que definimos en nuestra API, lo que significa primero ID y luego estado. Mira aquí obtenemos el objeto params con esas dos propiedades que definimos en API Ahora puede que tengas curiosidad. ¿Y si no pasamos por aquí el estado? Veamos también eso. Quitar el valor de estado y ver, aquí obtenemos no podemos llegar a hacer uno, lo que significa que nuestro servidor no encontró ABI con esta URL. Si definimos parámetros de ruta en nuestra API, entonces asegúrese de que pasaremos todos los parámetros de ruta en el orden correcto. Hay otra forma de pasar datos en URL, que es mediante el uso de parámetros de consulta. Si estás usando sitios web, entonces en URL, podrías ver un signo de interrogación y luego pasar algunos tipos de variables como shot igual a fecha y orden igual a una C para ascendente, etcétera Estos son los parámetros de consulta que se utilizan para pasar datos en URL. Ahora podría preguntarse, ¿cuál es la diferencia entre los parámetros de ruta y los parámetros de consulta? Ésos se utilizan para pasar datos en URL, pero los parámetros de ruta se utilizan para pasar datos que son más requeridos donde los parámetros de consulta se utilizan para pasar datos, que son adicionales u opcionales. En palabras simples, en nuestra API, si front end no pasó los parámetros de ruta, entonces nuestra API nos dará error. Pero si no pasamos parámetros de consulta, entonces nuestra API no nos dará error. Se trata de un detalle adicional. Por ejemplo, si no pasamos todo ID o estado, entonces nos dará error que API no encontró. Pero si no pasamos estas variables después del signo de interrogación, entonces no obtenemos error. Ahora déjame mostrarte cómo podemos acceder a los parámetros de consulta en nuestra API. Para eso, no necesitamos cambiar nada en la URL de la API. Y accede directamente a ellos en nuestra función de devolución de llamada. Para el parámetro query, tenemos otro objeto en request, que es request dot query, y eso es todo. No necesitamos hacer nada en nuestro punto final. Guarda los cambios y echa un vistazo. Ver, aquí obtenemos el objeto de consulta. punto de solicitud se utilizan para los parámetros de ruta, y la consulta de punto de solicitud se utiliza para los parámetros de consulta Los usaremos mucho cuando construyamos API complejas. Son muy útiles. 33. Obtén todo individual por ID: Ahora veamos como podemos regresar single para hacer por su ID. Para eso, lo que usemos parámetro de ruta o parámetro de consulta, usaremos parámetro de ruta porque esa información es la más requerida. Entonces eliminamos este estado de clase de nuestro punto final, no lo necesitamos. En la función Colvey, necesitamos devolver el single to do, cuyo ID es el mismo que nuestro parámetro de ruta ID En primer lugar, vamos a almacenar el parámetro de ruta en una variable separada. Entonces Cs para hacer ID es igual a, ¿cómo podemos acceder a los parámetros de ruta? Solicitamos ID de punto params. Ahora tenemos que encontrar un single para hacer de nuestra matriz todos cuyo ID es el mismo que este para hacer ID. Que usamos un método de matriz JavaScript, que es find. Todos array dot find, y dentro de este método fino, pasamos la función de devolución de llamada, y aquí en el parámetro, obtenemos el single para hacer objeto a Así que este T es este único objeto en la matriz Tds Y regresamos aquí condición si t ID es igual a nuestro ID de todo. Si no conoces este buen método, entonces déjame explicarte en breve porque es puro concepto de JavaScript. Entonces este método fino comprobará nuestra matriz Tudos, y primero, elegirá el primer objeto de la matriz en esta variable T, luego verificamos la condición El ID de punto T es el mismo que donde hacer ID. Si es cierto, entonces este método fino devolverá ese único objeto. Así que almacenamos contras invariables para hacer. A, si no se cumple esta condición, entonces establecerá T como siguiente objeto y luego volverá a verificar la condición. Y así es como podemos encontrar single para hacer usando este método fino. Vamos a enviar esto para hacer en el método de respuesta punto SN. Guarda los cambios y echa un vistazo. Vamos a eliminar estos parámetros de consulta y así valor de estado, y aquí no obtenemos nada. ¿Por qué? Pasamos ID uno, y en nuestra matriz de todo, también tenemos que ver con ID uno. Entonces, ¿qué pasa? Intentemos consolar el sencillo todo. Dio los cambios y actualice la página en el navegador. Ahora en nuestro terminal VSCO, donde estamos ejecutando nuestro servidor, obtenemos nuestras consolas Ver, aquí nos ponemos indefinidos. Entonces no podemos encontrar todo de nuestra matriz de todos, y ese es el error. Puede ocurrir este error porque no estamos comparando los ID correctamente. Intentemos también consolar este tipo de ID de todo usando el tipo de do ID. Esto devolverá el tipo de hacer ID, guardará los cambios y refrescará la página. Volver al código VS y ver, aquí obtenemos undefined para single para hacer, y obtenemos type string qué hacer ID. Es por eso que no estamos consiguiendo single para hacer porque aquí nuestro ID de todo es entero y lo estamos comparando con la cadena. Así que tenemos que convertir esta cadena de ID de Td en entero. Así que podemos envolver esta solicitud punto perms dot ID con parse integer La función de número entero de paso convertirá nuestra cadena en número entero. Guarda los ings y echa un vistazo. Refresca la página y mira, aquí obtenemos el objeto single para hacer con ID uno. Si pasamos aquí ID tres, entonces llegamos aquí para hacer con el ID tres, entonces está funcionando. Bueno. Ahora podrías preguntar en el parámetro route, estamos pasando uno como entero. Pero por qué en la parte de atrás lo consiguen como una cuerda. Entonces la verdad es lo que pase en la URL, se pasa como string. Entonces si queremos pasar algo como entero, entonces tenemos que convertirlo en el back end. No podemos pasar el valor entero usando el parámetro de ruta, y también es cierto para los parámetros de consulta. Así que siempre recuerda cuando definas parámetros de ruta o parámetros de consulta, entonces tienes que convertir su valor usando el método parse integer o parse float. Yo intencionalmente creo este error para mostrarte lo que podría suceder creamos API y Xs ID en el parámetro route. 34. API POST para agregar nuevo todo: Ahora vamos a crear post API para agregar un nuevo objeto para hacer. Como sabemos para crear nuevos datos en el servidor, utilizamos post API. También en postsolicitud, front end enviará datos al servidor. Por ejemplo, aquí creamos post API para agregar un nuevo todo. Por lo que nuestro front-end enviará detalles sobre todos como tarea, etiquetas y estado en el cuerpo de esa solicitud. Fuera de esta información, ¿cómo podemos agregar nuevo todo en nuestra matriz de todos? No te preocupes, déjame mostrarte esto prácticamente. Así que aquí definimos post API usando app dot post, y en el primer argumento, pasamos nuestro punto final. Vamos a pasar slash todos en el segundo argumento, pasamos la función callback con dos parámetros, request y response Ahora podrías preguntar que estos dos puntos finales son los mismos. ¿Cómo podemos usar estas API individualmente? Así que aquí podemos ver esta API utilizó el método Get, y la segunda API se utiliza el método post. Cuando front-end envía solicitud de API en este punto final con el método G, esta función se ejecutará y si el frontend envía la solicitud de API en el mismo punto final con el método post, entonces esta función se ejecutará Veremos como enviar postsolicitud en tan solo un minuto. Ahora, como sabemos desde el front-end, enviamos datos en el cuerpo de la solicitud y ¿cómo podemos obtener información relacionada con la solicitud en esta función? Podemos utilizar este parámetro de solicitud. En esta solicitud, obtendremos toda la información sobre esa solicitud en particular. Aquí tenemos solicitud, y en esta solicitud, tenemos propiedad llamada cuerpo. Este cuerpo tiene todos los datos que el front-end envía con la solicitud, que es nuestro objeto todo, lo almacenamos en la variable llamada todo. Y después de eso, simplemente consol dot log este todo, y también respuesta dot enviar esto para hacer Ahora, probemos, estamos obteniendo datos en nuestra variable todo o no. Anteriormente, estamos enviando simple Get request from the Browser URL porque por defecto browser send Get request to the URL, pero no podemos enviar otro SDDPRquest usando Para eso, necesitamos código front-end podemos usar software de degustación API como Postman, o también podemos usar una extensión de código VS llamada cliente Thunder A partir de estas tres opciones, instalar la extensión VSCode es mucho más fácil Entonces en este curso, lo más probable es que usemos Tender client y Postman ambos porque estamos probando Advanced API, necesitamos Postman Pero no te preocupes, ambas interfaces son iguales. Lo principal es que deberíamos poder probar nuestra API, tan simple como eso. Dirígete a la extensión final desde aquí, y busca cliente Thunder e instala. Ahora en nuestra lista de paneles, se agrega este ícono de cliente de licitación. Así que vamos a abrirlo. Y aquí podemos degustar nuestras APIs para nuestro proyecto. Entonces, antes que nada, ingresamos a nuestra URL API, que es SDDP, columna doble barra diagonal hacia adelante Host local, Columna 3,000 barra diagonal Tu Dos Y qué método necesitamos, necesitamos método post. Entonces seleccionamos post desde aquí, y ahora tenemos que pasar Todo Object en nuestro cuerpo de solicitud. Entonces para eso, seleccionamos aquí cuerpo y en la opción JSON, aquí pasaremos nuestros datos en objeto. El primer campo que necesitamos es tarea. Tenemos que pasar nombre de campo en códigos dobles y también tenemos que pasar valor en códigos dobles. Esta es una tarea nueva. Además, si no puedes ver estos rellenos correctamente, entonces cierra este penal usando Control más B o Comando más B. Después de eso, necesitamos otro campo que es tags, y pasamos aquí array, y en eso pasamos dos valores SGML, y CSS Último estado de llenado y valor, digamos, para hacer. Ahora aquí hay una cosa. Este nombre de relleno, que es esta tarea, estado fiscal, estos nombres los establece el desarrollador backend Cualquiera que sea el nombre definido por el desarrollador de Bend, el desarrollador front-end debe enviar datos con el mismo nombre de campo. De lo contrario, cómo en el back end obtenemos datos del cuerpo de la solicitud Para enviar esta solicitud de publicación, damos clic en el botón Enviar. Verás, no obtuvimos nada, y si revisamos nuestra terminal, entonces también nos ponemos indefinidos. Por qué no estamos obteniendo los datos en nuestro objeto cuerpo punto de solicitud, lo que estamos haciendo mal. Cuando front end envía post request, envía datos en el cuerpo de la solicitud en formato JCN, y eso es lo que también hicimos en nuestra solicitud de prueba Por defecto, el servidor Express no sabe leer y entender automáticamente esos datos JSN Para Express, necesitamos un traductor que convierta esos datos JSN en un simple objeto Javascript porque no podemos trabajar directamente con datos JSN Necesitamos convertirlo en objeto o array, que nuestro Javascript pueda entender. Para eso, tenemos un middleware en Express, que funcionará como traductor Entonces después de la variable todos a, agregamos app dot U, y en eso, llamamos a nuestro middleware express dot JSN y eso es Asegúrate de agregar este middleware antes de nuestras APIs, y también tienes que llamar a este express dot JS y De lo contrario, no va a funcionar. Actualmente, sin este middleware express dot GSN, estamos obteniendo request dot body Ahora vamos a guardar los cambios y otra vez, enviar post solicitud. Ver, ahora obtenemos nuestro cuerpo de punto de solicitud, igual que enviamos este objeto. Entonces esta es la importancia del middleware express dot jSn. Ahora solo tenemos que agregar este nuevo todo en nuestra matriz de todos. Así que usamos aquí método simple array, todos array dot push. Esto agregará nuevos datos en la última posición de la matriz. Y aquí en el método push, pasamos objeto porque todos nuestros todos están en objeto, y tenemos que seguir la misma estructura de objeto para que lo nuevo haga. Entonces, antes que nada, necesitamos identificación y cómo podemos obtener el no lo pasamos desde el front end. Entonces para ID, podemos hacer algo como esto. Obtendremos el último en hacer ID y aumentarlo en uno. Entonces para obtener el último en hacer de la lista, escribimos todos array en paquete cuadrado todos array dot Length, que actualmente es tres. Pero sabemos que el índice de matriz comienza con cero. Entonces tenemos que hacer aquí longitud menos uno. Así que esta matriz Tds entre corchetes, Tds array longitud de punto menos uno es nuestro último en hacer objeto, y queremos acceder a su Entonces agregamos aquí ID y simplemente lo aumentamos en uno. Entonces, si nuestra longitud de flecha es tres, entonces tres menos uno, que es dos, que es el índice del último elemento. Y luego accedemos a su ID y lo aumentamos en uno, que es cuatro, así de simple. A continuación, tenemos tarea llena, y pasamos valor como para hacer lo que obtenemos de request dot body, y para acceder a tarea ad dot task. A continuación, tenemos texto, y pasamos valor todo punto texto. Por último, tenemos estatus, ¿ cuál es qué? Nosotros para hacer estado de punto. Ahora creo que esto podría confundirte. Definimos este objeto Nut por separado. C Nu todo equivale a pasar esto aquí. Y en el método push, simplemente agregamos esta nueva para hacer. Creo que esto se ve más claro. Además, una cosa que quiero decirte en cualquier API al final de la función callback, debemos en respuesta punto sg De lo contrario, en nuestro front-end, nuestra solicitud sigue funcionando, y eso hace que nuestra velocidad general baje. Así que asegúrate en cada API, devolvemos algo. Podrías preguntar, ¿qué debemos devolver de la solicitud de correo? Desde la solicitud de publicación, podemos devolver los datos agregados recientemente en nuestro servidor en la base de datos. Entonces nuestro front-end obtiene toda la información como ID y los usa como quieran. Entonces aquí simplemente devolvemos esta nueva para hacer, guardar los cambios, y echar un vistazo, enviar la solicitud nuevamente y ver ahora estamos obteniendo datos con ID cuatro. Si buscamos todo lo que hacer desde la solicitud Get, C, obtenemos cuatro tus dos Así que creamos exitosamente post request y agregamos nuevos Tudó en nuestra matriz Tudos Recapitulemos rápidamente lo que aprendimos en esta lección. Por lo que usamos post request para crear nuevos datos en el servidor, y obtenemos esos nuevos datos del cuerpo de la postsolicitud enviada por front end. Para probarlo, utilizamos esta extensión de cliente de licitación y enviamos nuestros datos en JCNFMat que es el formato común para el Ahora en el back-end, necesitamos convertir datos en un sencillo formato Javascript, y por eso usamos Express D JCNMDDleWare y lo agregamos Express D JCNMDDleWare y lo agregamos Sin este Express dot jcnmddleware, estamos obteniendo request Después de eso, agregamos los nuevos datos en objeto separado con todo está lleno y luego simplemente lo empujamos en la matriz de Tudou y al final, devolvemos los nuevos datos agregados del punto de respuesta SN Tan simple como eso. Ahora en la siguiente lección, mejoraremos esta solicitud de publicación. 35. Validar los datos de usuario: Actualmente, nuestro front-end está enviando los datos que quieran enviar. Pero, ¿y si alguien no envía los datos requeridos como Tas text o text array o status Sin ellos, no podemos agregar datos incompletos en nuestro almacenamiento. Es malo para nuestra aplicación. Entonces en esa condición, tenemos que agregar validación de datos en nuestra API. Entonces al inicio de nuestra API, comprobaremos que el front-end está pasando todos los datos necesarios o no. Si no está pasando los datos adecuados, entonces detenemos la solicitud inmediatamente con el mensaje de error adecuado. Déjame mostrarte lo que quiero decir. Aquí, después de que estemos obteniendo los datos del cuerpo del punto de solicitud, agregamos condición simple. Si la tarea todo punto no está disponible, entonces devolvemos el error de aquí. Entonces en los corchetes de Cali, escribimos respuesta punto enviar tarea se requiere. Ahora aquí hay una cosa. Incluso si escribimos aquí response dot send, nuestro código restante también funcionará. Para dejar de ejecutar el código desde aquí, tenemos que agregar aquí return. Sin esta devolución, nuestro código restante se ejecutará de todos modos. No olvides agregar devolución. Ahora vamos a duplicar este bloqueo dos veces más usando Sift más alter más flecha abajo o Sift plus opción más flecha abajo. Ahora simplemente cambiamos la condición para que el texto haga texto de punto, y cambiamos el mensaje de error. Se requieren textos. Y por fin, para hacer estado de punto, se requiere estado. Además, aquí podemos verificar más condiciones como el texto debe ser array o el valor de la tarea debería tener más de tres caracteres, etcétera Por ahora, no queremos esa complejidad, así que probemos esta implementación. Guarda los cambios, abre el post gusto, y simplemente eliminamos este relleno de tarea. Enviar la solicitud y ver, aquí estamos recibiendo este mensaje. Se requiere tarea. Hermoso. Ahora front-end, solo necesita mostrar este mensaje de error en el formulario o en cualquier lugar que quieran mostrar. De esta manera, podemos validar manualmente nuestros datos de campos de entrada. Pero estos son sólo tres rellenos. Imagina que tenemos de siete a ocho campos y para cada campo, queremos validar datos. Entonces tenemos que escribir esto si condición siete a ocho veces. ¿Hay alguna otra manera de hacerlo? Sí. Contar con biblioteca especial para validar los datos del usuario El primero es la alegría. Esta es una de las bibliotecas de validación de datos más populares y robustas en el nodo JS, y también usaremos joy para la validación de datos en este curso. Además, hay otra biblioteca como yap y validador dot js Puedes usar cualquiera de esta biblioteca. A mí personalmente me gusta la alegría, y usaremos la alegría en el próximo proyecto. Actualmente, nuestro enfoque principal es crear API de multitud, lo que significa crear, leer, actualizar, eliminar API. 36. Código de paso: Ahora cuando devolvemos un error del servidor, es mejor que también pasemos el código de error con ese mensaje de error. Por ese error o código de estado, nuestro front-end obtiene información sobre el éxito o fracaso de la SDDPRquest Puede que ya sepas de esto, o podrías haber visto este error. Por ejemplo, cuando no encontramos una página web, sabes que alguna página web muestra 404 no encontrada. Este 404 es el código de error o estado para no encontrado. Consulte el código de error o estado más común para SDDPRquest. El primero es 200, lo que significa todo o. Este es el código de estado predeterminado que envió nuestra aplicación expresa. En nuestra solicitud también, puedes ver aquí estamos obteniendo estatus 2000. A continuación, tenemos código 201, lo que significa creado con éxito. Si creamos nuevos datos en nuestro servidor, entonces podemos devolver esos datos que código de estado 201. Se dice en qué método HTTP, podemos devolver el código de estado al 01, escribir? En el post solicitud, si nuestros datos son creados con éxito. A continuación, tenemos el estado 400, lo que significa mejor solicitud hecha por front end. Estos incluyen algunas solicitudes de acceso faltantes o inválidas o no autorizadas. Y sí, para la validación de datos, devolveremos mensaje de error con este código de estado 400. A continuación, tenemos 404, lo que significa no encontrado. Supongamos que estamos enviando get request para conseguir que el single se haga con ID diez. Ahora, eso no está disponible en nuestros datos. Entonces en ese momento, podemos enviar respuesta con código de estado 404. Otro código de estado importante es 500, lo que significa error interno del servidor. Supongamos que obtenemos algún error al crear lo nuevo para hacer en este servidor. Entonces en ese momento, devolveremos respuesta con código de estado 500. Son muchos los códigos de estado, pero por ahora, estos son de lo más útiles. No te preocupes con la práctica, recordarás todos esos códigos de estado. Ahora, para pasar el código de estado con nuestra respuesta, podemos agregar aquí múltiples cursor. Así que presione Alt u Opción y simplemente haga clic donde queremos múltiples cursor. Y aquí agregamos estado de punto, y en este código de estado, queremos pasar por datos no válidos. Pasamos 400 y ya está. Presione SCAP para eliminar múltiples cursor y que podamos pasar código de datos con nuestra solicitud Además, si creamos datos con éxito, entonces devolvemos respuesta con Stas 201. Guarda el queso chan y echa un vistazo. Envíe la solicitud nuevamente y vea, aquí obtenemos el código de estado de error, 400 mala solicitud. Encantadora. 37. res.send y res.json: Hasta ahora, estamos enviando la respuesta usando el método de envío de puntos de respuesta. Pero este método response dot Sen se utiliza para fines generales, lo que significa que en este método response dot SN, podemos enviar cualquier tipo de contenido como texto plano, SDML o también podemos pasar datos JSON Ahora cuando creamos API en nodo, mayoría de las veces queremos devolver datos en el JSNFMat porque es mucho más fácil Aquí en la respuesta, tenemos otro método llamado response dot JSON. Esto convierte automáticamente nuestros datos en el JCNFMat y también establecerá tipo de contenido de encabezado a la aplicación No te preocupes si no conoces el tipo de contenido de encabezado, lo veremos en la siguiente sección. Utilizaremos el envío de puntos de respuesta para respuestas simples, ya sean texto, SDML u objetos, y usaremos response dot JSN cuando queramos asegurarnos de que la respuesta está en formato JSN y correctamente formateada para Ambos funcionan casi igual. Pero para los datos de JSN, punto de respuesta GSN es más conveniente En la primera solicitud de GAD, queremos enviar un texto plano Utilizamos aquí respuesta punto SN. Después de eso, queremos enviar a hacer array, así podremos usar ar response dot JSN siguiente, también, queremos enviar objeto, entonces lo que vamos a usar Usamos response dot JSN vamos a eliminar también esta consola. No necesitamos consolas en nuestro servidor. Es sólo para pruebas. A continuación, aquí estamos devolviendo error. Primero, cambiamos el envío con JSN JSON, y JSN es mejor que pasemos ese error en objeto Envuelva esta cadena en objeto y simplemente agréguela propiedad de mensaje y dos puntos Lo mismo hacemos por este error y también por este último error. Y cuando creamos con éxito un nuevo que hacer, entonces estamos regresando el nuevo objeto para hacer. Entonces también cambiamos la arena con JSON. Asegúrate de no pasar texto plano en el método JN de respuesta. Te dará error. Guarde los cambios, y en las pruebas anteriores, vaya a la sección de encabezado. Aquí obtenemos un montón de detalles, pero por ahora, necesitamos este tipo de contenido. Ver, se establece en texto STML. Ahora enviemos otra solicitud de publicación no válida. Ver, aquí obtenemos objeto que enviamos con propiedad de mensaje, y ahora si comprobamos nuestro tipo de contenido, vemos que está configurado en JSON. Use el envío de puntos de respuesta para texto plano o DML y use el punto de respuesta JSN para enviar datos GSN 38. Actualiza un solo Todo con solicitud PUT: Ahora vamos a crear una API para actualizar nuestro único todo. Supongamos que queremos actualizar el texto de tarea o queremos actualizar el estado. Entonces aquí queremos actualizar pequeños detalles sobre nuestros datos actuales, o también podemos actualizar toda la información. Entonces es mejor que utilicemos aquí put request. Además, puedes usar tu método de página. Está totalmente bien. Así app dot pot 0.2 slash Todos. Ahora aquí necesitamos el ID de todo que queremos actualizar. Agregamos aquí parámetro de ruta, calma ID. Después de eso, agregamos función de devolución de llamada con solicitud y respuesta Ahora, antes que nada, vamos a obtener el parámetro ID. CSid es igual a solicitar ID de parámetros de punto. Sabemos que este ID es string, así que lo envolvemos con función de entero parse. Nuestra primera tarea es que tenemos que encontrar qué elemento de la matriz tiene este ID. Y entonces por ese índice de elemento, podemos cambiar otros valores muy fácilmente. Entonces, para encontrar el índice, usamos todos array dot find index método. Aquí, obtenemos single to do object en esto y luego pasamos condición T ID debe ser igual a nuestro parámetro ID. Esta expresión devuelve el índice del elemento, por lo que lo almacenamos en la variable llamada a hacer index. ¿Y si ID de pase de usuario, que no está disponible en nuestra matriz? En ese momento, este valor de índice de todo se convertirá en menos uno porque este método de índice fino devuelve menos uno si no lo encontró para hacer índice. Aquí pasamos si la condición para hacer índice es igual a menos uno. Después devolvemos el estado del punto de respuesta 404, que no se encuentra y luego punteamos Json y enviamos objeto con mensaje de propiedad y simplemente devolvemos aquí mensaje para no encontrar. Asegúrate de agregar aquí esta devolución. Genial. Supongamos que encontramos un índice de todo, entonces tenemos que actualizar los campos de ese elemento con nuestros nuevos datos pasados con solicitud API. Entonces en la parte superior, primero obtenemos datos de request dot body y almacenamos ese objeto en todo variable. Ahora, en lugar de definir tres variables diferentes, podemos usar aquí la desestructuración de objetos En el lugar de nombre de variable, simplemente podemos agregar corchetes CLI y escribir nuestros nombres de propiedad que pasaron en el cuerpo del punto de solicitud Primero, obtenemos tarea, luego texto y luego estado. Y eso es todo. Esta sola línea de código funciona igual que estas tres líneas de código. Ahora en la actualización, no cada vez que cambiamos de tarea o solo cambiamos datos Podemos cambiar cualquiera de estas tres propiedades, y nuestro front-end debe pasar solo aquellas propiedades en el cuerpo de la solicitud que quieran cambiar. Entonces aquí podemos hacer algo como esto. Si tarea está disponible, entonces hemos actualizado matriz para hacer índice punto tarea es igual a tarea. Entonces, si esta tarea está disponible en la solicitud de cuerpo, solo entonces line actualizará la propiedad de tarea. Duplicemos esta condición dos veces más. Reemplacemos esta tarea con etiquetas, etiquetas y etiquetas. Además, este estado, estado, aquí está el estado, y eso es todo. También, aquí nos falta una cosa. Me puede decir, tenemos que devolver respuesta al final de esta función. Respuesta dot Json y aquí enviamos nuestro objeto actualizado para hacer. Todos array en paquete cuadrado, índice todo. Guarde los cambios, y probemos esta implementación. Así que ve a Thunder Client y crea una nueva solicitud, escribe nuestro endpoint, que es SDDP Local host, Columna 3,000 Todos slash Aquí pasamos todo ID. Digamos uno. Cambia este método Get para poner método y pasemos los datos en el cuerpo de la solicitud. Objeto con tarea de propiedad y valor a esta es la tarea actualizada. Y simplemente enviar la solicitud. Mira, aquí estamos obteniendo los datos actualizados. Y si pasamos aquí ID diez y enviamos la solicitud, entonces obtenemos aquí mensaje de error no encontrado. Se puede ver lo sencillo que es crear un PI. Entonces, si quieres guardar tu prueba, luego presiona Control pluss o Command pluss entonces desde aquí, también podemos renombrar nuestra solicitud de prueba Actualizar 39. Ejercicio: eliminar todo específico: Ahora es el momento de hacer ejercicio interesante. Tienes que crear API para eliminar lo específico a hacer usando su ID. Esto es mucho ejercicio fácil. El ejercicio te ayudará a aprender rápido y también a aumentar tu confianza. Aunque no puedas completar todo el ejercicio, al menos intenta resolverlo porque así es como sabes en qué parte tienes que trabajar más. Pruébalo y luego cuál es la solución. Entonces espero que resuelvas este ejercicio o al menos intentes resolverlo. Ahora veamos rápidamente la solución. Así que aquí definimos una nueva API usando app dot Tilt porque estamos borrando datos aquí, puntos finales para hacer slash Callan ID, solicitud de devolución de llamada, respuesta En primer lugar, obtenemos ID del parámetro route. Entonces Const ID es igual a solicitar punto params dot ID, y simplemente envolverlo con la función parse integer Esta práctica de análisis de enteros es muy útil porque cuando estoy aprendiendo nodo Jaz este error repito mucho Asegúrate de no repetir este error. Aquí también, primero, tenemos que encontrar el índice del objeto todo, que tiene este ID. Entonces desde el método Put, copiamos esta línea variable, y además copiamos esta condición para no encontrado y los orinamos en nuestro método delete Ahora, después de eso, tenemos que simplemente eliminar ese todo específico de nuestra matriz de todos. Así que para eso, utilizamos todos array dot splice method. En esto, tenemos que pasar dos argumentos. Primero, qué índice queremos eliminar, que es esto para hacer index. segundo argumento es cuántos elementos queremos eliminar de este índice. Supongamos que tenemos el valor índice dos, y aquí pasamos tres. Este método de empalme eliminará tres elementos con el índice dos, y también eliminará el elemento con índice tres y cuatro. En nuestro caso, solo queremos eliminar este único elemento, pasamos aquí uno, y al final, simplemente devolvemos respuesta punto Json y aquí pasamos mensaje de éxito, objeto con propiedad de mensaje y valor dos eliminados con éxito. Guarde los cambios, y probemos también esta solicitud de eliminación. Crear una nueva solicitud, cambiar la URL a STP, Columna doble diagonal hacia delante host local, Columna 3,000 slash Studo Vamos a eliminar la tarea Seleccione el método delete. Aquí, no queremos pasar nada en nuestro cuerpo de solicitud, enviar esta solicitud. Ver, aquí obtenemos el mensaje de éxito, lo que significa que nuestra tarea uno se elimina de nuestra matriz a dos. Ahora si volvemos a enviar la solicitud con el mismo ID, vea, aquí no nos encontramos. Y. puede ver que crear APIs no es tanto difícil. Y en esta sección, creamos get, post, put, delete, all crud APIs Entonces espero que entiendas cómo usar Express y crear API elevadas con Express. Ahora en la siguiente sección, aprenderemos algunos conceptos avanzados de Express, vemos en la siguiente sección. 40. Sección 05: introducción al middleware: Bienvenido a la quinta sección del curso definitivo de NodeJS Esta sección trata sobre conceptos avanzados de express y nodo. Comenzamos con middleware, múltiples tipos de middleware, cómo trabajar con diferentes entornos como desarrollo o producción, motores de plantillas y la estructura profesional más completa de la aplicación Empecemos con middleware. ¿Qué es el middleware En express, middleware es una función que o bien llama a la siguiente función de middleware o envía una respuesta para finalizar En palabras simples, cualquiera que sea la función que llame a la siguiente función de middleware o envíe una respuesta para finalizar la solicitud, esa función se llama como Ahora déjeme hacerle una pregunta. Piense en esta función de devolución de llamada que pasamos aquí. ¿Podemos llamar a esta función como middleware? Sí, porque esta función está enviando una respuesta para finalizar esta solicitud de Gad Cuando nuestro front-end envía solicitudes a cualquier punto final de API, esa solicitud pasa a través de un túnel o pipeline en el que se colocan todas nuestras funciones de middleware en orden Esta canalización se denomina tubería de procesamiento de solicitudes. Supongamos aquí definimos middleware uno, middleware dos, y el último middleware tres enviará enviará Ahora cuando el front-end envía la solicitud de API, primero, este middleware se ejecutará una función Después de eso, eso pasará nuestra solicitud al middleware NST dos, y después de completar la ejecución, el middleware dos pasará esta solicitud al middleware tres nuestra solicitud al middleware NST dos, y después de completar la ejecución, el middleware dos pasará esta solicitud al middleware tres, el cual enviará la respuesta. Nuestro servidor mantendrá este orden. Si obtenemos error en middleware uno, entonces otros dos middlewares Tan simple como eso. Aquí hay algunas tareas comunes para middleware En primer lugar, se utiliza para registrar los detalles de la solicitud. Además, se utiliza para verificar que el usuario que envía la solicitud está conectado o no. Este es el caso más común y de mejor uso del middleware. No te preocupes, lo veremos en la sección de autenticación de usuarios. Ahora, la última tarea común para el middleware es pasar los datos entrantes . Ya terminamos. Recuerde, este punto de prensa JCN es una función de middleware, que es pasar los datos entrantes en formato JSON y luego pasar nuestra solicitud a la siguiente función de middleware, que es esta función principal que Ahora podría preguntarse ¿por qué necesitamos estos middlewares? ¿Podemos escribir todo el código en la función única? Para eso, imagina que estamos creando Bend para la aplicación de redes sociales. Tener una API que se utiliza para crear una nueva publicación. Ahora queremos establecer la condición para esta solicitud. Solo los usuarios de iniciar sesión pueden crear una nueva publicación. Si el usuario no ha iniciado sesión, le devolveremos un error, por favor inicie sesión con su cuenta. Ahora tenemos otra API que se utiliza para agregar likes en la publicación única. En esta API, también queremos la misma condición que es que el usuario debe iniciar sesión. Aquí, tenemos que volver a agregar ese mismo código. Ahora en lugar de repetir este código de verificación bloqueado, podemos definirlo en una función de middleware y simplemente agregar ese middleware para todas las De esta manera, no necesitamos repetir nuestro código. A usando middleware, dividimos nuestro código en trozos pequeños, y eso hará que nuestro código sea limpio y más legible Además, por middleware, podemos detener solicitud de usuarios no deseados para acceder a las rutas protegidas Para recapitular rápidamente, middleware es una función que o bien llamada la siguiente función de middleware envía una respuesta a la envía una respuesta Podemos ver que el middleware es muy útil para cualquier aplicación de nodo Entonces, en la siguiente lección, veremos cómo construir middlewares 41. Creación de middleware personalizado: Ahora vamos a crear nuestro propio middleware personalizado. Es realmente emocionante y simple. Entonces aquí en nuestra aplicación, ya agregamos express dot Json Middleware usando app dot U. Ahora, después de eso, agregamos otro método ABDTUuse, y en eso, agregaremos nuestra Por lo tanto, este método ABDTuse se utiliza para agregar middleware globalmente a middleware globalmente a Ahora dentro de este método de uso, pasamos la función de devolución Esta función de Colbec tiene tres parámetros, request response, y next Ahora podrías preguntar, sabemos solicitud y respuesta. Pero, ¿cuál es el siguiente parámetro? Este siguiente parámetro se utiliza para llamar a la siguiente función de middleware Ahora, dentro de esta función callback, escribimos nuestra lógica. Digamos que queremos consola dot log nuestros métodos de solicitud y puntos finales En la cadena de plantilla, agregamos corchetes de dólar C, solicitamos método de punto, cbakets de dólar solicitamos URL de punto Ahora aquí hay una cosa. En cada middlewares personalizados, que definimos, en la última parte, tenemos que llamar a esta siguiente función De lo contrario, nuestra solicitud se quedará atascada en este middleware y el usuario no obtendrá la Déjame mostrarte eso prácticamente. Guarde los cambios y vuelva a nuestro cliente tunder. Permítanme abrir esta solicitud y enviar la solicitud. Oh, lo siento, olvidé ejecutar esta aplicación usando nodemon Asegúrese de que su aplicación también se esté ejecutando en la terminal. Nodemon index dot js, bueno. Ahora enviamos esta solicitud. Ver que se está procesando. Y si abrimos nuestro terminal, C, aquí obtenemos la consola de esa petición, lo que demuestra que se llama a nuestra función de middleware Entonces nuestro pipeline actual de procesamiento de solicitudes es así. Primero, hemos expresado middleware adyacente, luego tenemos middleware personalizado, y luego tenemos la última función de middleware que devuelve la luego tenemos middleware personalizado, y luego tenemos la última función de middleware que devuelve la respuesta. Cuando no llamamos aquí siguiente función de middleware, nuestra solicitud nos pegamos aquí en este middleware y nos muestra el estado de procesamiento, lo que hace que toda nuestra Es por eso que siempre recordamos en cada middleware personalizado, es necesario llamar a siguiente función de middleware o devolvemos Aquí llamamos siguiente función de middleware, guardamos los cambios y echamos un vistazo Ahora, si nuevamente enviamos la solicitud, vea, aquí obtenemos la respuesta y en la consola, también obtenemos el registro de solicitudes. Así de sencillo definir nuestra función de middleware personalizada Sé que esta es una función de middleware muy básica, pero en el futuro, crearemos middleware personalizado que comprueba que nuestro usuario está conectado Además, cuando definimos nuestro middleware usando el método de uso de punto de aplicación, ese middleware se aplicará para todas las llamadas API, igual que este middleware express 42. Construido en Middleware: Express, tenemos muy pocos middlewares construidos. Ya usamos uno de los middleware integrados que es express dot Este middleware pasa nuestros datos del cuerpo de solicitud al formato JSN Sin usar este middleware, no podemos obtener datos en el cuerpo de Dot de solicitud ¿Recuerdas que no tenemos nada en pedido Dot body. Ahora, otro middleware integrado útil es el codificado por URL. Este es el middleware integrado similar como express dot Express dot JSN Middleware utilizado para pasar JSNData y presionar el middleware codificado por URL de punto utilizado para pasar datos codificados por URL JSNData y presionar el middleware codificado por URL de punto utilizado para pasar datos codificados por URL. Este formato de datos codificados por URL se usa generalmente cuando los datos se envían a través formularios SML simples usando el método post En palabras simples, estos dos middlewares se utilizan para extraer datos de la solicitud Cuando enerQuest tiene JCNData, luego Express usa JCN Middleware y cuando nuestra solicitud tiene datos en formato codificado por URL, entonces Express usa este middleware codificado por URL entonces Las funciones de middleware simplifican el proceso de acceso a los datos de solicitud, por lo que no necesitamos analizar manualmente de manera simple como eso Ahora veamos cómo agregar middleware codificado por URL en nuestra aplicación . Es realmente simple. Agregamos aquí app.us y dentro de esto, llamamos función codificada por URL de punto Express Guarda los cambios y veamos que este middleware está funcionando o Vamos a la solicitud de correos. Anteriormente, estamos enviando datos usando este formato JSON. Ahora aquí tenemos otra opción que es la forma codificada. Aquí pasamos datos en par de valores clave como tarea y aquí agregamos nuestro texto. Esta es una nueva tarea codificada. Después de eso, queremos pasar texto, que es array y en eso pasamos SDML y CSS Y por fin, queremos pasar estatus, que es hacer. Ahora simplemente enviemos esta solicitud. Ver, aquí obtenemos nuevos datos creados con estado 201, nuestra URL codificada está funcionando. Pero espera un minuto. Aquí obtenemos esta extraña sintaxis de esta matriz. En realidad, no es array. Nuestro servidor almacena esta matriz como cadena. Ver, está codificado en códigos dobles, lo que significa que es cadena. Por qué sucede esto. Cuando queremos pasar array u objeto en formato codificado de forma, tenemos que agregar ajustes adicionales en nuestro middleware Aquí en el middleware codificado por URL, agregue objeto con propiedad única extendida a true. Guarde esto. Y en el post request, en lugar de pasar esta matriz en un solo campo, tenemos que pasarla en diferentes rellenos. Al igual que nuestro nombre de matriz es tags, entonces escribimos etiquetas, y aquí agregamos corchetes, que indican que es una matriz, y luego pasamos valores en múltiples rellenos. Primero escribimos DML. Después de eso, agregamos otro par de valores clave, nuevamente, etiquetas, paquete cuadrado, y escribimos otro valor CSS. Por fin, pasamos etiquetas, paquete cuadrado y JavaScript. Ahora entiendes por qué los desarrolladores dejan de usar este formato codificado en forma. JSNFMat es mucho más fácil de pasar y probar. Ver, ahora obtenemos nuestro array de texto. Además, veamos si eliminamos la propiedad extendida del middleware todavía está funcionando o no. Yo sólo quiero ver. Oh, no está funcionando. Ver, aquí estamos obteniendo textos son requeridos, lo que significa que no estamos recibiendo textos. En versiones de nodos anteriores, esto podría funcionar. Pero como estamos usando su última versión de nodo, no está funcionando, así que es mejor que se extienda a verdad, simple como eso. Puede que tengas dudas ¿ qué middleware deberíamos agregar en nuestro proyecto JS de nodo Punto expreso JCN o URL Express codificado. En el mundo moderno, el 90% de los desarrolladores utilizan JSNFMat para JSNMDDLEWare es común. Pero si no sabes en qué formato, tu front-end enviará datos de solicitud, JSN o codificados en forma, entonces agregar ambos middlewares es beneficioso 43. Compartir archivos estáticos desde el servidor: Veamos otro middleware integrado que se utiliza para enviar archivos estáticos desde el servidor Si no conoce archivos estáticos, entonces los archivos estáticos son simplemente activos que son necesidades de front-end como archivos SDML, archivos CSS, archivos JavaScript, archivos de texto, imágenes, patas, PDF, etcétera Se llaman estáticos porque nuestro servidor no modifica ni procesa esos archivos antes de enviarlos al cliente. Ejemplo, tenemos el logo de nuestra empresa en el servidor. Enviaremos ese archivo de logotipo a nuestro front-end y el front end se mostrará en el sitio web. Ahora se podría pensar que tenemos un archivo estático en el servidor. ¿Cómo podemos compartirlo? No te preocupes, es realmente sencillo. Déjame mostrarte eso. Aquí usamos app dot ug. Ahora para compartir los archivos estáticos desde el servidor, tenemos que usar otro middleware integrado llamado press dot Dentro de esta función, tenemos que pasar el nombre de la carpeta que queremos compartir. Más comúnmente, los desarrolladores lo llamaron público. Puedes llamarlo como quieras, pero público es una convención común. Podrías preguntar, no tenemos esta carpeta pública en nuestro proyecto, así que tenemos que crearla llamada pública. Asegúrese de escribir el mismo nombre que le da a su carpeta, y también asegúrese de que la carpeta esté disponible en la raíz del proyecto, no en ninguna otra carpeta. Ahora para demo agregaremos aquí cualquier tipo de archivo o imagen. Entonces aquí tengo esta imagen. Descargo esto y lo agrego en mi carpeta pública. Y cambiemos el nombre de este archivo como Fire Watch o como quieras llamarlo. Bueno. Ahora, como establecemos nuestra carpeta pública como estática, podemos acceder a todos los archivos que están disponibles dentro de esta carpeta. Así que abre un navegador, y aquí escribimos nuestra URL base, columna host local 3,000 slash Y después de eso, podemos escribir nuestro nombre de archivo al que queremos acceder, firewach punto P. Si tu extensión de archivo de imagen es PNG o JPG, entonces tienes que escribir la misma extensión de archivo Aquí, no me sale el archivo. ¿Qué pasa? Oh, nos olvidamos de guardar estos cambios. Ahora de nuevo, intente acceder a este archivo. Ver, aquí obtenemos nuestra imagen. Entonces agregaremos todos nuestros archivos estáticos a la carpeta pública y podremos acceder a ellos directamente aquí. Nuestro front-end utilizará esta URL para mostrar imágenes, peones o cualquier cosa Además, en nuestra aplicación, podemos definir una o más de una carpeta estática. Al igual que a algunos desarrolladores les gusta agregar la carpeta Assets, así podemos duplicar este middleware y simplemente reemplazar el nombre de la carpeta por Solo asegúrate de que la carpeta esté disponible en la raíz. Ahora a muchos desarrolladores les gusta agregar prefijo para la ruta de archivo estática. Actualmente estamos accediendo a nuestros archivos estáticos directamente después de la columna host local 3,000. Al agregar prefijo, se verá así. Columna host local 3,000, slash Barra estática firewatcht web P, o columna host local 3,000 OTRs firewatch Déjame mostrarte cómo podemos hacerlo. Para eso, simplemente agregamos nuestro prefijo antes de nuestro middleware expreso estático ATR si los cambios si actualizamos nuestra página, vea, no obtenemos aquí archivo estático Tenemos que agregar Autar en la URL, y ahora obtenemos nuestros archivos estáticos Así es como podemos compartir archivos estáticos desde el servidor. Ahora déjame hacerte un poco de ejercicio. Agrega un archivo estático en la carpeta llamado assets y simplemente accede a ese archivo en el navegador con perfil de prefijo. Sé que puedes hacer eso, así no te estoy mostrando la solución. Es realmente simple. 44. Middleware útil de terceros: Veamos algunos útiles middleware de terceros. Los llamamos middleware de terceros porque es creado por terceros El primero es Morgan. Este middleware es el middleware de terceros más popular para registrar el SDDPRquest para Ahora cuando estaba aprendiendo nodo tiene, tengo esta pregunta. ¿Por qué los desarrolladores quieren registrar la solicitud SDP? ¿Qué obtendrán con el simple registro de la solicitud SDP? Sé que tienes la misma pregunta. Cuando registramos la solicitud SDP usando Morgan, podemos seguir rastreando qué API está llamando más tiempo Qué API está tardando más en responder, cuántas llamadas a la API se llenan, depura la API débil y muchos más beneficios. Por lo general, al registrar la solicitud SDP, los desarrolladores pueden monitorear, depurar y mejorar sus API Ahora veamos cómo podemos registrar la solicitud SDP usando Morgan Aquí hay un paquete Morgan. C, tiene 4 millones de descargas mensuales, lo cual es una locura. Y como sabemos, utilizamos este comando para instalar el paquete Morgan. Así que simplemente copie esto y detenga nuestra aplicación con Control plus C y péguela en nuestro terminal. Bueno. Ahora volvamos a ejecutar nuestra aplicación. Ahora, en nuestra aplicación, creamos este middleware de registro personalizado No lo necesitamos, así podemos comentar este código. Ahora para usar Morgan, primero, tenemos que importarlo en nuestra aplicación. Entonces en la cima, Morgan consed iguala a exigir a Morgan. Y en la parte inferior, agregamos app dot U, y dentro de esto, llamamos a esta función Morgan. Dentro de esta función Morgan, podemos pasar formato predefinido de solicitud de registro. Por ejemplo, tenemos Dev para desarrollo combinado para más detalles, comunes, diminutos, etcétera Si quieres ver todos los detalles, entonces puedes consultar esta página del paquete. Aquí, obtienes toda la información sobre formatos. Ahora, en nuestro código, simplemente agregamos aquí códigos dobles. Ver, aquí recibimos sugerencias. Combinado, común Dov corto, diminuto por ahora, vamos por Dev Guarda los cambios y echa un vistazo Ahora golpea cualquier API en el terminal. C, aquí obtenemos los detalles de la solicitud. Primero, obtenemos el método SDDP, luego el punto final, luego el estado, tiempo de respuesta y el tamaño de la respuesta Con estos datos, podemos mejorar nuestras APIs. Si volvemos a enviar la solicitud, vea, obtenemos nuevo registro. Entonces así es como Morgan nos ayudará. Ahora el próximo middleware de terceros es el casco. Es otro middleware popular, y todos sabemos lo que hace el casco en nuestra vida habitual Protege nuestra cabeza de accidentes, y eso es lo que también hace el middleware de casco Es una excelente opción para mejorar la seguridad de nuestra app con una configuración mínima. Y también, es de uso común en ambiente de producción. Muchas aplicaciones de nodo utilizan este middleware. Entonces buscamos aquí casco. Aquí conseguimos este paquete. Vamos a instalar este paquete. Abrir terminal, detener la aplicación, pegar el comando aquí. Y si quieres instalar la misma versión que estoy usando, entonces puedes agregar aquí versión también y presionar Enter. Capucha. Volvamos a ejecutar nuestra aplicación. Ahora para usar este paquete, primero, lo importamos en la parte superior. Entonces casco Const, equivale a dos requieren casco. Y en la parte inferior, antes de nuestro otro middleware, agregamos app dot g y simplemente llamamos aquí casco Middleware. Y eso es todo. Esto agregará automáticamente encabezados seguros que asegurarán nuestra aplicación Express. También, quiero aclarar una cosa. Cuando agregamos middleware en nuestra aplicación, Express los agrega en el mismo orden que agregamos en nuestro código Por ejemplo, actualmente Express, agregue middleware de casco primero en la canalización de procesamiento de solicitudes, luego JSON, luego codificado URA, luego estático y luego Morgan El orden también es importante para el middleware. 45. Cómo codificar según el entorno: Ahora veamos cómo podemos codificar según nuestro entorno de aplicación. Por ejemplo, actualmente nuestra aplicación está en proceso de desarrollo, y cuando implementemos nuestra aplicación, será en el entorno de producción. Ahora, cuando nuestra aplicación está en etapa de desarrollo, sólo entonces queremos habilitar el middleware Morgan para nuestra Entonces, antes que nada, necesitamos conocer el entorno actual. Y sí, sabemos que de la misma manera tratamos de conocer puerto. Entonces simplemente podemos consultar el proceso de registro de puntos ENV, y aquí accedemos al dólar Cully Brackets, progreso punto env punto nodo subrayado ENV Este nodo subrayado ENV es el nombre de la variable, igual que este puerto Veamos qué tenemos aquí. Guarda los cambios, y aquí nos ponemos indefinidos. ¿Por qué? Porque inicialmente nuestro entorno no es desarrollo STS. Ahora, en Express, tenemos otra forma de conocer el entorno actual, que es mediante el uso de la app dot gat. Y dentro de este intestino, tenemos que pasar ENV por medio ambiente. Esta app dot gt ENV devolverá el mismo resultado que este proceso dot nw dot node underscore environment Pero cuando no configuramos entorno de subrayado de nodo, en ese momento, esta app dot gt ENV devolverá por defecto el desarrollo, lo cual es genial, lo cual es genial, Déjame mostrarte. Así consola dot log app ENV Dólar corchetes, app dot Obtener ENV. Guarda a los Gengs y mira, aquí tenemos desarrollo Pero aún así, nuestro proceso punto ENV no está definido. Ahora solo queremos agregar este middleware Morgan si estamos en el entorno de desarrollo Entonces podemos codificar así. Aquí agregamos I condición, app dot Obtener ENV También puedes usar process dot NV, pero luego tienes que cambiar la condición de acuerdo a eso. Ahora equivale al desarrollo. Es cierto, sólo entonces agregamos este middleware. Los movemos dentro de este blog If. Ahora para indicar, agregamos aquí otro registro de puntos de consola, agregó Morgan. Bueno. Guarde los genes, y en la terminal, vea, aquí conseguimos que Morgan agregó. Ahora cambiemos nuestro entorno a producción para ver que Morgan está sumando o no. En primer lugar, dejamos de ejecutar nuestra aplicación. Para establecer la variable de entorno, escribimos, dólar ENV, columna, nodo, subrayado ENV es igual a en códigos, pasamos producción Si eres usuario de Mac o Linux, entonces tienes que escribir aquí export, space, node, underscore ENV es igual a producción Asegúrese de escribir el nombre y el valor correctos de la variable de entorno . Golpea Enter. Ahora volvamos a ejecutar nuestra aplicación nodemon index dot js. Mira, aquí no conseguimos que se agregue Morgan. Así es como cambiamos nuestro entorno de aplicación y código de acuerdo a eso. Volvamos a cambiar el ambiente al desarrollo. Entonces dólar ENV, nodo colon, subrayado EN V es igual al desarrollo O para Mac o Linux, export, node, underscore ENV es igual al desarrollo Y si volvemos a revisar nuestra aplicación, mira, aquí obtenemos Morgan agregado. 46. archivo env y paquete dotenv: Hasta ahora estamos configurando variables de entorno usando ENV dólar o comando export en la terminal Pero hay otra forma sencilla de definir esas variables usando el archivo ENV punto En este archivo NV, simplemente podemos agregar nuestras todas las variables de entorno como port is equal to 3,000 or node underscore ENV to development O también podemos definir aquí la URL de nuestra base de datos. Y muchos desarrolladores utilizan este enfoque para definir variables en lugar de definirlas en la terminal. Este archivo ENV mantiene a nuestras aplicaciones información confidencial como credenciales fuera de nuestro código, lo cual es una buena práctica de seguridad Ahora bien, este archivo ENV es un archivo de texto simple. Podemos cargar su variable en nuestra aplicación de nodo, para que podamos usarlas y codificarlas de acuerdo a eso. Para utilizar estas variables de entorno en la aplicación de nodo, tenemos paquete llamado punto ENV No te preocupes por una sola línea de código, podemos usar estas variables de entorno. Vamos a instalar este paquete. NPM instalar punto ENV. Bueno. Ahora bien, en nuestro índice punto sile en la parte superior, solo tenemos que agregar una línea requieren punto NV, y luego aquí llamamos método punto config, y eso es todo No necesitamos hacer otra cosa. Y también, lo bueno de este enfoque es que podemos acceder a ellos mismo usando process dot nw dot PorD y process dot nw dot node underscore Vamos a ejecutar esta aplicación. Bueno. Ver, actualmente estamos en el entorno de desarrollo, y es por eso que conseguimos que Morgan se agregue. Ahora, para mostrarles, cambio el puerto a 8 mil. No utilices el puerto 5,000 en MAG porque ya está funcionando en tu sistema, y cambiamos ENV a producción Guarda esto, y ahora tenemos que reiniciar manualmente nuestra aplicación porque Norman solo reinicia nuestra aplicación cuando los archivos con estas extensiones cambiarán. Verás, nuestro puerto se cambia a 8,000, pero ¿qué es esto? Nuestra ENV es la misma que antes, que es desarrollo. Pero en el archivo ENV, lo colocamos a la producción. ¿Puedes adivinar? Es porque en la última lección, codificamos nuestro nodo subrayando valor ENV usando ENV dólar o palabra clave de exportación Entonces nuestra aplicación, recuerda esos ajustes. Así que siempre recordemos cuando tenemos el archivo punto ENV y también establecemos nuestra variable de entorno usando terminal, nuestra aplicación de nodo le da más prioridad al valor del terminal Para resolver este problema, simplemente podemos eliminar ese valor de subrayado de nodo ENV Así que escribe, quítala, ruta, ENV, colon, nodo, subrayado O si eres usuario de Mac o Linux, entonces escribe unset, space, node, underscore ENV y presiona Enter Ahora reinicia la aplicación. Ver, aquí tenemos la producción. Y si en el archivo ENV, cambiamos ENV a desarrollo, guardamos los cambios, reiniciamos nuestra aplicación usando nod Ver, aquí obtenemos el desarrollo porque obtenemos Morgan agregado. 47. Diferentes configuraciones para diferentes ENV: Actualmente estamos cambiando manualmente nuestras variables de entorno porque son solo dos. Pero en el mundo real, podríamos tener más de dos variables de entorno. Al igual que tenemos diferentes URL de base de datos en el desarrollo y diferentes URL en la producción. Del mismo modo, podríamos tener clave secreta para la autenticación, etcétera Ahora cuando tenemos estas muchas variables de entorno, es difícil cambiar las variables manualmente. Ahora bien, ¿cómo podemos resolver esto? Para resolver este problema, podemos crear dos archivos ENV separados dot nw dot development y dot nw dot Production Incluso puedes crear punto nw dot Testing. En estos dos archivos, definiremos nuestras diferentes variables de entorno. Después de eso, en nuestro index dot js, podemos simplemente poner condición si nuestro entorno de nodo es desarrollo, entonces cargamos el archivo de desarrollo punto nw punto. Y si nuestro ambiente es degustación, entonces cargamos este archivo dot NV dot tasting. Tan simple como eso. Déjame mostrarte esto prácticamente. Aquí creamos un nuevo archivo llamado dot nw dot Development. Este archivo, definimos diversas variables de entorno. El primero es puerto es igual a 3,000. K es igual a hacer subrayados secretos. También podemos agregar el subrayado de nodo ENV es igual al desarrollo, y eso es todo. Ahora vamos a crear un archivo más llamado dot nw dot production. Y dentro de esto, agregamos Pd es igual a 8,000 K es igual a pro qi y al último nodo y un cuadrado E y V es igual a producción. Guarde esto, y ahora en el punto índice s, solo necesitamos agregar condición. Entonces en la parte superior, aquí, primero creamos una variable llamada archivo ENV igual a, y aquí para usar operadores ternarios, pasamos condición si proceso punto nw punto nodo subrayado NV es igual Si es cierto, entonces nuestro archivo ENV debería puntear nv dot production Establecimos el archivo de desarrollo punto nw punto como nuestro archivo de entorno. Ahora, simplemente en este método config, tenemos que pasar el objeto con la ruta de propiedad al archivo ENV Estado muy sencillo. Y aquí para mostrar otra variable NV, aquí usamos consol dot log, process dot nw dot Comprobemos que está funcionando o no. Actualmente, estamos consiguiendo que Morgan se agregue. Ahora detengamos nuestra aplicación. Dólar ENV, colon, nodo, guión bajo ENV es igual a Si eres usuario de Mac o Linux, entonces tienes que usar export, node, underscore, EN V es igual a producción Ahora comencemos nuestra aplicación. Ver, aquí estamos en el entorno de producción porque Morgan no se agrega, y aquí obtenemos Pro key y nuestro puerto también se cambia a 8,000 para que al usar diferentes archivos ENV, podamos definir diferentes variables de entorno 48. Motores de plantillas en la aplicación de nodos: Veamos el motor de plantillas en nodo. Este tema es un poco viejo y no se usa comúnmente en el mundo moderno. Entonces, vamos a entender qué es el motor de plantillas. Básicamente, el motor de plantillas es una herramienta que nos permite crear páginas SDML dinámicas Entonces, en lugar de escribir STML manualmente para cada página, podemos crear una plantilla, y mediante el uso del motor, podemos insertar datos automáticamente en esa plantilla Después envíe el archivo SGML generado al navegador del cliente. Supongamos que queremos crear un sitio web de blog de estilo antiguo donde todos los blogs tengan el mismo diseño, pero solo su contenido sea diferente. Ahora no queremos crear manualmente un archivo SGML para cada entrada de blog Eso sería lento e ineficiente. En su lugar, podemos usar un motor de plantillas para crear una sola plantilla para nuestro diseño de blog, y el motor de plantillas mostrará dinámicamente el contenido del blog en función los datos que proporcionamos de manera simple como eso. Hay muchos motores de plantilla en ningún Jaz, pero el más popular es PUG y otro es Esto funciona igual. Sólo su sintaxis es diferente. Déjame mostrarte sobre PUG. Entonces en nuestro terminal, escribimos NPM install PUGor si te gusta instalar mismo verson, luego escribimos en el rojo tres punto cero punto tres Bueno. Ahora en nuestro archivo JS de punto índice, tenemos que configurar el motor de vista, que es el motor de plantillas a PUG Así que escribimos aquí app dot set. Aquí, queremos configurar el motor, por lo que escribimos motor de vista. Y en el segundo parámetro, simplemente pasamos PUG. Así que en esta línea nos fijamos PRG como nuestro motor de vista o plantilla. Ahora tenemos que crear una plantilla nuestra página SDML en POG. Entonces en nuestra aplicación, creamos una carpeta llamada views. Asegúrate de escribir el mismo nombre que las vistas. Y dentro de estos, podemos crear un archivo llamado template dot POG Puedes tomar cualquier nombre de archivo. Realmente no importa. Aquí, tenemos que escribir código en sintaxis Perg, que es muy similar a nuestro SDML Aquí empezamos con HTML. Observe que aquí no estoy usando corchetes angulares para etiquetas. Dentro del SDML, podemos tener cabeza, así que la escribimos como esta estructura de árbol Dentro de la cabeza, podemos agregar título aquí queremos obtener valor de título dinámicamente. Escribimos nuestro nombre de etiqueta es igual, y aquí escribimos nuestro nombre de variable que pasamos en el tiempo de ejecución. Título. No te preocupes, te voy a mostrar todo. Ahora, después de la cabeza, sabemos que podemos agregar body tag, así nos movemos en la misma línea paralela que head y addre body En PRG, no tenemos que cerrar la etiqueta. Ahora en el cuerpo, podemos agregar H una etiqueta igual a encabezado y después de eso, agregamos el párrafo igual al contenido Plantilla sencilla para blog. Se puede ver que esta es una sintaxis muy limpia que la SDML normal. muchos desarrolladores les gusta, pero a muchos no les gusta. Guarde este archivo y veamos cómo podemos renderizar página SDML y pasar estas variables dinámicamente Anteriormente, definimos una API para ruta raíz simple en la que simplemente devolvemos respuesta punto Enviar. Este es un proyecto de seguimiento de tareas. Ahora en el lugar del texto simple, rendericemos nuestra plantilla Perg Aquí en el lugar de respuesta punto Enviar, escribimos respuesta punto Render. Y esta función toma dos argumentos. primero es el nombre del archivo o plantilla que queremos renderizar. En este caso, es template, y el segundo argumento es el objeto con las variables y su valor que definimos en esa plantilla. Entonces, antes que nada, título para, digamos, blog uno. Después de eso, tenemos rumbo al motor de plantillas, y contenido para facilitar pug muy bueno, no lo sé Guarda los cambios, y en el navegador, vamos al host local Columna 3,000. Error de conexión podría olvidarnos de iniciar el nodo de aplicación un punto de índice js. Oh, actualmente se encuentra en el ambiente de producción. Pongámoslo en ambiente de desarrollo. Así que ENV dólar puede nodo subrayado ENV es igual a O si eres usuario de Mac o Linux, entonces puedes usar export, node underscore ENV es igual al desarrollo Asegúrate de no pasar aquí los códigos, y luego iniciamos la aplicación. Ver, está escuchando en 3,000 y si actualizamos nuestra página, vea, aquí obtenemos la plantilla Perg El título es el blog uno. Encabezado y contenido también es lo mismo que pasamos. Así es como podemos renderizar un archivo SDML en el servidor y luego enviarlo al navegador del cliente No creo que las empresas modernas estén utilizando esta manera porque la mayoría de las empresas utilizan Rag, angular o view para front end 49. Limpieza de la estructura de aplicación de código: Actualmente, si vemos nuestro archivo JS de punto índice, se siente que realmente arruinamos nuestro código Todo se ve muy desordenado y no se puede conservar. Así que vamos a estructurar nuestra aplicación de nodo, que se utiliza en el mundo real. Entonces, actualmente, agregamos todas las API relacionadas para hacer en el archivo JS de punto de índice único. Imagínese en otra aplicación de comercio electrónico, tenemos otro conjunto de API para usuarios. Tenemos otro conjunto de APIs para funciones relacionadas con tarjetas. En ese momento, no podemos agregar todas esas API en el mismo archivo js de punto índice. La solución es que podemos crear una carpeta separada llamada routes, y en eso, agregaremos archivos para cada conjunto de APIs. Creamos una nueva carpeta llamada rutas. Esta es una práctica común para la estructura de aplicaciones. Ahora aquí, creamos un nuevo archivo llamado todos dot js, en el que definiremos todas las rutas API relacionadas con todos. En primer lugar, cortemos todas las rutas del archivo JS del punto índice. Y pégalo en el archivo todos dot js. Ahora podrías preguntar en el archivo js index dot en la parte superior, tenemos instancia de app y usando eso, definimos diferentes rutas API. Pero aquí, en el archivo JS todos dot, no tenemos esa instancia de app. Entonces, ¿cómo podemos definir rutas aquí? Se podría decir que podemos recrear la instancia de la app, pero eso no es posible. No va a funcionar. Así que en el express, tenemos otra instancia llamada router mediante la cual podemos definir API y puntos al igual que somos APIs usando instancia de app. Aquí, primero ingresamos express const Express es igual a requerir Express Ahora en este expreso, tenemos otro método llamado Router, que devolverá la instancia del router, y por eso la almacenamos en variable llamada router. Ahora, simplemente reemplacemos esta instancia de aplicación por esta instancia de enrutador. Así que selecciona esta app y presiona Control plus D o Command plus D, que seleccionará todas las instancias de app y la reemplazará con router. Bueno. Ahora hemos definido nuestras rutas en el archivo diferente. Pero cómo sabrá nuestro archivo index dot js, estas rutas las queremos agregar en nuestra aplicación. Para ello, tenemos que exportar esta instancia de router desde este archivo y la agregamos en el archivo index dot js. Tan simple como eso. Entonces, ¿recuerdas cómo podemos exportar variables desde el archivo nodo? Derecha, utilizamos el módulo dot export es igual al router. Guarde este archivo, y en el archivo index dot js, eliminemos estos bloques. No los necesitamos, y agregamos aquí app dot g para agregar esas rutas en nuestra aplicación. Aquí en la primera posición, agregamos el prefijo del router, igual que este archivo estático. La mayoría de las veces, a los desarrolladores les gusta agregar aquí la API de slash. Después de eso, en el segundo argumento, pasamos nuestra instancia de enrutador desde el archivo todos dot js. Entonces en la parte superior, importamos ese router usando la función require. Y aquí pasamos nuestra ruta de archivo, que es slash out todos. Ahora, como sabemos, esta función require devolverá la instancia del router, así podremos almacenarla en la variable llamada todas las rutas. Y en la parte inferior, aquí, pasamos rutas Tudous. Y hecho. Además, encontré que necesitamos esta matriz Tudous en el archivo Tudos Entonces lo cortamos de aquí y lo pegamos en nuestro archivo Tudous. Guarde los cambios, y comprobemos que nuestra aplicación está funcionando bien o no. Recuerde, para que todos hagan rutas, necesitamos agregar el prefijo API antes de los endpoints. Enviar la solicitud. Verás, está funcionando. Ahora, un último cambio que quiero hacer es en nuestro TudsRoute, podemos ver que estamos agregando Tudos antes de cada Así que comúnmente podemos pasar ese slash todos en el prefijo en el archivo index dogs Guarde estos. Ahora en el archivo todos dot js, podemos eliminar slash todos del endpoint Además, eliminamos todos para todos los endpoints de API. Guarda esto y estamos bien para irnos. También podemos eliminar estas líneas no deseadas. No los necesitamos. Ver, ahora nuestro archivo index dot js se ve limpio y más mantenible Seguiremos esta estructura de aplicación durante el resto de nuestro curso. Entonces aquí se acabó nuestra Sección cinco. Rápidamente podrás ver el resumen PDF y recapitular toda la sección en dos a 3 minutos y te veré en la siguiente sección 50. Sección 06: asíncrona vs. síncrona: Bienvenido a la sección seis del curso ultimate not JS. Esta es la sección represora para algunos temas de AdvanceVascript como sincrónico versus asíncrono, función de devolución de llamada, promesas de infierno de devolución de llamada y espera algunos temas de AdvanceVascript como sincrónico versus asíncrono, función de devolución de llamada, promesas de infierno de devolución de llamada y espera asíncrona. Muchos desarrolladores están confundidos en estos temas, así que es mejor que lo entendamos. Entonces, si ya estás confundido en estos temas y quieres dominar el nodo js, entonces en próximas secciones, te enfrentarás a muchos problemas. Es mejor aprender estos temas, que podemos llamar como JavaScript asincrónico antes de sumergirnos realmente en las aplicaciones de nodo En todas las aplicaciones de nodo, utilizamos mucho estos temas. Aprendamos estos temas. Son simples y fáciles de aprender. Además, si ya tienes confianza en estos temas, entonces puedes saltarte esta sección. Depende totalmente de ti. Ahora antes de comenzar a aprender conceptos de JavaScript asíncrono, entendamos la diferencia entre asíncrono y sincrónico Nos ayudará a entender mejor. ¿Qué es sincrónico? Programación sincrónica significa que nuestro código se ejecuta línea por línea. Cada línea debe ser completada antes de pasar a la siguiente línea. En palabras simples, la programación sincrónica es como seguir una receta paso a paso. Cada paso debe completarse antes de pasar al siguiente. Si un paso lleva mucho tiempo, tenemos que esperar hasta que termine la ejecución, y luego podemos continuar. Por ejemplo, estamos preparando un pastel para la fiesta de cumpleaños. Ahora hay proceso paso a paso para digamos, primero mezclamos los ingredientes, luego lo ponemos en horno para hornear, y finalmente, decoramos el pastel. Aquí, tenemos que seguir los pasos línea por línea. No podemos comenzar directamente a decorar el pastel sin hornear. Tenemos que ir en el paso uno, paso dos y el paso tres. Ese es el ejemplo sincrónico. El código sincrónico también se llama código de bloqueo. Déjame mostrarte el comportamiento de bloqueo o ejemplo de código de bloqueo en JavaScript. Entonces, para practicar estos temas, creamos una nueva carpeta en la carpeta projects llamada JavaScript asincrónico y abrimos esta carpeta en el código VS Ahora dentro de esta carpeta, creamos un simple archivo JavaScript llamado index dot js. Bueno. Ahora aquí escribimos tres líneas de consola. Así consola dot log. Paso uno, empieza. Otra consola dot log. Paso dos, y último, consol dot log. Paso tres, y vamos a ejecutar este código. Entonces en terminal, escribimos nodo, perros índice. Verás, estamos obteniendo la salida línea por línea. Primero, obtenemos el paso uno, luego el paso dos, y luego el paso tres. Ahora se podría decir, no podemos ver el comportamiento de bloqueo de este código. ¿Cómo podemos verlo prácticamente? Actualmente, estamos obteniendo esta salida sin bloqueo debido a que ni una sola línea tarda más tiempo en ejecutarse, cada línea se ejecuta inmediatamente. Agreguemos pequeño bloque en este código. Aquí, después de Consola uno, creamos una función llamada fetch data En esta función, vamos a pretender que estamos recuperando datos de la base de Como podríamos saber, la obtención de datos de la base de datos puede llevar tiempo como de dos a 3 segundos o más que eso Por ahora, solo agregamos algo de retraso usando cuatro bucles vacíos, lo que puede tardar algún tiempo en ejecutarse. Aquí, que yo es igual a cero, yo menos de uno y nueve veces cero y yo más más. Simplemente, no queremos hacer nada en este bucle de otoño, así que abre cierra las llaves. Ahora bien, esta línea puede tardar uno o 2 segundos en ejecutarse y después de eso, movemos nuestra consola paso dos arriba y aquí mismo, los datos recuperados Aquí antes de nuestro paso tres, llamamos a esta función de datos fah ¿Puedes adivinar lo que obtenemos en la salida? A ver. Guarde los cambios y ejecutemos este archivo. Ver, después del paso uno, nuestro código se detiene un poco para que nuestra función se ejecute. Después de eso, obtenemos datos y luego el paso tres. Aquí, por un poco, podemos ver el comportamiento de bloqueo de nuestro código JavaScript, que se llama código JavaScript síncrono. Ahora podrías adivinar lo que es asincrónico. En asincrónico también, nuestro código corre línea por línea. Pero para seguir adelante, no necesitamos esperar para terminar esa tarea. Podemos iniciar una tarea, y si lleva más tiempo, entonces podemos pasar a la siguiente línea. En palabras simples, la programación asincrónica es como hacer múltiples cosas a vez y no esperar a que cada línea termine de ejecutarse antes de comenzar la siguiente Puedes iniciar una tarea, y mientras esperas a que se complete, puedes hacer otra cosa. Por ejemplo, estás preparando un barril y también viendo este curso Entonces pones el pastel en el horno para hornear, pero este horneado puede tardar de diez a 15 minutos de tiempo. Entonces en ese momento, puedes hacer otras cosas en lugar de solo esperar a que el pastel se hornee. Entonces empiezas a ver este curso. Y si te gusta este curso, entonces en ese momento, puedes compartir este curso con tus amigos. Del mismo modo, si definimos nuestro código de suma usando JavaScript asíncrono, si esa línea tarda más tiempo en ejecutarse, entonces nuestro código JavaScript no esperará ahí Correrá hacia adelante en el código y cuando esa línea termine su ejecución, entonces ejecutará esa línea. Podemos hacer múltiples cosas en JavaScript asincrónico sin solo esperar una línea para terminar su tarea. Esta es la diferencia fundamental entre JavaScript síncrono y asíncrono. Por defecto, nuestro código JavaScript es sincrónico, pero Javascript proporciona algunos métodos mediante los cuales podemos hacer que nuestro código sea asincrónico para realizar tipos específicos de trabajo También, como sabemos, nodo es popular porque puede aplicar naturaleza asincrónica Ahora déjame mostrarte cómo podemos convertir nuestro código sincrónico o bloqueo en código asincrónico o no bloqueante Aquí en el lugar de este bucle de cuatro que está manteniendo nuestro código ocupado, podemos agregar otro método para agregar delay. Agregamos tiempo de espera establecido. Este método toma dos argumentos. La primera es la función y la segunda es un tiempo de retardo. Por ejemplo, pasamos aquí 10,000 milisegundos, que son 10 segundos. Ahora en primer lugar, simplemente pasamos función y dentro de ella, movemos este paso a la consola de datos recuperados Después de 10 segundos, esta función consolará data fest. Ahora bien, ¿puedes adivinar la salida de este código? A ver. Ver, primero obtenemos el paso uno. Después de eso, en segundo plano o función se está ejecutando, pero eso no detuvo nuestro código ahí. Nuestro código continúa ejecutando el paso tres, y cuando esos 10 segundos terminen, obtenemos los datos del paso dos pies. Entonces este es el código no bloqueante o asíncrono. Código síncrono, espere a que una línea complete la ejecución y código asíncrono, espere esa línea en segundo plano y continúe trabajando hacia adelante Podrías preguntar, cuál es el mejor sincrónico o asincrónico En mi opinión, ambos son útiles. Nadie es mejor. Ambos tienen un propósito diferente. Sincrónico es genial cuando necesitamos tarea para ejecutar en un orden específico o cuando la tarea es rápida y sin bloqueo. Proporciona simplicidad y previsibilidad. Nosotros asíncronos es importante para tareas que llevan tiempo, como manejo de archivos, acceso a bases o solicitud de red, donde no queremos bloquear el hilo principal de nuestro servidor En la aplicación de nodo, usaremos JavaScript asíncrono queremos realizar operaciones sin bloqueo como realizar consultas de base de datos, llamadas API, leer y escribir archivos sin congelar el hilo principal Lo principal es que nuestra aplicación debe funcionar de manera no bloqueante, lo que brindará a nuestros usuarios una experiencia rápida y excelente. Entonces como sabemos, por defecto, nuestro código JavaScript es sincrónico. Pero JavaScript proporciona algunos métodos mediante los cuales podemos hacer que nuestro código sea asincrónico para hacer tipos específicos de El primero es mediante el uso de la función de devolución de llamada. Otro método es usar promesas. En esta sección, aprenderemos profundamente sobre estos métodos. 51. Devoluciones de llamada en Javascript: Ahora vamos a entender callback en JavaScript. Entonces, ¿qué es la función de devolución de llamada? Una función de devolución de llamada es una función que se pasa como argumento a otra función y se ejecuta después de completar una tarea específica Déjame explicarte la devolución de llamada usando escenario del mundo real. Supongamos que está ordenando sándwich en la tienda de sándwiches con su teléfono, así llama a Sandwich Shop y da su pedido. Te dicen que tardará 20 minutos en prepararse y entregar. Entonces colgaste la llamada y haces otras cosas en lugar de solo esperar el sándwich. Ahora, cuando el sándwich se prepara, el repartidor toca tu timbre y te da ese sándwich simple Entonces en este caso, llamas a la tienda de sándwiches y dar tu pedido es como iniciar una tarea asincrónica Después de eso, te dicen que tardará 20 minutos. Este es el retraso en la tarea asíncrona. Entonces colgaste y haces otras cosas en lugar de solo esperar el sándwich. Este es el comportamiento de no bloqueo, lo que significa que nuestro código sigue avanzando. Cuando Sandwich se prepara, lo que significa que nuestra tarea asincrónica está terminada, el repartidor toca tu timbre y te da ese Esta es la función de devolución de llamada que se ejecuta cuando se completa la tarea asíncrona Entonces una función de devolución de llamada se pasa como argumento a otra función, y también se ejecuta después de completar una tarea específica En palabras simples, lo que queramos hacer después de que se complete la tarea asincrónica, eso pasaremos en la función callback Ahora bien, si estás trabajando o aprendiendo Javascript desde hace mucho tiempo, entonces apuesta conmigo, ya usaste la función de devolución de llamada en tu código Simplemente no sabes que la función se llama ColWCFunction Por ejemplo, ¿recuerdas en la función de tiempo de espera establecido en la primera posición, pasamos la función que se ejecutó después de algún retraso Y tienes razón, esta función que pasamos como argumento se llama función callback Igual que pasamos devolución de llamada en la función de intervalo establecido Déjame darte otro ejemplo. Yo casi todos los métodos de matriz, pasamos funciones de devolución Al igual que en el método de forraje, mapa, método de filtro En todos estos métodos, pasamos la función de devolución Además, en nuestro proyecto anterior, pasamos la función de devolución de llamada en la app dot get app dot post, app dot pot, delete, y en todos los métodos Recuerde, esos también se llaman como funciones de devolución de llamada. Ahora para la comprensión básica, vamos a crear una función y pasarla como función de devolución de llamada porque en nodo, necesitamos pasar mucho la función de devolución de Así que vamos a eliminar este código. Si quieres ver el código anterior al final de esta lección, obtendrás la carpeta Recursos Zip. Descárgalo y descomprímalo. En la carpeta de recursos, obtendrás enlaces de Gita para todos los códigos sección por sección Para que puedas obtener referencia a partir de eso. Entonces, antes que nada, escribimos consola dot log. Inicio. Ahora creamos aquí la función llamada fetch student en la que vamos a pretender que estamos recuperando datos de la base de datos Entonces, para simular el retraso para la obtención de datos, agregamos aquí de nuevo, establecemos la función de tiempo de espera. Y en la primera posición, ¿qué pasamos? Correcto, no solo función, pasamos la función de devolución Así que estamos pasando aquí función usando la sintaxis de la función de flecha. La función de flecha es otra forma de definir la función, y es mucho más limpia para las funciones de devolución Ahora en el segundo argumento, pasamos milisegundos, digamos 3 mil Y aquí en el tiempo de espera establecido, consultamos registro de puntos obteniendo estudiantes de la base de datos Ahora llamemos a esta función fetch student aquí después de la línea de la consola Para hacerlo más realista, también pasamos aquí la identificación de estudiante, que es la identificación del estudiante que queremos obtener. Digamos uno. Ahora cuando completemos la búsqueda de datos, después de 3 segundos, queremos devolver los datos de ese estudiante Por lo que devolvemos objeto estudiante con identificación. Aquí obtenemos ID como parámetro y simplemente pasamos ese mismo ID aquí. También nuestro alumno tiene nombre a Harley, y digamos que queremos su número de inscripción, supongamos 500. Estamos fingiendo que estamos obteniendo este objeto estudiantil de la base de datos Ahora cuando llamamos a esta función, aquí obtenemos los datos del alumno, así que simplemente podemos almacenarlos en la variable llamada student. Para verificar, simplemente const dot log, estudiante y pasar aquí este alumno Al final, simplemente consul dot log, y ahora, ¿puedes adivinar qué vamos a obtener en la salida ¿Obtendremos los datos del alumno o no? A ver. Nodo índice punto js. Mira, aquí obtenemos inicio, estudiante indefinido, y luego estamos obteniendo datos de la base de datos. Déjame explicarte por qué. Cuando llamamos a esta función bien stud con ID uno, en primer lugar, se ejecuta el tiempo de espera establecido, que ejecutará esta pieza de código después de 3 segundos. Ahora, en su momento, no obtenemos nada de la función. Por eso se situó valor indefinido en la variable estudiante. Nuestro código JavaScript siguió ejecutándose. Es por esto que conseguimos que el estudiante desdefina entonces y luego después de 3 segundos, la función de tiempo de espera establecido consolará esta línea de datos de obtención Ahora la cosa es, ¿cómo podemos ejecutar este código y obtener los datos de los estudiantes? ¿Cuál es la solución aquí? Para resolver esto, usamos función de devolución de llamada y lo haremos en la siguiente lección 52. Resolución de problemas mediante Callback: Entonces en la lección anterior, obtenemos el error estudiante indefinido. Ahora, vamos a resolver este problema usando la función de devolución de llamada. En primer lugar, no necesitamos almacenar el resultado en la variable estudiante. Ahora, para resolver este tema, vamos a hacer poco cambio en la función estudiantil de la Fed. Entonces después del ID, pasamos su función de devolución de llamada como parámetro Y en el lugar de retorno el objeto alumno de la función, llamaremos a esta función o devolveremos la llamada a esta función y simplemente pasaremos objeto estudiante en ella. Sé que es un poco confuso. Mira esta lección y entenderás muy bien las devoluciones Ahora, como estamos accediendo a la función callback como parámetro, tenemos que pasar esa función como segundo argumento cuando estamos llamando a la función fair student Entonces aquí pasamos función, y dentro de esta función, podemos simplemente mover esta consola estudiante. Ahora de donde sacamos este objeto estudiantil. Correcto, aquí obtenemos el objeto student en parámetro porque cuando estamos llamando a esta función callback en la función fast student, estamos pasando objeto student aquí, y ese objeto student, accedemos directamente aquí en este parámetro callback Veamos que esto está funcionando o no. Así nodo índice punto Js. Verás, primero empezamos y luego después de 3 segundos, obtenemos la obtención de datos de la base de datos y luego usando la función de devolución de llamada imprimimos este objeto estudiante, y eso es exactamente lo que queremos Aquí está nuestro código anterior y actual. En el lugar de devolver los datos de la función fat student, llamamos a otra función para registro de puntos de consola, los datos del estudiante. Esta línea de consola solo se ejecutará cuando esta función de devolución de llamada llame Mediante esta técnica de función de devolución de llamada, hacemos que nuestro código sea asíncrono o Ahora para dejar esto claro en el lugar de esta función, utilizamos la sintaxis de la función de flecha. Eliminamos la palabra clave function y entre los paréntesis y los corchetes GLY, agregamos flecha Verás, ahora nuestro código se ve simple y esta manera es muy útil en nodo porque como notas, siempre pasamos función de devolución de llamada así En lugar de declararlo por separado, aquí definimos directamente Se puede ver mediante el uso del método de función de devolución de llamada, podemos manejar tarea asíncrona Anteriormente, usamos esta notación Colbec para definir rutas API Entonces esa es la función de devolución de llamada. La función de devolución de llamada es solo un nombre de la función que pasamos como argumento a otra función, y se ejecuta después de completar tarea, específicamente tarea asíncrona Tan simple como eso. Ahora agreguemos poca dificultad en esto. Supongamos que a partir de este número de matrícula de estudiante, queremos obtener sus detalles de resultado Después de esta función fetch student, creamos una nueva función llamada Get result Parámetro, agregamos el número de inscripción porque usando eso, obtendremos el resultado de la base de Ahora, dentro de esta función, simplemente devolvemos objeto con propiedades, ID de resultado al número de inscripción, que obtenemos en el parámetro, y después de eso, porcentaje a, digamos, 70. Ahora como sabemos, nuevamente estamos recuperando el resultado de la base de datos, lo que significa que nuevamente tomará tiempo, y por eso esta función es cantante sobre nosotros. Entonces para simular el retraso, aquí agregamos la función set timeout y dentro de ella la función callback, y nuevamente, esperamos 3,000 milisegundos Ahora bien, en esta función de tiempo de espera establecida, movemos este retorno, y como sabemos este retorno no tiene sentido Tenemos que pasar este resultado a función de devolución de llamada. Como hicimos aquí. Así función de devolución de llamada y simplemente envolver este objeto resultado con paréntesis de función de devolución Además, antes de eso, podemos consultar resultado de búsqueda de log de punto de la base de Bueno. Ahora, donde llamamos a esta función de resultado Gad, piénsalo Sí, podemos llamar a la función Gad result en esta función callback porque obtenemos la inscripción en el objeto student, y también podemos llamarlo aquí en la función fetch Pero como esa función se trata de obtener los datos, y por eso no queremos mezclar las cosas Entonces llamamos a la función de resultado Ga en la función de devolución El primer argumento, pasamos el número de matrícula, que es estudiante punto E underScenum Y lo que pasemos en el segundo argumento, vamos a pasar la función callback aquí Ahora, aquí en el parámetro, obtenemos el objeto resultado que pasamos aquí, y simplemente consola punto log resultado a resultado. Además, tenemos que obtener esta devolución de llamada desde el parámetro. Salva a las pandillas y vamos a ejecutar este marcador. Aquí, primero obtenemos los datos del alumno, y luego después de 3 segundos, obtenemos resultado de ese alumno. Entonces déjame mostrarte rápidamente lo que está pasando aquí. Entonces, antes que nada, la consola de inicio funciona, y luego llamamos a este otoño función estudiante. Pero debido a esta función de tiempo de espera establecida, no se ejecutará de inmediato Entonces nuestro código avanza y simplemente consolar este fin. Ahora, después de 3 segundos, el tiempo de espera establecido ejecutará el código que está disponible dentro de ocho Entonces llamamos a la función Callback y simplemente pasamos Object. De donde obtenemos esta función de devolución de llamada. Bien, lo obtenemos del parámetro, y donde definimos esa función de devolución de llamada, es aquí en la función fat student, y es por eso que primero obtenemos los detalles del estudiante Ahora, después de obtener los datos del alumno, llamamos a otra función, que es resultado G. Entonces esta función de resultado G se ejecutará, y debido al tiempo de espera establecido, nuevamente toma 3 segundos para ejecutarse Y dentro de esto, llamamos a otra función de devolución de llamada, y donde definimos esa función de devolución de llamada, sí, aquí, y por fin, esa función de devolución de llamada consola este resultado, y esto es lo Si sin función de devolución de llamada, queremos ejecutar nuestro código en el mismo orden, entonces podemos hacer eso Obtenemos estudiante indefinido y por eso, ni siquiera podemos obtener resultado. Entonces ahora entiendes por qué pongo tanto peso en la función de devolución Porque si te confundes en la función de devolución de llamada, ¿cómo puedes enfocarte en el nodo de aprendizaje 53. Infierno de devolución de llamadas: Actualmente en este código, agregamos esta función de devolución de llamada dentro de otra función de devolución de llamada. Ahora imagina si tenemos otra tarea asincrónica, digamos resultado de actualización Dentro de esto, pasamos el ID de resultado del punto del resultado, y la función Callback se ejecutará después de que nuestro resultado se actualice Obtenemos aquí resultado actualizado. Puedes ver que nuestro código se ve desordenado y difícil de leer porque aquí tenemos muchas funciones de devolución de llamada anidadas una dentro Déjame quitar estas todas las consolas para que podamos ver claramente ver, aquí obtenemos callbacks anidadas Esta situación se llama como callback hell, donde tenemos muchas funciones de devolución de llamada anidadas dentro de la otra y eso hace que el código sea difícil de leer y administrar Si tenemos el mismo código en sincrónico, entonces se ve así. Primero, llamamos función estudiante justa y almacenamos sus datos en variable estudiante. Igual que llamamos función Obtener resultado y aprobar el número de matrícula de ese estudiante. Por fin, llamamos a función de estudiante actualizada y aprobamos ID de resultado, que queremos actualizar. Se puede ver que el código sincrónico es muy sencillo y fácil de leer y administrar. Ahora podrías preguntar, ¿cuál es el problema con el infierno de devolución Ver, incluso si tenemos devolución de llamada, nuestro código funcionará. El problema es que solo es difícil leer y administrar porque en el mundo real, podríamos tener más de tres callbacks anidados Entonces a la vez, será muy difícil de leer, administrar e incluso escalar. Entonces necesitamos que nuestro código sea fácil de leer. Es realmente simple. Sólo tenemos que hacer nuestra función anónima, que es la función que no tiene nombre. Convierta estas funciones de devolución de llamada anónimas en funciones nombradas En palabras simples, en el lugar de definir aquí esta función de devolución de llamada, definiremos por separado y pasaremos ese nombre de función aquí Vamos a agregar nuestras consolas nuevo bien y eliminar esta última función. Acabamos de agregarlo para devolución de llamada de demostración. Aquí creamos una función llamada costo, imprimir estudiante. Podemos llamarlo de cualquier manera, y estoy usando aquí las funciones de flecha en el texto porque es fácil para la función de devolución Ahora podemos cortar esta función Callback desde aquí y pegarla en el lugar de esta función de flecha Bueno y en el lugar de esa función de devolución de llamada, simplemente pasamos la función de estudiante de impresión Asegúrate de no llamar a la función de estudiante de impresión aquí. Solo tenemos que pasar la función como parámetro, y esta función print student se ejecutará aquí como la función callback Ahora, vamos a convertir rápidamente esta función de devolución de llamada anónima en función nombrada Así que el resultado de impresión Contras es igual a, y aquí simplemente pegamos esta función de devolución Y en el lugar de esto, pasamos resultado de impresión. Ver, ahora nuestro código se ve limpio y fácil de mantener. Para recapitular rápidamente, cuando tenemos funciones de devolución de llamada anidadas, obtenemos el problema de curación de devolución de llamada, que es difícil de leer y administrar ¿Cuál es la solución? Bien, convertimos nuestras funciones de devolución de llamada anónimas en funciones nombradas. Tan simple como eso. 54. Promesa en JavaScript: En la lección anterior, vemos cómo manejar tareas asíncronas usando funciones de devolución de llamada Pero en esa implementación, obtenemos este problema de hel de devolución de llamada, y también resolvemos ese problema con la función nombrada Ahora mi pregunta es, ¿cuántas funciones nuevas creamos? Imagina que tenemos diez funciones de devolución de llamada anidadas, entonces tenemos que crear diez funciones nombradas antes de llamar a nuestra función principal ¿Hay alguna otra forma de manejar la tarea asincrónica? Sí, hay otra manera que es mediante el uso de promise. ¿Qué es promesa? Una promesa es un objeto especial que es capaz de mantener el resultado de una operación asíncrona En otras palabras, promise es promesa darle el resultado de la operación asíncrona, o si falla la operación asincrónica, entonces devolverá entonces Por ahora aprendemos promesas en el nuevo archivo llamado promises dot js. Y luego actualizamos nuestro código anterior con la implementación de Promesas. Entonces primero, creamos promesa, y luego veremos cómo consumir esa promesa. Es realmente simple. Entonces, para crear promesa, escribimos nueva palabra clave y luego prometemos. Ahora bien, esta promesa es una clase y toma un argumento que es función con dos parámetros. Entonces aquí, el primer parámetro es resolver y el segundo parámetro es la función de rechazo y flecha. Ahora dentro de esta función, podemos realizar nuestra tarea asincrónica Entonces aquí, de nuevo, estamos asumiendo que estamos obteniendo datos de la base de datos. Así que escribimos aquí, establecer la función de tiempo de espera y pasar la función de devolución de llamada y 3,000 milisegundos Ahora imagina aquí obtenemos nuestros datos de la base de datos. Entonces creamos una variable llamada student equals to object, digamos, id a one y name to Hurley Ahora aquí llamamos a resolver porque conseguimos con éxito los datos y pasamos aquí a este alumno. Aquí, nuestra promesa está lista. Ahora hagamos esta promesa invariable llamada PR por promesa Bueno. Ahora veamos cómo podemos consumir esta promesa. Es realmente sencillo escribimos PR, que es esta promesa, punto, y aquí tenemos dos métodos principales, entonces y catch. Entonces cuando creamos promesa, es por defecto en estado pendiente. Y si completamos la tarea asíncrona, entonces la promesa está en estado resuelto o cumplido Y si hay un error, entonces prometer en estado rechazado. Esto se llama un ciclo de vida de promesa. Aquí, nuestra promesa se cumple porque llamamos aquí función de resolución. Entonces cuando se cumple promesa, entonces obtenemos nuestros datos este entonces método. Ahora almacenamos nuestros datos en este parámetro de resultado y luego simplemente consultamos dot log este resultado. Entonces esto vamos a ejecutar este archivo. Nodo promete punto gs, ver, después de 3 segundos, obtenemos este resultado. Ahora imagina aquí por alguna razón, no obtenemos datos de la base de datos. Aquí creamos una variable llamada status, y la hacemos falsa. Aquí agregamos condición. Si el estado y mi sistema se apagan automáticamente, déjame iniciarlo de nuevo. Sí, estoy de vuelta, así que continuemos. I status es cierto, entonces ejecutamos esta función de resolver, lo contrario simplemente llamamos aquí función de rechazo. Ahora para una mejor práctica, cada vez que queremos devolver error, creamos un nuevo error y pasamos nuestro mensaje de error aquí. Este es un mensaje de error. Guarde los cambios, y vamos a ejecutar estas promesas punto js archivo. Verás, obtenemos este error aquí. Ahora vamos a consumir este error, igual que obtenemos aquí los datos en el método then. Después de este método entonces, agregamos otro método llamado caché y dentro de este también, pasamos la función de devolución Aquí obtenemos error en parámetro y consultamos punto log este error. Guarde esto y volvamos a ejecutar este archivo. Verás, obtenemos ese error aquí, y así es como podemos consumir promise usando el método then y catch. Podemos ver en lugar de usar la función de devolución de llamada para hacer algo después de la tarea asíncrona, podemos usar promise para realizar esa tarea asincrónica y luego simplemente consumir luego En resumen, si nuestra promesa se resuelve, entonces este método entonces se ejecutará, y si nuestra promesa es rechazada, entonces este método de caché se ejecutará, simple como eso. Si te preocupa la creación de la promesa, entonces no te preocupes con la práctica, te sentirás cómodo con ella. Déjame decirte una cosa. En el mundo real, 99% de tiempo, solo consumimos promesas. Sólo unas pocas veces necesitamos crear una promesa. Ahora en la siguiente lección, manejaremos nuestro código de recuperación de devolución de llamada usando promesas. Será divertido. 55. Reemplazo de devoluciones de llamadas por promesas: Manejemos nuestro código Callback L usando promesas. Puedes descargar el código de Callback hel desde abajo de esta lección Este código lo escribimos en la lección cuatro. Copia el código y pegarlo en otro archivo callbacltjs o también en la carpeta de recursos y dentro de la carpeta asíncrona, obtendrás este archivo como También puedes agregar eso en tu proyecto. Ahora, como sabemos, en promesa, definimos nuestra tarea asincrónica Y aquí tenemos las dos tareas asíncronas en dos funciones separadas Ahora en lugar de eliminar estas funciones, simplemente podemos devolver una nueva promesa de esta función. No te confundas. Déjame mostrarte a lo que me refiero. Entonces aquí, en la función estudiantil sentida, simplemente regresamos aquí una nueva promesa. Ahora bien, lo que pasamos en esta promesa, pasamos aquí la función, que tiene dos parámetros, resolver y rechazar. Ahora en esta función, lo que hacemos bien, realizamos aquí una tarea sincrónica. Así que movemos esta función de tiempo de espera establecido aquí usando mantener alterado u opción y chies aro Ahora aquí no necesitamos esta devolución de llamada. En el lugar de devolución de llamada, pasamos nuestros datos en la función resolve, y además no necesitamos callback en el parámetro Ahora hagamos lo mismo en esta función de resultado de Gad. Entonces devolvemos promesa, y pasamos aquí función con dos parámetros, resolver y rechazar. Si no quieres escribir toda esta línea, entonces déjame mostrarte un atajo para eso. Entonces aquí escribimos nueva promesa sin espacio, y seleccionamos esta sugerencia. Mira, aquí tenemos nuestra nueva promesa. No muestro esto previamente porque quiero que te pongas cómodo con las promesas. Ahora vamos a mover este código asíncrono también en la función y en el lugar de callba, devolvemos esos datos en método resolve y desde arriba, eliminamos Ahora vamos a consumir esta promesa. En la parte superior, comentamos este código anterior en el que experimentamos el infierno de devolución Ahora aquí, primero llamamos función de estudiante justa y pasie ID uno Esta expresión devolverá esta promesa. Almacenemos esa promesa en una variable llamada PR. Aquí tenemos nuestra promesa en esta variable PR. Ahora sólo tenemos que consumir esta promesa. Parte. Que método usamos aquí, usamos punto entonces método. Aquí pasamos función. Aquí, obtenemos parámetros, datos, o podemos llamarlo estudiante cualquier cosa, función de flecha, y lo que queremos hacer si tenemos datos de estudiantes. Simplemente queremos llamar a Get result function y pasar aquí estudiante dot Inscripción porque aquí tenemos propiedad de inscripción. Asegúrate de escribir la misma propiedad que has hecho y has hecho. Entonces así es como consumimos primera promesa. Además, en lugar de almacenar esta promesa en variable, aquí podemos escribir directamente esta expresión. Te confundes en esto, entonces no te preocupes, puedes almacenar promesa en variable y luego consumirla. Esta es la práctica común, y por eso te muestro aquí. Ahora, como sabemos esta función de resultado gat también devolverá promesa. ¿Cómo podemos consumir esta promesa? Es realmente simple. El lugar de escribir diez método aquí, podemos escribirlo después de nuestro primer método diez. Ahora lo que obtenemos de esta promesa, resultado, función de flecha, y simplemente resultado de registro de puntos de consola a este resultado. Guarde los cambios y ejecutemos nuestro archivo Callback Hel. Nodo callback hell dot gs. Bueno. Ver, primero, va a buscar los datos de los estudiantes Después de eso, recuperamos el resultado y luego imprimimos el resultado. Entonces podemos ver usando estas promesas, nuestro código se ve más limpio y fácil de leer. Ahora bien, si tenemos otra función en CallBal entonces similar a esta, volvemos aquí, esa nueva función y la llamamos Ahora cuando llamamos a esa función y la devolvemos, podemos agregar aquí otro método que no sea, simple como eso. Algunos estudiantes pueden confundirse acerca de esta llamada a la función get result. Preguntan ¿qué está pasando aquí? Explique este código en detalle. Entonces aquí, de nuevo, llamo a esta función de buscar estudiante y simplemente pasar aquí y consumir esa promesa usando entonces método Y aquí obtenemos datos de estudiantes. Cuando obtenemos datos del estudiante, podemos pasar la función de flecha normal con corchetes C. Ahora dentro de estos corchetes CL no tenemos ningún código. Solo queremos regresar Obtener función de resultado con matrícula de punto de estudiante. Entonces porque solo queremos devolver esta línea, podemos eliminar estos corchetes C y también podemos eliminar la palabra clave return. Esta es la manera corta de devolver algo de la función de flecha. Entonces, cuando queremos devolver una línea de la función arrow, entonces escribimos directamente después de arrow. Aquí estamos regresando esta función. Toda esta expresión está devolviendo una nueva promesa. Así podemos almacenarlo en nueva variable llamada nueva PR. Ahora vamos a consumir esta promesa también. Escribimos newpar dot the y luego obtenemos resultado, función de flecha, y simplemente consola dot log, resultado e imprimimos aquí este resultado Ahora bien, en el lugar de esta nueva PR, ¿podemos escribir toda esta expresión? Claro. En el lugar de las nuevas relaciones públicas, pegamos esta expresión. Y eso es lo que hicimos aquí. Ahora, como una mejor práctica, cuando tenemos promesa esa promesa también puede devolver error usando el método de rechazo. Entonces es mejor manejar ese error. Para eso, tenemos otro método, que es el cache. Esto también lo vemos en la lección anterior. Así que aquí también agregamos método de caché. Aquí obtenemos error objeto y simplemente consolatog este Ahora para probar, simplemente agregamos rechazar en la función de resultado gat antes del método de resolución, y pasamos aquí nuevo error, y mensaje de error, resultado no encontrado. Guarda los cambios y echa un vistazo. Volvamos a ejecutar esta aplicación. Se trata de parchear datos. Ver, aquí obtenemos resultado no encontrado. Si obtenemos error en alguna de estas promesas, se ejecutará este método de boceto. Tan simple como eso. Permítanme comentar este método de rechazo. Es solo para pruebas. Espero que todas sus dudas sean claras. Ahora en la siguiente lección, veremos otra forma más fácil de escribir este mismo código. 56. Asíncrono:await en Javascript: Ahora como podemos ver en el Calbecl después de esta función get result, estamos consumiendo otra promesa Ahora imagínese en este Colbecl después de esta función de obtener resultado, estamos consumiendo otra promesa Para eso, tenemos que agregar otro que no sea método, y eso también puede resultar un poco confuso. Hagamos que este código sea más simple usando asincrónico y wait. ¿Qué es awight asíncrono? Awight asíncrono es una forma de escribir asíncrono como código síncrono. Al usar awight asincrónico, podemos consumir promesas de manera mucho más fácil Entonces antes que nada, llamamos aquí función de estudiante justa y simplemente pasamos aquí ID uno. Ahora bien, esta función devolverá una promesa que inicialmente se encuentra en el estado pendiente porque en esa promesa, estamos realizando una tarea asincrónica Así que podemos esperar aquí a que esa promesa se resuelva usando la palabra clave Awight Entonces awight pausa la ejecución del código hasta que se resuelva la promesa Una vez resuelta la promesa , devuelve los datos. Ahora cuando obtengamos datos, podemos almacenarlos en variable const student Ahora tenemos objeto estudiante, así podemos llamar Obtener resultado y pasar aquí estudiante punto Inscripción. Esta función también devolverá promesa, por lo que nuevamente nos adherimos a la palabra clave Award para esa promesa, obtener resolución y esto también devolverá datos. Resultado const. Después de eso, simplemente escribimos CLO Parkansa log con nombre de propiedad, resultado, y presionamos Ascap Ahora puedes ver usando una palabra clave weight, podemos escribir código asíncrono que parece código síncrono Permítanme comentar este código anterior. Guarde esto, y volvamos a ejecutar este código. Nodo, puntos callbhll. Ver, aquí obtenemos empezar a buscar datos de la base de datos, y luego obtenemos resultado, y al final, obtenemos Entonces nuestro código está funcionando como sincrónico porque nuestro código está bloqueando aquí este fin. Ahora como una mejor práctica y para hacer que este código sea asincrónico, tenemos que usar siempre esta función esperar dentro asincrónica porque en función normal, no va a Así que aquí creamos una función llamada print result. Y simplemente mueve este código dentro de esta función. Ahora podrías preguntar que esta es la función simple, pero un peso solo es válido en la función ASN Entonces, ¿cómo podemos hacer que nuestra función simple sea una función acing? Es realmente simple. Solo tenemos que agregar la palabra clave ASN antes de la función. Y después de eso, simplemente llamamos a esta función print result. De lo contrario, cómo va a funcionar. Haz los cambios, y vamos a comprobar esto. Ejecute de nuevo nuestro archivo. Bueno. Es ir a buscar y ver aquí obtenemos resultado y además no está bloqueando este fin Podemos ver usando asincrónico y esperar, podemos escribir nuestro código asíncrono que parece código síncrono parece Esto es más legible y claro que este código anterior. Ahora bien, ¿y si esta promesa escribía error usando el método de rechazo? Aquí eliminamos comentario del método de rechazo. Veamos cómo podemos manejar errores en el método asincrónico at Entonces, para manejar el error en asincawt necesitamos usar el método try and catch También es simple. Déjame mostrarte. Entonces, antes que nada, agregamos try y en los corchetes Gy, movemos nuestro código. Ahora bien, si algo sale mal en este triplog nuestro código se mueve directamente al bloque de caché Entonces agregamos aquí bloque de caché, y este bloque de caché tiene un parámetro llamado error. Y sí, es el mismo error que promesa escrita en la función de rechazo. En el soporte CLI, simplemente podemos consultar dot log este error Ahora veamos que está funcionando o no. Guarde esto y ejecutemos este archivo una vez más. Ver, aquí nos sale el error. Entonces, en términos simples, si ocurre algún error en este triplog entonces este bloque catch se Ahora, algunos estudiantes podrían preguntar. Esto parece que este 08 está bloqueando nuestro código para que no funcione hacia adelante. Y sí, es cierto, pero eso es cierto sólo para esto como función. Aquí tenemos consola y después de esta llamada de función. Entonces en la salida, obtenemos inicio, entonces nuestra función llamará. En esa función, primero, se llamará función de estudiante justa, que devuelve promesa. Entonces un peso detendrá la ejecución del código hasta que se resuelva la promesa. Por lo que nuestro código no avanzará solo en esta función, sino que se moverá hacia adelante fuera de la función. Y por eso después del inicio, conseguimos N. Entonces si tenemos otras líneas, entonces también las ejecutará. te preocupes, Asynchronous es una forma de escribir código asíncrono que parece código síncrono, pero nuestro código funcionará Para recapitular rápidamente, cuando tenemos promesa, podemos usar una palabra clave de pesaje Un peso pausa la ejecución hasta que se resuelva una promesa y solo podemos usar un peso en la función asíncrona Para el manejo de errores en un método syncowt, usaremos try and catch blog Obtenemos algún error en el blog seco, entonces nuestro método de caché se ejecutará simple como eso. Así es como podemos consumir promesas de una manera mucho más fácil que este método T y catch. Es tu elección, lo que quieres usar. Ambos funcionan igual. Depende totalmente de ti lo que quieras usar. Además, si en Asynchronous y AD quieres agregar el blog de TryCatch, entonces simplemente escribe Tricach y Ver, aquí conseguimos Tri case block. Espero que aprendas mucho de esta sección o estos conceptos se refresquen Sin borrar estos conceptos, no podemos saltar sobre las aplicaciones BG. Si continuamente estás viendo este curso, entonces tómate un descanso de cinco a 10 minutos, toma un poco de aire fresco, y te veré en la siguiente sección. 57. Sección 07: conceptos básicos de MongoDB: Bienvenido a la séptima sección del curso ultimate no JS. Hasta ahora en nuestros proyectos, estamos definiendo datos en una simple matriz de JavaScript. Pero el problema con este enfoque es cuando reiniciamos nuestro servidor o aplicación, nuestros datos se restablecen a un valor definido y perdimos nuestros cambios en nuestros datos. Ahora, en ese momento, la base de datos viene en la imagen, por lo que almacenaremos nuestros datos en la base de datos. Existen muchos tipos de opciones de bases de datos como MySQL, SQL lite, Mongo Dib, etcétera. Mongo DB es la base de datos más utilizada con aplicaciones de nodo, y eso es lo que vamos a aprender en este curso Ahora, una cosa que quiero aclarar es que después de completar este curso, no vas a dominar completamente Mongo DB porque Mongo Di B en sí es un curso de cuatro a 5 horas, pero voy a tratar de cubrir tantos temas como sea Entonces en esta sección, comenzaremos con muy básicos de base de datos, y luego avanzaremos para crear, leer, actualizar y eliminar los datos con ejercicio. Estoy muy emocionada, y espero que tú también. Entonces, vamos a sumergirnos en esta sección. 58. Introducción a la base de datos: Ahora antes de comenzar a aprender Mongo Deb, es mejor que aprendamos algunos términos básicos de base de datos Entonces, como sabrás, la base de datos es una colección organizada de información estructurada llamada datos, y se almacena en la computadora o en la nube. En las escuelas antiguas, nuestro maestro utilizó un libro o registro para realizar un seguimiento de la asistencia de los estudiantes. Eso es base de datos, pero está en papel duro. En el mundo actual, utilizamos sistema informático para almacenar esos datos, de manera que podamos acceder a ellos en cualquier momento y desde cualquier lugar. Todos sabemos esto, ¿verdad? Ahora, hay dos tipos de base de datos. primera es una base de datos SQL o una base de datos relacional, y la segunda no es una base de datos SQL o una base de datos no relacional Difieren en la forma en que organizan, almacenan y administran los datos. Déjame explicarte esto uno por uno. Entonces SQL significa lenguaje de consulta estructurado. La base de datos SQL está bien organizada llenando gabinetes. Estos dos datos en tablas usando múltiples columnas y filas como esta. Podemos ver que esta es una estructura muy organizada. Cada columna de la tabla representa diferentes rellenos de datos, como nombre, dirección de correo electrónico, número de teléfono y contraseña, y cada fila de la tabla es un nuevo conjunto de usuarios. Tenemos que pasar datos de un solo usuario para todas estas columnas, y por eso es tabla organizada. Ahora, por otro lado, ninguna base de datos SQL es como una placa flexible donde podamos organizar los datos como queramos. En ninguna base de datos SQL, no tenemos tablas porque no siguen una estructura estricta basada en tablas o una estructura basada en esquemas. Las bases de datos SQL almacenan datos en formatos más flexibles como documentos DSN o pares de valores clave Por ejemplo, si tenemos los mismos datos de usuario, podemos almacenarlos así en par de valores clave. No necesitamos proporcionar todos los campos para cada usuario, y es por eso que podemos llamarlo esquemas o esquema estructura flexible Las opciones populares para SQL son MesquleQtoracle, etcétera. Donde en el NoSQL, tenemos Mongo DiBrds Podría preguntar cuándo elegimos SQL y cuándo vamos por ninguna base de datos SQL. Por lo que depende del tipo de datos que esté tratando y lo que necesite su aplicación. Utilizamos SQL, si queremos que nuestros datos estén estructurados y organizados en tabla. Además, si necesitamos ejecutar consultas complejas para análisis o si se usa consistencia de datos, entonces usamos la base de datos SQL. otro lado, no usamos SQL, si queremos que nuestros datos estén desestructurados o semiestructurados, excepto el rápido crecimiento de los datos, necesitamos flexibilidad en nuestro modelo de datos nuestra aplicación es en tiempo real o big data, entonces no usamos ninguna base de datos SQUL Por ejemplo, estamos creando aplicaciones de comercio electrónico, que tiene muchas características como el usuario puede subir reseñas, sugerencias de productos en las que nuestros datos están desestructurados o semiestructurados, y también los usuarios podrían dar reseñas en grandes cantidades En su momento, ¿qué base de datos debemos elegir? Bien, usamos aquí, sin base de datos SQL. Tomemos un ejemplo más. Supongamos que estamos construyendo un sistema bancario donde necesitamos datos estrictos y transacciones financieras precisas. ¿Qué base de datos debemos elegir? Derecha, usa aquí SQL. Entonces realmente depende de qué tipo de datos estamos tratando y qué tipo de aplicación queremos construir. La mayoría de las veces, tu equipo te dirá qué base de datos debes agregar en tu aplicación. Así que no te preocupes por eso. Muchos desarrolladores realmente no conocen la diferencia entre SQL y ningún SQL. Ya sabes, ¿verdad? En muchas aplicaciones de nodo, elección predeterminada de los desarrolladores es Mongo DB, que es la base de datos sin Squal. Y si quieres convertirte en desarrollador de MSTech, esto es para Mongo En este curso, agrego MongoDB como base de datos. No te preocupes, aprenderemos MongoDB paso a paso. 59. Instala MongoDB en Windows: Vamos a instalar Mongo DV en Windows, y si tienes MG, entonces puedes saltarte esta lección En primer lugar, dirígete a mongodib.com. Ahora ve a estos productos y selecciona Community Edition. Ir a descargar Comunidad. Desplácese hacia abajo. Y aquí podemos seleccionar la versión Mongo Di B. En mi recomendación, por favor no lo cambies. A continuación, podemos seleccionar nuestra plataforma, y luego usted puede seleccionar paquete. No te preocupes por esto, haz clic en Descargar. Ver, se inicia la descarga. Ahora, después de completar la descarga, abre esa configuración y te pedirá permiso de instalación. Permitirlo. Haga clic en siguiente. Acepte el acuerdo. Haga clic en completar. Después de eso, a partir de aquí, podemos cambiar nuestra ruta de instalación. Pero si no tienes ninguna razón, entonces no la cambies. Simplemente haga clic en siguiente. Asegúrate de seleccionar esta brújula Mongo DB, que es la aplicación para MongoDB, en la que podrás ver todas las tablas de la base y editarlas o Da clic en siguiente e instala. Esto tomará algún tiempo alrededor cinco a 10 minutos porque también estamos instalando la brújula Mongo DB Ahora, después de completar esta instalación, verifiquemos esto. Abra el símbolo del sistema y escriba Mongo D y presione Entrar. Obtenemos este error, Mongo D no es reconocido como un comando interno o externo Entonces para resolver este error, tenemos que volver a ir al sitio web de Mongo Db y aquí en los mejores productos e ir a ver todos los productos en herramientas Ahora, desplácese hacia abajo en esta página, y aquí obtenemos la opción de celda. Así que seleccione estos ahora haga clic en Descargar, desplácese hacia abajo. Y aquí volvemos a descargar esta configuración. Ahora, después de completar la descarga, abre esa carpeta de descargas y extrae ese zip que acabamos de descargar. Bueno. Ahora, abre esa carpeta, y en la carpeta bin, obtenemos este archivo Mongos Así que simplemente copie estos y abra los archivos del programa de su unidad C. Servidor MongoDB, 8.0 B, y aquí pegamos conjunto Este Mongos es nuestro celular Mongo DB. Ahora tenemos que dar un último paso, que es establecer este camino hacia el camino del entorno. Así que copia esta ruta en inicio, busca la variable de entorno y abre la edición de las variables de entorno del sistema. Déjame cerrar como cosas. Ahora, haga clic en estas variables de entorno, y en las variables del sistema, seleccione la ruta, y haga clic en Editar. Ahora tenemos que agregar esa ruta de bin aquí, así que da click en Nuevo y pasea ese camino. Haga clic en Bien. Bien, y bien. Ahora, de nuevo, abra el símbolo del sistema. Escribimos mangos y golpeamos Enter. Obtendremos la celda Mongo DB, por lo que instalamos con éxito Mongo DB en nuestro sistema Ahora déjame darte un rápido recorrido por esta brújula Mongo DB Cuando abrimos esta brújula por primera vez, tenemos que ingresar a nuestra cadena de conexión, que es nuestro anfitrión local, Columna 27017 Puedes escribir esta cadena de conexión, que agregué y hacer clic en Guardar y conectar. Ver, aquí podemos ver nuestra base de datos y también podemos ver tablas y A podemos ver documentos. 60. Conecta MongoDB con la aplicación Node: Por lo que instalamos Mongo Di B en nuestro sistema. Ahora conectemos ese Mongo Di B con la aplicación de nodo. Entonces para aprender Mongo Di B, vamos a crear un nuevo proyecto porque no quiero que te confundas con el proyecto anterior tastak Añadiremos Mongo Di B como ejercicio en ese proyecto. Será divertido. Entonces por ahora, en la carpeta projects, creamos una nueva carpeta, digamos Mongo demo, nombre raro, pero está bien para aprender Vamos a abrir esta carpeta en el código VS. Ahora para inicializar este proyecto, abrimos nuestra terminal y escribimos NPM en ella I. Bien. abrimos nuestra terminal y escribimos NPM en ella I. Bien. Y aquí creamos un nuevo archivo, index dot gs. Ahora en aplicaciones de nodo para administrar y trabajar con MongoDB, usaremos una biblioteca muy popular, que En palabras simples, al usar la biblioteca Mongoose, podemos trabajar fácilmente con Mongo DB Vamos a instalar esta biblioteca usando NPM install Mongoose, si quieres obtener el mismo resultado que estoy obteniendo en este curso, entonces aquí mismo a la tasa 8.13 Bueno. Ahora para usar esta biblioteca, primero, la importamos usando la función requerida. Aquí pasamos mangosta y la almacenamos en mongoos de const variable Ahora bien, este objeto mangosta tiene muchos métodos. Uno de ellos es connect, así mongoos dot Aquí tenemos que pasar la URL de la base de datos Mongo DB a la que queremos conectar Abrimos aquí, aplicación de brújula MongoDB. Aquí podemos ver que tenemos la cadena de conexión, que es host local, columna 27017 En nuestro código, escribimos en códigos, Mongo DB, columna, barra diagonal doble, host local, Columna 27017, que representan la base de datos local Mongo Deb, que representan la base de datos local barra diagonal hacia adelante, y aquí escribimos nuestro nombre específico de colección de base de datos, digamos Mongo Demo este no es el nombre de la aplicación, este es el nombre de la base de datos. No te preocupes, lo veremos en próximas secciones. Ahora bien, esta expresión devuelve una promesa, y recuerdas, ¿cómo podemos manejar la promesa? Podemos usar el método then y catch, o podemos usar asincrónico esperar Actualmente, no tenemos promesas anidadas, así que para simplificar, podemos usar aquí, luego método Si quieres usar ASN y Aviate, entonces tienes que crear una nueva función ASN Así que aquí agregamos ese método diez, lo que significa que lo conectamos con éxito la función de flecha, y simplemente consola dot log, Mongo Dib conectado con Entonces podría suceder que algo salga mal como la conexión a Internet se perdió, o no se encontró la base de datos o algún tipo de errores en la cadena de conexión. En ese momento, obtendremos error en esta promesa. Así que también agregamos aquí el método catch, y aquí obtenemos el objeto error. Y simplemente consola dot log, conexión Mongo DB falló Coma ese objeto de error. Entonces básicamente, le estamos diciendo a Mongoose, conecte nuestra aplicación a esta base de datos local, demostración de Mongo Ahora podrías preguntar, no creamos esta base de datos demo de Mongo ¿Cómo puede Mongoose conectar nuestra aplicación a esa base de datos ¿Nos dará error? Y la respuesta no no nos va a dar error porque si esa base de datos Mongo demo no está disponible en nuestro sistema, entonces Mongoose creará una nueva base de datos llamada Mongo demo, y si esa base de datos ya está disponible, entonces simplemente usará eso Ahora bien, si esta base de datos se conectó correctamente, entonces logramos el mensaje de éxito, y si nuestra conexión falla, entonces logramos este error. Guarda los cambios, y vamos a ejecutar nuestra aplicación usando nodemon index dot JS Ver, aquí conseguimos conexión exitosa. Entonces así es como conectamos Mongo Di Be con nuestra aplicación de nodo usando el método Mongos dot connect Ahora, déjame decirte algo. Anteriormente, Mongo Di Be solía tener una forma más antigua de conectarse con la base de datos, pero no era perfecta, y los desarrolladores tenían algún problema con eso En algún código antiguo, verás pasar estas opciones con conexión. Estas opciones son solo para manejar mejor la conexión. Podrías usar el nuevo analizador de URL para true, lo que le dice a Mongoose que use la forma moderna de conectarse con Mongo Además, obtenemos uso de topología unificada a True, que le dice a Mongos que administre las conexiones de una manera más fluida y estable Ahora en la nueva versión de Mongo Di, estas opciones están por defecto encendidas, así que no necesitamos pasarlas aquí. Te lo dije, si ves este tipo de código, no te confundes con eso. Ahora en la siguiente lección, crearemos nuestro primer esquema de documento. 61. Importancia del esquema: Antes de almacenar nuestros datos en nuestra base de datos, es mejor definir la estructura de la camada para esos datos. Por ejemplo, queremos registrar un nuevo usuario en nuestro sitio web. Por lo que llena el formulario con nombre, correo electrónico, número de teléfono y contraseña. Y cuando golpeamos registro, almacenamos estos datos en nuestra base de datos. Ahora, como desarrollador, sabemos que a veces el usuario olvidó escribir su nombre u olvidó escribir correo electrónico o contraseña. El usuario puede olvidar cualquier cosa. Entonces, para evitarlos, definiremos la estructura de la camada para esos datos, lo que significa que podemos definir el nombre es obligatorio, correo electrónico como campo único, lo que significa que cada usuario debe usar una dirección de correo electrónico única. El número de teléfono puede ser cualquier cosa o el usuario también puede omitir esta información y contraseña también se requiere. Ahora bien, si el usuario no pasa nombre o escribe correo electrónico incorrecto, entonces sus datos no se almacenarán en nuestra base de datos. Devolveremos el error para ese usuario, y así es como podemos evitar que datos no deseados e innecesarios se almacenen datos no deseados e innecesarios en nuestra base de datos. Por eso es importante definir la estructura y a esta estructura se le llama esquema. Podrías preguntar en la lección de introducción a la base de datos, te dije Mongo DB o ningún SQL es el esquema o estructura flexible del esquema, y SQUL es la estructura basada en esquemas, y ahora te estoy diciendo ¿Por qué? Sabemos que en MongoDB, almacenaremos datos en el par de valores clave Supongamos en nuestro ejemplo anterior, algún usuario pasa nombre de campo, correo electrónico, como dirección de correo electrónico, o nombre como nombre de usuario, entonces ¿cómo podemos administrar este tipo de datos? MongoDB es un esquema flexible, lo que significa que no tenemos que definir el Sin embargo, la definición de un esquema proporciona consistencia, validación y previsibilidad, que son cruciales en la mayoría de las aplicaciones de nivel de producción Un esquema nos ayuda a evitar datos no deseados o sucios. Además, al definir el esquema, podemos escribir la lógica de consulta con mayor claridad. Ahora podrías preguntar a Mongo Di B es esquemas o esquema de estructura flexible ¿Cómo podemos definir la estructura en MongoDB? La respuesta es Mongo DB no hacer cumplir el esquema de sus datos. Pero al usar otras herramientas como Mongoose, podemos definir el esquema para nuestros documentos Mongo DB Además, si estás familiarizado con SQL, en eso tenemos tabla, supongamos usuario, y en esa tabla, tenemos filas para cada usuario. Ahora en Mongo Di B esa mesa se llama colección. Esa fila se puede llamar como documento. No te confundas cuando uso palabras como colección y documento. Son muy similares a mesa y fila. Para recapitular, podemos definir esquema para nuestra colección Mongo Dew para un mejor uso de nuestra Ahora en la siguiente lección, veremos ¿cómo podemos definir el esquema para nuestra colección Mongo Dew 62. Definición de esquema para el documento: Veamos cómo podemos definir el esquema usando mangos. Entonces para eso, usamos nuevo esquema de puntos de mangos, que es una clase Ahora en este paréntesis, agregaremos objeto con nuestro nombre de relleno y estructura para ese relleno Por ejemplo, primero necesitamos nombre, columna, y aquí escribimos el tipo de datos que queremos almacenar. Entonces, por nombre, queremos almacenar stream. Asegúrate de escribir como en mayúscula. Ahora después de eso, podríamos tener correo electrónico y esto también queremos en cadena. Ahora, como te dije antes, queremos almacenar el correo electrónico como valor único para cada documento o fila. Entonces, ¿cómo podemos definir esa singularidad aquí? Simplemente, en el lugar de esta cadena, pasamos objeto. Este objeto tiene múltiples propiedades. Primero, queremos definir el tipo de este relleno, que es string, y luego tenemos otra propiedad que es única y la establecemos en true. Entonces, si ya tenemos correo electrónico para un usuario, ese mismo correo no puede usar para otro usuario. Después de eso, digamos que tenemos teléfono y pasamos aquí objeto, y establecemos tipo a número. Ahora aquí no queremos que este relleno sea necesario. El usuario también puede omitir este teléfono lleno. Entonces aquí no pasamos nada. Y si solo queremos pasar propiedad tipo para el relleno, podemos escribir directamente como este número. Pero me gusta seguir una sintaxis consistente, así que dejo esto tal como está. Pero en el campo name en el lugar de esta cadena, simplemente agregamos objeto con tipo a cadena, y también queremos que este campo sea obligatorio. Añadimos aquí, requerido a true. Asegúrate aquí escribimos requerido, no requerimos. No estoy seguro de que solo requiero esté funcionando o no. Además, siempre almacenamos nuestro ID de EML en minúsculas, y también podemos definirlo aquí por minúsculas a true Se puede ver que definir el esquema no es difícil. Es muy sencillo. Ahora, después de eso, tenemos contraseña y queremos almacenarla como cadena y es el campo obligatorio. Dime qué propiedades debemos agregar aquí. Correcto, agregamos aquí tipo a cadena y requerido a true. Lo estás haciendo muy bien. Ahora, después de eso, este usuario podría tener aficiones, que pueden ser múltiples cosas. Así que queremos almacenarlo en array. Escriba a corchetes, que es array, y en eso, queremos cadena simple. Así que nuestros pasatiempos podrían parecerse a esta variedad de cuerdas. Ahora después de eso, podríamos tener está verificado, qué usuario fuente está verificado o no, y establecemos su tipo en Bullion, lo que significa verdadero o falso Y por defecto, queremos almacenar usuario como no verificado. Entonces para eso, tenemos otra propiedad llamada default. Pasamos el valor por defecto como false. Así es como definimos el esquema para nuestra colección Mongo DB. En el esquema, tenemos múltiples tipos de esquema como string, number, booleano, date, object, array, object ID, que veremos en el futuro, B para almacenar los datos binarios mezclados para cualquier tipo de datos mucho más Si quieres conocer todos los tipos de esquemas y su propiedad, entonces puedes visitar esta documentación de mangosta En esta página, obtenemos toda la información. Ahora en la siguiente lección, veremos cómo aplicar este esquema para la recolección. 63. Crear modelos: En la lección anterior, creamos este esquema de usuario. Ahora bien, ¿cómo podemos definir qué colección debe seguir este esquema? Para eso, necesitamos crear un modelo. Entonces, antes que nada, almacenamos este esquema en una variable llamada esquema de usuario. Ahora para aplicar este esquema de usuario, necesitamos crear modelo. Así que escribimos aquí Mangosta punto Modelo. Dentro de esta en la primera posición, pasamos el nombre singular de nuestra colección, que es aquí usuario. Por lo que este usuario se convertirá en colección de usuarios. Si queremos crear colección llamada post, que es plural, entonces aquí, tenemos que escribir nombre singular de esa colección, que es post. Ahora en el segundo argumento, pasaremos nuestro esquema para esta colección de usuarios, que es este esquema de usuario. Ahora esta expresión devolverá el modelo para la colección de usuarios. Así que lo almacenamos en la variable llamada usuario. ¿Me pueden decir por qué estoy usando esta convención pascal o por qué uso U para modelo de usuario Es porque este usuario es una clase y usando esta clase o modelo de usuario, haremos muchas cosas. Simplificar el modelo es como un blueprint para crear y trabajar con documentos en una colección Mongo Deb Define la forma de nuestros datos usando un esquema y proporciona una forma de interactuar con esa colección. En términos simples, el modelo nos permite crear nuevos documentos basados en el esquema, leer datos de la colección, actualizar documentos existentes, además, eliminar documentos de la colección. En definitiva, sin modelo, no podemos hacer nada con la colección Mongo Di Bi No te preocupes vamos a ver todo esto en las próximas lecciones. Actualmente, déjame mostrarte cómo podemos crear un nuevo usuario usando este modelo de usuario. Entonces para crear un nuevo usuario, escribimos nuevo usuario, y dentro de este, pasaremos nuestro objeto de usuario. Entonces el primer campo de esta colección es nombre y valor de pase como código más U. Puedes escribir tu nombre. A continuación, tenemos correo electrónico, digamos, código en did gmail.com Actualmente, estamos escribiendo manualmente estos valores, pero en el mundo real, nuestro usuario desde el front-end escribirá este valor y lo entregará usando post request. Y en el back end, manejaremos esa solicitud de post, y dentro de la lógica post request, escribiremos esta nueva expresión de modelo. Así que no te preocupes por eso. A continuación, tenemos teléfono, que puede ser cualquier cosa 23, 51, 552. A continuación, tenemos contraseña. Asegúrate aquí escribimos el mismo nombre de relleno que definimos en el esquema. Contraseña para cadena 123, cuatro, cinco, seis, 78. Y aficiones para armar, y aquí agrego el aprendizaje, la enseñanza y el seguimiento. Para el último campo, ya establecemos el valor predeterminado en nuestro esquema, así que no necesitamos pasar ese relleno aquí. Así es como podemos crear un nuevo usuario o documento de la colección. Aquí, lo almacenamos en una variable por nuevo usuario. Ahora, actualmente, este nuevo usuario está disponible solo a nivel local. En la siguiente lección, veremos cómo podemos almacenar este nuevo usuario en nuestra base de datos. 64. Guardar un nuevo dato: Entonces aquí tenemos nuevos datos de usuario. Ahora vamos a almacenarlo en nuestra base de datos. Por lo que este nuevo dato de usuario tiene un método, que es el punto CV. Al utilizar este método save, podemos almacenar estos nuevos datos de usuario en nuestra base de datos. Ahora guardar los datos en la base de datos es tarea asincrónica, lo que significa que puede llevar algún tiempo guardar nuevos datos en la base de datos Y por eso esta expresión devuelve una promesa. Puedes adherir, esperar y cuando nuestros datos se almacenen con éxito en la base de datos, devolverá el objeto de usuario almacenado de la base de datos, por lo que podemos almacenarlo en una variable llamada datos almacenados y simplemente consola dot log con datos almacenados. Ahora como sabemos, cuando queremos usar esperar, necesitamos una función acing y solo dentro de esa función, podemos usar esperas. De lo contrario, nuestro código bloqueará las siguientes líneas. Aquí, antes de este nuevo objeto de usuario, creamos una nueva función acing llamada create user. Y dentro de esta función, podemos simplemente mover este nuevo usuario y guardar método. Y al final, llamaremos a esta función de crear usuario. Ahora no guarde el archivo , automáticamente ejecutará este archivo. I terminal, detengo nuestro enlace de nodo usando Control más C. Ahora guarda los cambios, y veamos que esto está funcionando o no. El terminal, ejecutamos este archivo usando el nodo index dot js. No uses aquí nodemon porque solo queremos ejecutar este archivo index dot js una vez Si usamos nod M y cambiamos algo en nuestro archivo, un nuevo usuario creará cada vez Mira, aquí obtenemos nuevos datos de usuario con nuestros rellenos y al final también obtenemos underscore ID, que es el ID único para este documento, y es generado por Mongo DB y usando este ID, podemos hacer muchas cosas Además, llegamos aquí subrayado subrayado a cero. ¿Eso es? Este subrayado se utiliza para el empeoramiento de documentos Cuando creamos un nuevo documento, Mongoose agrega el subrayado subrayado rellenado y lo establece Ahora cada vez que se actualiza el documento en particular, mangos aumentan el subrayado subrayado rellenado Por ahora, no te preocupes por eso. Además, podemos ver estos datos en la aplicación de brújula Mongo DV Ver en la base de datos local, aquí no obtenemos nuestra base de datos, da clic en la base de datos Puntos de árbol y refrescar. Ver, ahora obtenemos la base de datos Mongo Demo. Dentro de esto, tenemos colección de usuarios, que creamos usando modelo, y en esa colección, tenemos nuestro primer documento con ID único, y también tenemos nuestros rellenos. Digamos que esta matriz Obs, que es un par de valores clave, key es el índice de ese elemento, y value es nuestra cadena. Obtenemos datos de la base de datos en nuestro archivo JS de punto índice, luego obtenemos matriz normal de cadena. Simplemente se muestra aquí en el par de valores clave. También, vea, por defecto, establecemos este valor verificado en false. Y sí, podemos cambiar los datos de esta aplicación. Entonces, para recapitular rápidamente, primero, creamos un nuevo objeto de usuario usando este modelo de usuario, y luego simplemente podemos usar método Lots para guardar este documento Ahora intentemos almacenar otros datos de usuario porque necesitamos esos datos en las próximas lecciones. Cambié su nombre a Halley, correo electrónico a Halley en direct Si quieres cambiar algo, y puedes cambiar en el número de teléfono, contraseña, Harley 123, y hobbies, digamos, codificación, Jimming y seguimiento Guarda los cambios y en nuestro terminal, ejecutamos node index dot js. Bien, mira, aquí obtenemos nuevos datos. Si revisamos nuestra brújula Mongo Di B, no obtenemos aquí datos Entonces nos refrescamos desde aquí y vemos aquí obtenemos nuestros nuevos datos. Así es como son los datos en nuestra base de datos. Si seguimos esto paso a paso, entonces es realmente sencillo. 65. Consulta los datos: Ahora veamos cómo podemos consultar los datos. Pero podría preguntarse, ¿cuál es el significado de consulta? La consulta es simplemente una solicitud de información de la base de datos. En palabras simples, una consulta es solo una forma de pedir a la base datos datos específicos basados en ciertas condiciones. Por ejemplo, de la colección de nuestro usuario, queremos obtener datos de todos los usuarios. En primer lugar, escribimos el modelo de esa colección, que es el punto de usuario aquí obtenemos múltiples métodos de consulta. Tenemos encontrar por identificación, y encontrar uno. Además, tenemos otros métodos finos para actualizar, eliminar y reemplazar. No te preocupes por esos. Los veremos en las próximas lecciones. Actualmente, solo nos enfocamos en este hallazgo, que se utiliza para encontrar múltiples documentos de nuestra colección. Así que tenemos Fine n que se utiliza para recuperar un solo documento de la colección También tenemos Fine by ID, que se utiliza para buscar documento por su ID único Actualmente, queremos recuperar varios documentos, así que usamos aquí punto Find Ahora bien, esta expresión también devolverá promesa. Podemos usar aquí entonces método, o podemos usar Ising esperar. En este caso de uso, ain esperar es más sencillo y nos ayuda a escribir núcleo limpio. Aquí, creamos una nueva función ing llamada get users y simplemente movemos esta espera dentro de esta función. Ahora, esto devolverá los datos de todos los usuarios de la colección de usuarios. Lo almacenamos en variable llamada usuarios y Consol dot log estos datos de usuarios También en el lugar de esta función creatuser, llamamos gtUsersFunction, y la movemos por debajo de esta función Ahora veamos que estamos obteniendo datos o no. Guarde los cambios. Y vamos a ejecutar esta aplicación usando nodo index dot gs. Ver, aquí obtenemos matriz de datos de dos usuarios. El primero es el código PlusU y después Harley. Encantadora. Así es como obtenemos todos los datos de la colección Ahora, hagamos esto más interesante. Supongamos que queremos encontrar sólo aquellos usuarios cuyo nombre es Harley. Entonces para hacer eso, pasamos objeto en el método fine. Aquí, podemos definir múltiples condiciones en par de valores clave. Ese es un nombre dos codifica Harley. Esto encontrará todos los datos de los usuarios cuyo nombre es Halley. Además, aquí podemos pasar múltiples condiciones como Es verificado a falso, etcétera Esta consulta comprobará si el nombre es Halle y su valor es verificado es falso o no Si ambas condiciones son ciertas, sólo entonces obtenemos los datos de esos usuarios. Di esto y ejecutemos nuestra aplicación. Ver, aquí obtenemos matriz vacía. ¿Por qué? Como podemos ver en nuestra base de datos, tenemos nombre Halle y ademas se verifica se establece en false Entonces por qué no estamos obteniendo estos datos. Aquí en la propiedad de nombre, pasamos Halle en minúsculas Pero en la base de datos, H es mayúscula. Entonces cambiemos esta condición, veamos qué cambia y ejecutemos nuestra aplicación una vez más. Ver, aquí obtenemos nuestros datos. Así que recuerda, si pasamos cadena por condición, asegúrate de escribir en mayúsculas y minúsculas. Bueno. Ahora actualmente estamos obteniendo datos con todos los rellenos. ¿Y si solo queremos buscar el nombre de usuario y los pasatiempos? Entonces para eso, después de este método fino, podemos agregar método select y dentro de los códigos, pasamos nuestro nombre de campos separados por espacio. Escribimos nombre pasatiempos espaciales. Si queremos otros campos, entonces también podemos pasar aquí con espacio. Por ahora, no queremos eso. Guarde los cambios y ejecutemos nuestra aplicación. Ver, aquí obtenemos solo nombre, aficiones y subrayado ID el cual es agregado automáticamente por Mongo DB Además, si de nuestros datos, solo queremos eliminar uno o dos rellenos como aquí, queremos todos los datos excepto contraseña y se verifique. Entonces en el lugar de estos nombres de relleno, pasamos menos contraseña, espacio, menos se verifica. Guarde los cambios, abra la terminal y ejecutemos nuestro archivo. Ver, aquí obtenemos todos los fallidos excepto contraseña y Es verificado. Sencillo. Ahora hagamos esta pequeña consulta más avanzada. Supongamos que tenemos 100 datos de usuario y queremos obtener esos datos, pero ¿cómo podemos obtener 100 datos en una sola matriz Es mejor que busquemos los primeros diez datos, luego después de eso, otros diez datos Entonces aquí eliminamos esta condición porque queremos todos los datos y después de la selección, agregamos límite dentro de este, podemos pasar el número de registros que queremos ver. Digamos diez. Guarde los cambios, abra la terminal y ejecutemos nuestra aplicación. Ver, aquí obtenemos dos registros porque sólo tenemos dos registros. Si tenemos 20 registros, entonces solo obtenemos los primeros diez registros. También, como tenemos límite, también saltamos método. Aquí pasamos el número de datos que queremos omitir. Si tenemos 20 registros y nos adherimos saltamos cinco, entonces saltará los primeros cinco registros y luego mostrará de seis a 20 datos. Este método limit y skip son muy útiles para la paginación y la consulta No te preocupes, agregué lección por separado para eso. Por ahora, solo entiende Skip y limit están disponibles. Entonces, vamos a quitar esto. Bueno. Ahora por fin, también podemos abreviar nuestros datos por cualquier relleno. Supongamos que queremos abreviar nuestros datos de usuario por su nombre llenado. Entonces podemos escribir aquí punto corto, y dentro de este, pasamos objeto, y aquí pasamos nuestro nombre de campo, que es nombre, y aquí podemos pasar dos valores uno, que es para orden ascendente y menos uno para orden descendente. Pasemos los dos uno por uno. Primero, guarda esto y ejecutemos nuestra aplicación. Verás, obtenemos usuarios con orden ascendente, lo que significa A a ZD si cambiamos esto a menos uno, guardemos esto y volvamos a ejecutar nuestro archivo Mira, aquí obtenemos orden descendente, que es de Z a A, y por eso muestra primero har y luego código te bendiga. No te preocupes, te voy a dar PDF detallado de esta sección. Puedes revisar estos métodos lo más rápido posible. 66. Operadores de comparación en MongoDB: Aprendamos sobre los operadores de comparación en Mongodib. Los operadores de comparación se utilizan para comparar valores en la base de datos con los valores que especificamos en la consulta, y es muy importante cuando estamos trabajando con datos, especialmente datos basados en números. Por ejemplo, imagínese en nuestros datos de usuarios, hemos llenado de edad, y queremos buscar datos de usuarios cuya edad 18-30 mayor que 18 o menor que 50 Puede ser cualquier cosa. Cuando queremos hacer algo como esto, necesitamos operador de comparación. Hay muchos operadores de comparación en Mongo Deb. Primero, tenemos dólar EQ, que es para iguales a. A continuación, tenemos el dólar N, que no es igual al dólar GT, que es mayor que el dólar GT E. ¿Puedes adivinar? Derecha, mayor o igual a dólar LT, que es un LT menor que dólar para menor o igual al dólar E. Esto se utiliza para emparejar cualquiera de los valores de la lista, edad debe ser 18, 22, 25, así. Puede pasar múltiples valores en matriz. Y por fin, tenemos dólar NIN que no coincide con ningún valor en array, y es opuesto al dólar N. Los operadores de comparación son realmente simples. Déjame mostrarte dónde tenemos que escribir operadores de comparación. Entonces, para que sea práctico, agreguemos el campo H para estos dos documentos. Entonces Pan Mongo para ser brújula e ir a la colección del usuario Aquí, podemos modificar cada documento usando este icono de edición. Sobre cualquiera de los campos. Y en el lado izquierdo, obtenemos icono más para agregar nuevo campo. Seleccione agregar nuevo campo, y aquí escribimos nuestro nombre de relleno, que es la edad, y pasamos valor, digamos diez. Actualmente, este tipo de valor es string, pero podemos cambiarlo a partir de aquí y lo establecemos en integer 32. Ver, ahora es entero. También agregamos nuevo campo para el segundo documento, nombre de relleno, edad y valor, digamos 20. Como cambiamos un tipo a entero 32 y pulsamos en Actualizar. Código. Ahora, en nuestro código, anteriormente, como podemos ver, si quieres agregar condición para nuestra consulta, entonces agregamos ese relleno el objeto aquí, como edad a diez. Esto buscará todos los datos de los usuarios cuya edad es t diez. Déjame hacerte una pregunta donde podemos escribir nuestro operador lógico. Porque como podemos ver, por condición, tenemos que pasar par de valores clave en este método find. Entonces la solución está en el lugar de este valor codal duro diez, podemos escribir nuestro operador de comparación en otro objeto No te confundas, mira esto. Entonces en el lugar de diez, agregamos objeto, y simplemente escribimos operador de comparación como clave en este subobjeto. Digamos dólar GTE, que es mayor que o igual a, y mayor que o igual a qué? 18. Entonces esto simplemente significa encontrar todos los usuarios cuya edad sea mayor o igual a 18. Simplemente reemplazamos ese valor codificado duro diez con el objeto, y dentro del objeto, usamos operador de comparación. Ahora déjame darte una pequeña tarea. Eliminemos todo este objeto del método fino. Queremos buscar a todos los usuarios cuya edad sea menor de 18 años. Aquí agregamos objeto, y primero, agregamos en qué campo queremos aplicar condición, que es edad. Y en lugar de valor duro, pasamos aquí objeto porque queremos usar operador de comparación, y dentro de él, usamos dólar T por menos de y menos que a 18. Tan simple como eso. Guarda este archivo y para el método find, podemos ejecutar nuestra aplicación usando nodemon index dot js porque no va a cambiar nada en la base Ver, aquí obtenemos usuario cuya edad es menor a 18. Se puede ver solo tenemos que pasar Objeto con operador de comparación en el lugar de valor duro. Además, estos primeros seis operadores son muy simples, pero muchos estudiantes confundidos en esto en y no en operador. En el lugar de valor, aquí tenemos que pasar lista de valores. Entonces déjame mostrarte estos dos operadores. Supongamos que queremos buscar únicamente usuarios cuya edad sea de 18, 20 o 30 Entonces, cuando queremos comparar múltiples valores para un campo, entonces usamos dólar en operador. Entonces en el lugar del dólar LT, usamos dólar en. En el lugar de valor, pasamos array de valores, 18, 20, 30. Tan simple como eso, guarda los cambios y echa un vistazo. Ver, aquí conseguimos usuario con 20 años porque pasamos 20 en esta matriz. Ahora dólar NN es lo opuesto al dólar en. Yo lo llamo un interior, que significa usuarios de parches cuya edad no es de 18, 20 o 30. Guarde los cambios, y vea, aquí obtenemos usuario con diez años de edad. Entonces así es como pasamos los operadores de comparación en Mongo DV. Solo recuerda en condiciones regulares, pasamos aquí llenar con valores, pero para operadores de comparación, pasamos aquí llenar con objeto, y dentro de este objeto, agregamos nuestro operador de comparación. 67. Operadores lógicos en MongoDB: Veamos operadores lógicos. Por lo que los operadores lógicos nos permiten combinar múltiples condiciones en nuestra consulta. En palabras simples, nos ayudan a pedir más complejos de la base de datos. No te preocupes. Solo hay pocos operadores lógicos, y también son simples como operadores de comparación. primer operador lógico es dólar R. Utiremos operador cuando tengamos múltiples condiciones y queramos, si alguna condición es verdadera, entonces devolveremos esos datos. Ejemplo, queremos buscar usuarios que tengan 30 años de edad o que tengan el nombre Halley En este caso, queremos que cualquier condición sea cierta, y por eso usamos aquí u operador. Déjame mostrarte eso prácticamente. Comento este código anterior y escribo costo usuarios es igual a esperar usuario punto Find. Y en este método find, pasamos Object, y en ese objeto, simplemente agregamos dólar u operador. Ahora se podría pensar en un operador de comparación en el lugar de valor, pero estamos usando el operador lógico en el lugar de la condición. Déjame darte mi triga para recordarlo. Como sabemos, siempre comparamos valores, y por eso tenemos que escribir operador de comparación en el lugar de valor. Pero implementamos operadores lógicos para condiciones, y por eso tenemos que escribir operador lógico en el lugar de las condiciones. Cuando empecé Mongo Deb lo recuerdo de esta manera. Como sabemos, queremos agregar aquí múltiples condiciones y lo que usamos para múltiples condiciones, usaremos array. Ahora dentro de esta matriz, agregamos nuestras condiciones en objeto individual. Entonces objetar edad a 30 o pasamos otro nombre de condición H. Si alguna condición es verdadera, entonces obtenemos esos datos de usuario. Los cambios y echar un vistazo. Ver, aquí obtenemos el usuario Halley porque su nombre es Halley Esta edad del usuario es la misma que nuestra condición o no. No importa. Si alguna condición está engranada, entonces obtenemos esos datos Tan simple como eso. Ahora supongamos que queremos para nuestra consulta. Estas dos condiciones deben ser ciertas, lo que significa que la edad del usuario debe 30 y también el nombre debe ser Halley En esta situación, donde queremos todas las condiciones deben ser ciertas. Usaremos operador final. Entonces en el lugar de este operador, pasamos y operador. Ahora bien, ¿puedes adivinar la salida? Bien, no obtenemos nada porque no tenemos datos donde la edad es 30 y el nombre es h Ver, aquí obtenemos matriz vacía. Ahora déjame mostrarte la forma de atajo para escribir esto y operador. Cuando queremos que estas todas las condiciones deben ser ciertas, ya escribimos la misma consulta al inicio del tema de consulta. Podemos pasar directamente esas condiciones en el método find así. Estos dos funcionan igual. Pero cuando queremos usar operator, entonces tenemos que seguir esta sintaxis. Ahora, después del operador de fin de dólar, tenemos otro operador lógico que es dólar NR, o llamamos como NR lógico. Por ejemplo, queremos encontrar usuarios que no tengan 30 años y no tengan el nombre Harley, que significa que ambas condiciones deben ser falsas Para eso, en el lugar de este operador final, pasamos operador NR. Los cambios y ver, aquí obtenemos datos con nombre Dios bendiga porque para estos datos, ambas condiciones son falsas, y por eso obtenemos estos datos. Pero para nuestros segundos datos de usuario, esta condición de nombre es cierta, así que no obtenemos esos datos tan simples como eso. Ahora el último operador lógico que tenemos es dólar nada o nuez lógica Este operador de nudo lógico es poco diferente porque solo usamos no operador con operadores de comparación y expresiones regulares. No te preocupes por la expresión regular. Eso lo veremos en la siguiente lección. Por ahora, veamos, operador de dólar nada. Supongamos que queremos encontrar usuarios cuya edad no sea igual a 30. Nuevamente, comento esta sintaxis y escribo de nuevo, costo usuario es igual a awight user dot find Objeto, y primero, agregamos relleno para lo que queremos agregar condición, que es H. Ahora en el lugar de valor, pasamos objeto con operador dólar nu. Escribimos operador de nuez de dólar en el lugar de valor porque operador dólar nada está directamente relacionado con el valor no con condiciones Ahora lo que queremos es que la edad no sea igual a 30, tenemos edad y tampoco nada, pero no tenemos iguales y valor Agregamos otro objeto con operador de dólar, lo que significa igual y simplemente pasamos aquí valor 30 Guarda los cambios y echa un vistazo. Ver, aquí obtenemos ambos usuarios porque ambos edad no es igual a 30. Se puede ver que es realmente sencillo. Déjame mostrarte una vez más. En el operador de comparación, estamos escribiendo así. Columna de edad, dólar igual o mayor o menor que cualquier operador queramos utilizar a su valor. Ahora aquí, solo queremos agregar no operador, simplemente envolvemos este objeto con otro objeto y agregamos aquí operador de dólar nada y dos puntos simples como eso Sé que esto es un poco confuso, pero no te preocupes si no recuerdas la sintaxis de los operadores, te voy a dar mi cheatsheet al final de esta sección para que puedas usarla cuando trabajemos en proyectos del mundo real Eso es todo acerca de los operadores lógicos. Si estás continuamente viendo el curso, entonces puedes tomar un pequeño descanso de tu pantalla, escuchar algo de música o dar un nuevo paseo. Nos vemos en la siguiente lección. 68. Expresión regular en MongoDB: Ahora veamos sobre las expresiones regulares. ¿Qué es la expresión regular? Una expresión regular es una forma definir patrones de búsqueda para cadenas. Por ejemplo, queremos encontrar todos los usuarios cuyos nombres comiencen con edge o queremos buscar todos los usuarios cuyo correo electrónico tenga gmail.com al final de En estos casos, usaremos expresiones regulares o algunos desarrolladores lo llamaron jx Es realmente útil en de sugerencias de auto o consulta de búsqueda. Déjame mostrarte prácticamente. Aquí comento esta consulta anterior. Además, elimine consultas antiguas y escriba una nueva consulta Cast usuarios iguales a esperar usuario dot find. Aquí, pasamos objeto, y sobre qué propiedad queremos aplicar patrón de búsqueda. Probemos nombre. Ahora en el lugar de valor, pasamos la expresión regular. Aquí está la sintaxis de la expresión regular. Barra diagonal con patrón de corte. Entonces basándonos en este patrón, vamos a hacer muchas cosas. Supongamos que queremos encontrar todos los datos de los usuarios cuyo nombre comience con Así en el lugar de este patrón, usamos el símbolo de Kerat, lo que significa comenzar con, y aquí pasamos CpTalh Esta consulta encontrara a todos los usuarios cuyo nombre comience con mayúscula así que si queremos encontrar usuarios cuyo nombre termine con alguna letra, entonces duplico esta línea y en el lugar de este quilate, escribimos dólar. Este dólar significa terminar con. Por lo que esta consulta devolverá todos los datos cuyo nombre termine con U. Ahora déjame darte una pequeña tarea. Queremos encontrar usuarios cuyo correo electrónico termine con gmail.com. Es realmente simple. Cambiamos este nombre de relleno a correo electrónico y simplemente en el lugar de este, escribimos gmail.com dólar A ver obtenemos los resultados o no. ver si los cambios, y C obtenemos ambos usuarios porque ambos tienen gmail.com Ahora déjame mostrarte algo genial. En la Brújula Mongo Di B, cambio el correo electrónico del segundo usuario en el lugar de gmail.com Escribo Gmail, com. Guarde esto, y veamos qué obtenemos. Guarde este archivo. Y mira aquí conseguimos, de nuevo, ambos usuarios. Podrías preguntar, aunque este correo electrónico no termine con gmail.com, por qué seguimos obteniendo estos datos de usuario ¿Qué tiene de malo nuestra expresión regular? En expresión regular, este periodo puede coincidir con cualquier carácter, lo que significa que JavaScript lo emparejará con cualquier carácter. Y es por eso que si pasamos algún carácter en el lugar de este periodo, obtenemos esos datos. Ahora podríamos preguntar, ¿y si queremos comparar periodo como periodo? No como cualquier personaje. Es realmente simple. Justo antes del periodo, usaremos slash hacia atrás Ahora, JavaScript comparará este periodo como periodo, no como cualquier carácter. Guarde los cambios y vea, aquí obtenemos solo el primer usuario. También este patrón distingue entre mayúsculas y minúsculas. Yo cualquier usuario tengo correo electrónico en mayúsculas como gmail.com, entonces no vamos a conseguir ese usuario en Entonces, para eliminar mayúsculas y minúsculas, solo tenemos que agregar I al final de nuestra expresión regular. Ahora bien, ¿y si queremos encontrar usuarios cuyo correo electrónico contenga Harley? No empezar con Halle o termina con Halley. Harley puede estar en cualquier lugar. Entonces en este caso, simplemente escribimos nuestra palabra en el lugar del patrón sin agregar buharrón o dólar Entonces, si queremos encontrar usuarios con palabra exacta, digamos desarrollador en la descripción, no parte de otra palabra como desarrollador, queremos solo desarrollador. En este caso, escribimos patrón así. Aquí en el lugar de este patrón, escribimos esa palabra, que es reveladora y antes y después de esa palabra, agregamos hacia atrás B, hacia atrás B, que representa el límite de esa palabra. Estas son algunas expresiones regulares comunes y útiles. Si quieres aprender más patrones de expresiones regulares, entonces puedes usar este artículo y leer sobre otros patrones porque es JavaScript puro. Además, en la versión actual de Mangodib, pocos desarrolladores utilizan dólar RejxOperator en el lugar de agregar Esto funciona igual. A mí me gusta esta versión de Sater, pero también puedes usar este Rjxoperator Depende totalmente de ti. 69. Contar y estimar el número de documentos: Supongamos que queremos contar el número de documentos disponibles en la colección de nuestro usuario. Duplico esta consulta y comento consulta anterior. Ahora cuando solo queremos contar el número de documentos, entonces en el lugar de este método fino, pasamos el método de contar Documentos. Esta consulta funciona igual que antes. Obtenemos una serie de datos en salida. En el método Count documents, pasamos nuestras condiciones o también pasamos operadores lógicos, operadores comparación, expresiones regulares, igual que método find. El método Find devuelve los datos reales, donde el método Count documents devolverá el número de documento. Comprobemos esto. Ver los cambios y echar un vistazo. C, aquí obtenemos cero porque no hay datos para esta condición. Ahora a veces no queremos agregar ninguna condición, solo queremos contar total de documentos. En ese momento, podemos eliminar este objeto, guardarlos y ver, aquí obtenemos el número total de datos de usuarios. Ahora, actualmente, nuestros datos son muy pequeños. Imagina que queremos contar el número de productos para grandes aplicaciones de comercio electrónico. Desea mostrar el número total de productos disponibles en la plataforma en el panel de administración. En ese momento, no necesitamos el ext count que muestre el número total de productos. Ahora, en ese momento, podemos utilizar otro método para contar el número estimado de documentos, que es el recuento estimado de documentos. Como su nombre indica, se trata de un recuento estimado. Igual que los documentos de conteo, podemos pasar este método de conteo estimado de documentos justo después del nombre del modelo. Ahora podría preguntarse, ¿cuál es la diferencia entre estos dos? El primero es contar documentos devuelve el número exacto, pero el conteo estimado muestra un conteo aproximado. Otra diferencia es que podemos pasar condiciones o filtros en el método de contar documentos. Pero en el método estimado de conteo de documentos, no podemos pasar ninguna condición. Solo puede contar colección completa. Por lo tanto, el recuento de documentos es poco lento que el recuento estimado de documentos. Entonces, para resumir, usamos documentos de conteo cuando necesitamos aplicar filtros o queremos obtener el conteo de salida Y al otro lado, utilizamos el recuento estimado de documentos cuando necesitamos una estimación rápida y aproximada del número total de documentos en la colección. 70. Paginación y consulta infinita: Veamos cómo podemos crear paginación o consulta infinita. Antes de ver la consulta, es mejor que entendamos cómo funciona la paginación y el desplazamiento infinito Supongamos que estamos trabajando en una gran aplicación de comercio electrónico. En esta aplicación, podríamos tener 1,000 o 10,000 productos como Amazon. Ahora en ese momento, obtenemos todos los productos detallados en una sola llamada API. Tomará más tiempo y también aumentará la carga en nuestro servidor. Entonces, en lugar de obtener todos los datos en una sola solicitud como desarrollador de Bond, podemos dividirlos en páginas como si obtuviéramos solo ocho o diez datos en una sola solicitud. Si el usuario necesita más datos, entonces obtenemos los siguientes diez datos No te preocupes por cómo vamos a crear esta API. Por ahora, solo entiende cómo funciona la paginación y el desplazamiento infinito Aquí está el ejemplo front-end de paginación. En la primera página, solo tenemos ocho datos después de eso, cuando hacemos clic en el botón de la segunda página, obtendremos los siguientes ocho datos. Tan simple como eso. Déjame mostrarte también ejemplo de desplazamiento infinito. Aquí tenemos ocho datos, y cuando lleguemos al fondo de la página, cargará otros ocho datos desde el back-end. Ves, esto es genial. Ahora solo piensa en el lenguaje humano, lo que está pasando aquí. No te preocupes por el código. Solo piensa en lo que está pasando. La paginación y el desplazamiento infinito funcionan casi igual. En ambas técnicas, obtendremos datos en pequeña cantidad según lo necesitemos Solo en desplazamiento infinito, conservamos nuestros datos anteriores En donde la paginación, vamos a sustituir los datos anteriores. Pero back end para las dos técnicas se mantendrá igual. Déjame explicarte con 20 registros ejemplo. Se trata de 20 registros a la vez, queremos mostrar sólo cuatro discos. Podemos definir página variable por datos a cuatro. Obtenemos cuatro registros de aquí y podemos marcarlo como página uno. Ahora bien, si los usuarios se desplazan o incluso se mueven a la segunda página, entonces saltaremos los datos de esta página uno, lo que significa que saltamos por página cuatro datos y luego buscaremos otros cuatro registros de aquí A continuación, cuando el usuario vuelva a desplazarse o pasar a la tercera página, entonces omitiremos los datos de la página uno y la página dos. Matemáticamente, saltaremos la página actual, que es tres menos uno en los datos por página, lo que significa que dos en cuatro es igual a ocho Nos saltamos los primeros ocho datos y recuperamos otros cuatro, que son datos por página Cada vez que aumentemos nuestro número de página, saltaremos la página actual menos una en los datos por página y obtendremos otros datos, que es el número de datos por página Dime cuántos saltaremos cuando pasemos a la cuarta página. Bien, saltaremos cuatro menos uno, que es tres en cuatro, que es 12. Nos saltamos los primeros 12 registros y obtenemos otros cuatro datos. Tan simple como eso. En Mongoose, tenemos el método skip, que hemos visto anteriormente, y también tenemos límite para solo fetch y número de datos Entonces aquí eliminamos esta consulta porque puede crear confusión. Ahora escribimos const usuarios iguales a esperar usuario punto Encuentra aquí no queremos pasar ninguna condición Ahora, después del método fino, nos adherimos al método Skip, y dentro de este, tenemos que pasar cuántos datos queremos omitir. Por ahora, pasamos directamente cero porque para la primera página, queremos saltarnos cero datos. Después de eso, ¿cuántos datos queremos en nuestra única página? Bien, queremos enviar cuatro datos. Entonces agregamos aquí otro método llamado limit y pasamos aquí cuatro. Esta consulta funciona para la página uno. Ahora hagamos que esta consulta funcione para cada página. Entonces, cuando busques una página a dos y llamas a esta API, simplemente saltaremos los primeros cuatro datos Y para eso, creamos fórmula en nuestro ejemplo. Entonces en la parte superior, definimos variable. La página actual es igual a decir dos. Y después de eso, otra variable llamada por datos de página es igual a cuatro. Actualmente, como podemos ver, codificamos duro estos valores. Pero en el mundo real, estos valores son pasados por el front end. Y ¿sabes por qué front-end mandan estos datos? ¿Alguna conjetura? Derecha, front end enviará estos datos usando parámetros de consulta. Supongamos que nuestra API de productos se ve así, slash API slash products, signo de interrogación, página actual es igual a dos, y por página los datos son iguales a cuatro o diez, cualquier cosa que nuestro desarrollador front-end quiera Pero por ahora, no quiero agregar esta complejidad. Es por eso que codificamos duro estos valores aquí. Ahora en este método kip, pasamos paréntesis, página actual menos uno en datos por página Y en el límite, lo que vamos a pasar, derecho, pasamos por página datos y hecho. Déjame guardar esto para que podamos ver esto con claridad. Genial. Ahora bien, si revisamos nuestro terminal, obtenemos bandeja porque en nuestra base de datos, no tenemos más de cuatro datos, así que no obtenemos datos por página dos. Si cambiamos la página actual a una, guarda esta y mira aquí llegamos a los datos. Creamos consulta para paginación y desplazamiento infinito. Esta única consulta funcionará para ambas funciones. Espero explicar bien esto. Si aún tienes confusión, entonces trata de poner diferentes valores en estas variables. Apuesto a que entenderás esto. 71. Actualiza los datos: Ahora veamos cómo podemos actualizar los datos en Mongo DB. Entonces hay dos formas de actualizar los datos. En primer método, primero encontraremos el documento que queremos actualizar. Después de eso, modificamos su propiedad, y por fin, guardamos los datos actualizados en nuestra base de datos. Y segundo método es, usaremos métodos de actualización de mangos y actualizaremos directamente el documento en la base Después de eso, tenemos la opción de devolver datos actualizados dependiendo de nuestras necesidades. Ahora, ¿qué opinas qué método es rápido? Ahora bien, ¿qué opinas qué método es útil? Sí, el segundo método es más útil porque en el primer método, tenemos que hacer múltiples pasos, lo que podría llevar poco tiempo. Pero en el segundo método, usaremos métodos definidos por los mangos, por lo que no necesitamos preocuparnos por actualizar los datos por los nuestros propios Además, utilizaremos el primer método de acuerdo a nuestras necesidades. Ahora hay cuatro métodos para actualizar el documento. No te preocupes. Cada método es muy sencillo y fácil. Déjame mostrarte eso. Aquí abro el proyecto demo MongoDB Y aquí, supongamos que queremos actualizar nuestro ID de correo electrónico de usuario cuyo nombre es código bendiga. Así que creamos aquí una función sing llamada Update User. Y dentro de esta función, escribiremos nuestra lógica de actualización. Entonces para Update, usamos user Module dot. Aquí tenemos Actualizar un método. Ahora, igual que el método fine, podemos pasar aquí objeto de consulta en el que vamos a aplicar filtros o podemos decir condición. Entonces, ¿cuál es la condición aquí? El nombre de usuario debe ser código plus. Entonces hemos declarado qué usuario queremos actualizar. Ahora solo tenemos que pasar qué propiedad queremos cambiar. Entonces para eso, pasamos otro objeto en el segundo parámetro, y dentro de este, tenemos operador de conjunto de dólares y pasamos a objeto. Ahora en este objeto, especificaremos qué propiedad queremos cambiar con su valor actualizado. Por lo que queremos cambiar el correo electrónico a actualizado en el gmail.com rojo Así podemos adherir múltiples propiedades. Pero por ahora, solo queremos cambiar el correo electrónico. Ahora, como sabemos, esta expresión es tarea de Asnruners. Para que podamos adherirnos esperar. Déjame ahorrar para que podamos ver correctamente. Bueno. Ahora bien, esta expresión no devolverá el objeto actualizado. Veamos qué tenemos aquí. Así que lo almacenamos en la variable llamada resultado, y simplemente en la parte inferior, consola dot log este resultado. También en el lugar de esta función de usuario de Gate, llamamos a la función Actualizar usuario. Ahora, antes de guardar los cambios, asegúrese de detener la aplicación. Ahora guarda los cambios y echa un vistazo. Ejecute esta aplicación usando node index dot js. Ver, aquí no obtenemos datos de usuario actualizados, pero obtenemos alguna información básica sobre ddt task Verifiquemos cómo se actualizan los datos en la base de datos o no. Así que Pamongo sea brújula y vea aquí nuestro correo electrónico se cambia a updated@gmail.com Entonces así es como actualizamos los datos. Al principio, pasamos objeto de consulta con condiciones, y en el segundo argumento, pasamos operador de conjunto de dólares, y pasamos objeto con propiedades y valores actualizados. Tan simple como eso. Pero también hay que tener en cuenta que esta actualización un método sólo actualizará un documento, no todos los documentos que cumplan con esta condición. En ocasiones también queremos obtener el documento actualizado. No te preocupes, es realmente sencillo. En el lugar de actualización uno, pasaremos buscar uno y actualizar. Esto devolverá el documento antiguo antes de que estemos actualizando. Pero aquí queremos obtener el documento actualizado. Olvidando el documento actualizado, pasamos aquí, tercer objeto, y en eso pasamos nuevo a verdadero. También, como buena práctica, pasaremos otra opción aquí, que es ejecutar validadores a True Ahora podría preguntarse ¿qué es ejecutar validadores? No es nada que le estemos diciendo a nuestra consulta para asegurar que estos valores actualizados deben seguir el esquema del modelo. Además, permítame cambiar este valor de correo electrónico a blessthergml.com. Los cambios y echar un vistazo. Volvamos a ejecutar esta aplicación. Ver ahora obtenemos aquí valor actualizado. Así es como podemos actualizar los valores usando update one y find one and update method. Ambos son muy similares. Actualiza uno, no devuelvas el documento actualizado. Donde usando find one y update, obtenemos el documento actualizado, pero estos dos solo actualizan un documento. Ahora déjame darte una pequeña tarea aquí. Queremos actualizar el nombre del usuario cuyo ID es este. ¿Se puede escribir la consulta? Es realmente simple. Aquí en el objeto de consulta en el lugar de nombre, pasamos subrayado ID, y pasamos aquí nuestro ID de usuario en cadena Puedes copiar tu ID de usuario de Mongo DB Compass y también cambiar este valor de correo electrónico a XYZ en achmail.com Guarda los cambios y echa un vistazo. Ejecute esta aplicación. Consulta aquí obtenemos el documento actualizado. Encantadora. Entonces esto es muy sencillo. Muchas veces, queremos encontrar nuestro documento solo en base a su identificación única como lo hicimos actualmente. No queremos pasar ninguna otra condición porque este ID es único y no tiene sentido pasar otras condiciones. Cuando queremos actualizar los datos usando su ID en el lugar de buscar uno y actualizar el método, tenemos otro método de acceso directo, que es buscar por ID y actualizar. Ahora aquí no necesitamos pasar este objeto de consulta. En el lugar de eso, pasamos directamente nuestro ID en cadena. Los cambios y echar un vistazo. Ejecute esta aplicación. Ver, nuevamente obtenemos documento actualizado. Entonces cuando queramos encontrar usuario por su ID, usaremos bien por ID y actualizaremos. Ahora hemos visto estos tres métodos de actualización. Actualice uno, busque uno y actualice, y busque por ID y actualice. Si nota, todos estos métodos actualizan solo documento único que encontraron primero. Dos, actualizar uno y encontrar uno y actualizar sus nombres están mostrando que sólo están actualizando un documento. Y si hablamos de multa por ID y actualizamos, lo que estamos pasando aquí como condición, pasamos ID único, lo que significa que también actualizará solo registro único cuyo ID es este. Pero, ¿y si queremos actualizar varios documentos? Para ello, tenemos cuarto método de actualización, que es actualizar muchos. En el lugar de esta multa por identificación y actualización, agregamos actualizar muchos. Entonces aquí tenemos que volver a pasar su objeto de consulta en el que vamos a definir condiciones. Entonces pasas tu edad a 20. Entonces aquí estamos diciendo actualizar nuestros registros cuya edad es 20 y actualizar su correo electrónico a este valor. Déjame cambiar este valor de correo electrónico como hegmil.com. No necesitamos este tercer argumento, que son opciones porque esto solo funcionará para uno fino y actualizará y buscará por ID y actualización. Ver los cambios, y vamos a ejecutar esta aplicación. Ver, de nuevo, no obtenemos documento actualizado, pero si revisamos nuestra base de datos, nuestro valor se actualiza. Entonces, para resumir rápidamente, tenemos cuatro métodos para actualizar datos en Mongo DB Actualizar uno para actualizar un solo documento, actualizar muchos para actualizar varios documentos, buscar uno y actualizar para encontrar y actualizar un solo documento en un solo paso, último, buscar por ID y actualizar para encontrar un documento por ID y actualizarlo. Además, en find one y update, y find by ID y update method, pasamos Option object en que estableceremos new a true para obtener nuevos datos actualizados también ejecutamos validadores a true para seguir el esquema del modelo para valores actualizados. Tan simple como eso. 72. Actualiza operadores en MongoDB: Ahora hablemos de operadores de actualización. Los operadores de actualización se utilizan para modificar documentos durante una operación de actualización. En palabras simples, los operadores de actualización nos permiten actualizar rellenos específicos, incrementar valores, establecer nuevos datos, eliminar rellenos y mucho más Déjame decirte algo. Ya usamos un operador de actualización, que es un conjunto de dólares, pero tenemos muchos otros operadores de actualización. Así que dirígete al navegador y escribe operadores de actualización en Mongo DB Abre este primer enlace, y aquí podemos ver que tenemos operadores de actualización como fecha actual del dólar para establecer el valor del llenado a la fecha actual. Tinta dólar para incrementar el valor del relleno por cantidad específica Supongamos que alguien como el post, así podemos usar operador de tinta dólar para incrementar el valor del relleno. También en el operador de tinta, podemos pasar valores negativos que pueden disminuir el conteo. A continuación tenemos media, max, ML para multiplicar, renombrar, set, set on insert, set for remove the field from the document También en la parte inferior, tenemos operadores para array, pull, push, pull all, etcétera No te preocupes por estos operadores. Utilizaremos muchos de ellos en nuestros futuros proyectos. Por ahora, solo quiero presentarles a estos operadores de actualización. En la siguiente lección, veremos ¿cómo podemos eliminar documento de MongoDB 73. Eliminar los datos: Ahora veamos cómo podemos eliminar datos de la Div Mongo. Es muy similar a actualizar los datos. Tenemos cuatro métodos para eliminar los datos. Eliminar uno, eliminar muchos, buscar uno y eliminar, y el último, buscar por ID y eliminar. Ahora entiendes por qué me tomo más tiempo para explicar los métodos de actualización. Son muy similares a los métodos de eliminación. Veamos rápidamente estos métodos de eliminación. Aquí, creamos una nueva función ASN llamada delete user. Ahora dentro de esto, usamos user dot Delete one y lo que pasaremos en este método. Simplemente pasamos objeto de consulta porque aquí solo queremos eliminar el documento. No necesitamos especificar qué queremos actualizar, podemos pasar algo como este ID de ascore a algún ID de usuario, que copié de la brújula Mongo Dib Esto eliminará a este único usuario con su ID. Ahora podemos adherirnos a esperar, igual que antes, y simplemente almacenar su resultado invariable Este resultado es el objeto con propiedad de eliminación. No llegamos aquí documento. Ahora, déjame preguntarte una cosa. ¿Y si queremos obtener este documento eliminado en el resultado? ¿Qué método usaremos? Podemos usar aquí, encontrar uno y eliminar. Y aquí, no necesitamos cambiar nada. Así que en el lugar del método fine one y delete, podemos usar fine by ID y delete método. Pero cuando usamos fine by ID y delete, no necesitamos pasar aquí objeto con propiedad ID. Podemos pasar directamente así. No quiero pedir prestado mostrando estos métodos porque son casi los mismos, ¿verdad Imagina que queremos eliminar a todos los usuarios cuya edad sea mayor 15 y tampoco estén verificados. Es realmente simple. Usamos aquí, eliminamos muchos métodos, y en las blas de este ID, pasamos objeto de consulta, y dentro de él, edad debe ser mayor que 15 Y otra propiedad se verifica a falsa. Ahora vamos a la consola dot registrar este resultado. Y en el lugar de llamar a Update user function, llamamos función de usuario eliminada. Guarde los cambios y ejecutemos esta aplicación. Ver, aquí obtenemos borrado contar a uno porque sólo un documento está cumpliendo con esta condición. Y si revisamos nuestra base de datos, pues veremos que tenemos sólo un documento. Entonces eso es todo acerca de la operación de eliminación. Es realmente sencillo que actualizar los datos. 74. Ejercicio 01: configuración de MongoDB: Ahora es momento de hacer ejercicio, puedes practicar por tu cuenta lo que hayas aprendido en esta sección. Abre nuestro primer proyecto, Tarea track, que dejamos en la Sección cinco. Podemos practicar en ese proyecto. Si no tienes código de proyecto anterior, no te preocupes, puedes descargarlo desde abajo de esta lección. Ahora diseño este ejercicio para que pases por varios pasos de Mongo DB En primer lugar, paso uno, quiero que conectes este proyecto uno con la base de datos Mongo DB Puedes darle a esta base de datos nombre, pista de tareas o cualquier cosa. Después de conectarse con éxito a la base de datos en el paso dos, debe crear un esquema para almacenar Tudus. En tu proyecto, crea una nueva carpeta llamada models y dentro de esa carpeta, crea un nuevo archivo llamado Tudus dot js En ese archivo, hay que definir esquema y modelo para la colección de Tudos separados de nuestro otro código, y los rellenos deberían ser así Primero, tuvimos tarea en la que vamos a definir el texto para ese Tudó Asegúrate de que este relleno sea obligatorio. El siguiente llenado que tenemos es estado, que puede ser Tudó haciendo o hecho Tienes que pensar qué tipo de campo quieres usar. Además, el valor por defecto de este campo debería ser hacer. Ahora, el último campo es el texto, que es el área de valores en la que podemos agregar textos de lenguaje relacionados como SDML, CSS, JavaScript, react, node, etcétera, y eso es todo para este esquema Ahora el paso número tres, basado en este esquema, tiene que definir un modelo para la colección de Tudou Sencillo. Sé que puedes hacer esto. También agrego esta instrucción de ejercicio PDF a continuación de esta lección. Además, no te preocupes si no recuerdas los métodos de Mongo DB Puedes usar el resumen PDF que agregué al final de esta sección. El objetivo de este ejercicio es pasar por el proceso de los pasos de Mongo DB Así que dale tu 100% y luego mira la solución. Espero que resuelvas este ejercicio o intentes resolver este ejercicio y te quedes atascado en uno de estos pasos. No te preocupes, al menos intentas resolverlo. Así que date crédito por eso. Ahora veamos la solución. primer lugar, en nuestro proyecto, tenemos que instalar mangos porque sin Ted no podemos hacer otras cosas Por lo que NPM instala mangos en el rojo 8.8 0.0. Dios. Vamos a minimizar esta terminal. Ahora en nuestro archivo JS de punto índice, en la parte superior, ingresamos const mangos es igual a requerir Y después de esta ruta de Studos, escribimos mangos punto Connect En el primer argumento, pasamos un anillo sobrante, que es Mongo DV colon doble slash delantero, Anfitrión local Columna 27017 corte diagonal, y aquí escribimos el nombre de nuestra base de datos, que es TAS TAG Ahora, como sabemos, esta expresión devuelve una promesa. Entonces usamosart entonces método y dentro de él simplemente consultamos dot log Mongo DB se conectó correctamente. Ahora bien, ¿y si obtenemos error en esto? Así que también agregamos método de caché. Aquí, obtenemos el objeto de error, función de error y el registro de puntos de la consola. Conexión MongoDB llena. E imprima este error. Entonces el paso número uno está hecho. Ahora paso número dos, tenemos que definir esquema para tarea. Así que creamos una nueva carpeta en nuestro proyecto llamada models. Y dentro de esta carpeta, creamos un nuevo archivo llamado todos dot js. Ahora podría preguntarse ¿por qué tenemos que crear un nuevo archivo? No podemos definirlo en nuestro archivo index dot js. Sí, podemos definir el esquema y los modelos en el archivo JS de punto índice. Pero imagina que nuestro proyecto tiene cinco modelos diferentes. Piensa en lo desordenado que se vuelve nuestro código, agregamos cinco esquemas y modelos diferentes en nuestro archivo JS de punto índice Esta es la práctica del mundo real. Vamos a definir todos los modelos y sus esquemas en la carpeta separada, que es modelos Y sea cual sea el modelo que queramos crear, le damos su nombre al archivo. En este caso, es Tudos dot js. Aquí primero importamos Cs mangos es igual a requerir mangos Después de eso, creamos un nuevo esquema de puntos de Mongoose, y dentro de este, pasamos nuestros rellenos en objeto La primera es tarea, y la configuramos en cadena. Pero también, queremos que este llenado sea obligatorio. Entonces en el lugar de esta cadena, pasamos diferentes propiedades en objeto. Digamos tipo a cadena y requerido a true. A continuación tenemos estadísticas para objetar, nuevamente, escriba dos cadenas. Y aquí queremos dar los valores de campo. Así que escribimos la propiedad Enum a array, y aquí pasamos los valores Primero uno es hacer entonces podríamos tener haciendo, y luego escribimos hecho. Entonces, si tratamos de ingresar algún cuarto valor, entonces estos valores, entonces eso no va a funcionar. Además, queremos dar su valor por defecto, así que default y lo configuramos a todo. Bueno. Ahora siguiente, tenemos texto, que es array de cadena. Podemos pasar directamente aquí array y dentro de ella, pasamos string Done. Nuestro esquema está listo. Vamos a almacenarlo en una variable llamada esquema Tds. Pasemos al tercer paso. ¿Recuerdas cómo podemos definir el modelo? Utilizamos el modelo de punto de mangos. Aquí, primero pasamos el nombre singular de nuestra colección, que es Todo, que se convertirá en colección Todos. En el segundo argumento, pasamos esquema Todos. Ahora esto devolverá el modelo todo. Vamos a almacenarlo en variable llamada todo. Asegúrate de usar tu caso pascal porque este todos funciona como clase JavaScript. Terminamos nuestro primer ejercicio. En la siguiente lección, vamos a avanzar poco. 75. Ejercicio 02: para almacenar datos: Ahora pasemos al segundo ejercicio en el que recordaremos sobre la inserción de datos en Mango Div. Entonces aquí está el ejercicio a Instrucción PDF. También puedes descargarla desde el lado derecho. Además, agregué un archivo JSON en el que agregué ocho registros para Todos. Ahora en este proyecto, ya tenemos API para crear nuevo todo. Pero en esta API, simplemente estamos empujando nuevos datos a nuestra matriz local. En lugar de eso, queremos almacenar datos en nuestra colección de todos. Déjame darte aquí una pequeña pista. Podemos hacer cualquier cosa en la colección usando el modelo. Tienes que obtener el modelo de la carpeta de modelos y usarlo aquí. Aquí tienes una pequeña demostración para ti. Cuando enviemos una solicitud post API con este objeto JSON, en el back end, almacenaremos esos datos en nuestra base de datos y devolveremos los datos almacenados en la respuesta. Ya lo hicimos en esta sección. También puedes usar ese código de sección actual como referencia. Intenta resolver esto y luego mira la solución. Entonces espero que lo resuelvas o intentes resolverlo. Ahora veamos la solución. En primer lugar, tenemos que insertar registros en nuestra colección todos. Pero sabemos que estamos haciendo cualquier cosa con la colección, necesitamos ese modelo. ¿Cómo podemos obtener el modelo Tud aquí en este archivo de rutas Tu Dos? aquí en este archivo de rutas Tu Dos Bien, tenemos que exportar nuestro modelo de Tudos Modelo cinco. Entonces escribimos aquí, módulo punto Exportaciones es igual a este modelo Tud Esto exportará este modelo Tud como predeterminado. Guarde esto. En el TudoSrout en la parte superior, importamos Const Todo es igual a requerir ahora actualmente estamos en la carpeta rutas, y queremos acceder a la carpeta y queremos acceder a Así que tenemos que volver a nuestra carpeta usando modelos de doble punto hacia adelante slash, y dentro de este archivo todos dot js Bueno. Entonces tenemos el modelo Todo en este archivo. Ahora vamos a almacenar rápidamente esos datos de Todos dentro de la recolección. Entonces pasamos a la solicitud de post, que creamos para agregar new hacer dentro de nuestro array local. En primer lugar, podemos comentar este método Tudos array dot push, y en el lugar de esto, podemos escribir Nu para hacer Y aquí nos desmayamos para hacer objeto. La primera propiedad es tarea, y ¿cómo podemos conseguir la tarea? Justo en la parte superior, obtenemos el cuerpo de la solicitud y lo almacenamos en la variable do. Entonces en la parte inferior, escribimos para hacer punto Tarea. A continuación, tenemos status, que nuevamente obtenemos del estado de punto de Tudos y también etiquetas a etiquetas de punto Todo Aquí no estamos agregando ID porque se generará automáticamente por MongoDB Anteriormente, en esta sección, usamos aquí valor codificado duro, pero aquí estamos usando valores que obtenemos en el cuerpo de la solicitud. Tan simple como eso. Ahora, esto devolverá un objeto New to do y para guardarlo, escribimos aquí Nut dot save. Como ya sabemos, esta es tarea de corredores asíncronos. Por eso usamos aquí lejos. Pero mira aquí estamos obteniendo error de tiempo de ejecución. Para usar Avid, tenemos que hacer nuestra función asíncrona. Pero cómo es así que aquí en esta API, nuestra función es esta iniciada a partir de la solicitud y respuesta a este soporte CR. Ahora para hacer esta función asíncrona, antes de este paréntesis, pasamos una palabra clave. Tan simple como eso. Ver, el error se ha ido. Ahora, esta expresión devolverá los datos almacenados de la base de datos. Así que lo almacenamos en datos almacenados const variables. Y luego enviamos esta tienda para que haga como respuesta. Ahora veamos que esto está funcionando o no. Guarda los cambios y ejecutemos esta aplicación usando nodemon index dot js Se está ejecutando un buen servidor, y además conseguimos que Mongo Db se conecte con éxito Perfecto. Ahora usando nuestra extensión de cliente de licitación, enviaremos solicitud postal. Ya hemos guardado este crear para hacer API, así que usaremos directamente esto aquí en el cuerpo de la solicitud, en lugar de usar forma codificada, usaremos JS y formato. Facilitará nuestra tarea. Ahora abre JSNFle que adjunto con esta lección. Se puede descargar a medida que descarga PDF desde el lado derecho. Ahora, simplemente, copio el primero en hacer objeto y pegarlo en el cuerpo de la solicitud. Además, asegúrate de tener una API de prefijo en la URL y envía la solicitud. Ver, aquí obtenemos nuestros nuevos datos con ID autogenerado. Además, podemos comprobar que en el Mongo DBCompass ver, aquí obtenemos los Ahora adelanto esta lección y una por una, inserte todos todos. Bueno. Se puede ver cómo estamos progresando y resolviendo cada ejercicio paso a paso En el mundo real, también, hay que trabajar paso a paso. De esa manera, te confundes menos y trabajas con facilidad. 76. Ejercicio 03: busca datos: Ahora es el momento del tercer ejercicio, que diseño para recuperar los datos Después de agregar múltiples valores en la colección, quiero que escribas consulta para esta colección. Ya tenemos un método G para buscar todas las cosas que hacer. Puedes escribir todas las consultas una por una aquí y completar el ejercicio. El ejercicio tres primera consulta es que queremos recuperar todos los datos de dos Después de eso, la segunda consulta es Fatudos quien tiene etiqueta, reaccionar. Tercera consulta, esto es un poco complicado. Festuds que tiene etiqueta STML y también un estatus deben Tudar. Después de eso, cuarta consulta cuenta el número de Tudos cuyo estado está configurado para hecho La última quinta consulta es faz tudos en qué tarea, hay palabra crear, solo la palabra crear No debe incluir recrear creado, solo crear y también asegurarse de ignorar las mayúsculas y minúsculas aquí Como sabes, puedes usar mi PDF de resumen si no recuerdas los métodos y resuelves este ejercicio. Esto impulsará tu confianza, y así es como aprenderás en qué cosas necesitas enfocarte más. Además, si estás confundido en una consulta, entonces puedes avanzar con otras consultas y resolver otras consultas. Entonces espero que intentes resolver este ejercicio. Ahora, veamos rápidamente la solución. Para primera consulta, para obtener all to dos de la base de datos, aquí tenemos este GPI en que estamos devolviendo directamente esta matriz de todos Pero ahora queremos obtener datos de la base de datos, y luego devolveremos esos datos Entonces aquí escribimos todo dot find. Queremos todos, así que aquí no pasamos ninguna condición. Ahora bien, esta expresión es prometedora. Podemos esperar aquí y almacenar esos datos en una variable llamada todos. Ahora aquí obtenemos error de tiempo de ejecución. ¿Me puedes decir cómo podemos resolverlo? Hacemos nuestra función función asíncrona, y al final, enviaremos este todos como respuesta Guarde los cambios, y llamemos a este GTI PI. Aquí no tenemos este GIPI así que creamos una nueva solicitud, y en la URL, pasamos la columna host local 3,000 API SlaStudos y enviamos Ver, aquí obtenemos la lista de Tudos. Entonces resolvemos la primera consulta. Ahora pasemos a la segunda consulta. En estos, tenemos que parchear a los toudos que tiene tag react. Duplico esta línea y comento la primera consulta, ahora para encontrar ¿está disponible una sola cadena en la matriz o no? No necesitamos hacer nada especial. Pasamos directamente aquí, objeto, y agregamos aquí condición, texto, y en cadena, escribimos nuestra palabra clave, que es reaccionar. Yo en la matriz de texto hay algún elemento, igual que esto reacciona, entonces conseguimos que haga eso. También, podemos hacer lo mismo usando en operador. Ambos funcionan igual. Guarde los cambios y enviemos esta solicitud. Mira, aquí tenemos tres que hacer y todos tienen tag de reacción en ellos. Ahora pasemos a la tercera consulta, que es rápida todos, quien tiene etiqueta STML y su estado debe ser hacer Entonces en el lugar de esta etiqueta reaccionamos, pasamos STML y pasamos otro estado de condición a hacer Entonces podemos usar tu operador de dólar, pero ya sabemos que esto también funciona igual que ese operador. Guarda los cambios y echa un vistazo. Enviar la solicitud. Ver, aquí llegamos a Tudos Genial. Ahora pasemos a la cuarta consulta en la que tenemos que contar el número de tudos cuyo estado está configurado para hacer Déjame preguntarte algo. Deberíamos usar tu método fino o contar el número de tudos No, tenemos algo más. ¿Recuerdas que sí, utilizamos el método de contar documentos Entonces reemplazamos este método fino con documentos de conteo, y aquí pasamos condición a D. Guarda los cambios y echa un vistazo. Ver, aquí obtenemos cinco, lo que significa que el estado de cinco tareas está hecho. Ahora tenemos la última consulta, que es ir a buscar dos en qué tarea hay palabra crear Aquí, nuevamente agregamos método fino y en el lugar de esta condición de estado, tenemos una tarea y aquí tenemos que usar expresión regular porque estamos trabajando con cadena. Ahora bien, ¿recuerdas la sintaxis de la expresión regular? Sí, es patrón slash. Ahora para buscar una palabra específica, usamos Hacia atrás B, creamos Bwards B. Para hacer que esta palabra sea insensible a mayúsculas y minúsculas, usamos aquí, yo, guardamos los cambios y echamos un vistazo Enviar la solicitud y ver aquí obtenemos tres registros en los que tenemos crear Word en tarea. Así es como obtenemos datos de la base de datos en el mundo real. Espero que se te ocurra lo que estamos aprendiendo. 77. Ejercicio 04: actualización y eliminación de tareas: Ahora pasemos al cuarto ejercicio. No te preocupes, puedes resolverlo en solo dos a 3 minutos. En este proyecto, también hemos puesto método de actualización específico para hacer por su ID. La primera consulta de este ejercicio se actualiza tarea específica por su ID y sólo cambiar el texto de la tarea a actualizado para hacer. Como hay que devolver eso actualizado para hacer en la respuesta. Aquí puede copiar cualquier ID de objeto del pase Mongo Di BC y pasarlo en el parámetro de consulta Después de eso, la segunda consulta es, hay que actualizar todos los documentos cuyo estado actual está haciendo y actualizar esos estados con De. Además, aquí no tienes que crear una nueva API. Simplemente puedes escribir solo consulta de actualización y verificarla cuando te muestre la solución. En la última tercera consulta es, hay que eliminar una tarea específica por su ID. Aquí, también puedes usar cualquier identificación de la brújula Mongo Divi Y después de que se complete el proceso de eliminación, hay que devolver el objeto con propiedad de mensaje para que se elimine correctamente. Y para eliminar consulta, puedes usar delete API en nuestro código. Estos son ejercicios bastante simples. Puedes usar Resumen PDF o viendo la sintaxis. No te preocupes si tienes que vigilar la sintaxis de los métodos. Incluso a veces olvidé la sintaxis. Entonces no te preocupes con la práctica, conocerás esta sintaxis. Entonces espero que resuelvas este ejercicio o intentes resolver este ejercicio. Date crédito por eso. Ahora, veamos rápidamente la solución. Entonces, la primera consulta es que tenemos que actualizar la tarea específica por su ID y cambiar solo el texto de la tarea para actualizarla todo. Así que aquí tenemos ID, que estamos obteniendo de solicitud punto PAMs Ahora de cuerpo, solo necesitamos tarea para poder eliminar otros rellenos. No necesitamos este código porque escribimos esta lógica para la matriz local. Pero ahora tenemos los métodos MongoDB. Podemos escribir aquí para hacer punto. Ahora bien, ¿qué método usamos aquí? ¿Deberíamos usar Actualizar uno, buscar uno y actualizar, bien por ID, y actualizar o actualizar muchos? Sí, podemos usar cualquiera de estos cuatro. Pero aquí, tenemos que devolver el documento actualizado. Entonces simplemente se eliminan dos opciones, que es actualizar una y Actualizar muchas porque estas dos no devolverán el documento actualizado. Ahora sólo tenemos dos opciones. ¿Cuál es más simple? Tenemos que actualizar para ver con identificación. Entonces usamos aquí, encontramos por ID y actualizamos, y aquí pasamos este ID. Además, no necesitamos convertir este ID en entero porque el ID del objeto Mongo DV es una cadena Ahora en el segundo argumento, pasamos objeto con operador de conjunto de dólares y pasamos aquí objeto con tarea a tarea, que obtenemos del cuerpo de la solicitud. Ahora aquí hay una cosa. Si en objeto, nuestro nombre de propiedad y nombre de valor ambos son iguales, que es aquí tarea y tarea. Simplemente podemos escribirlo como tarea. Pero por dar este código, lo estoy guardando así. Ahora bien, ¿recuerdas que tenemos que pasar tercer argumento en este viento por ID y método de actualización? Aquí, pasamos nuevo a verdadero y también ejecutamos validadores a true Guardemos esto para que podamos ver con claridad. Bonito. Ahora sabemos que esta expresión es tarea asíncrona Entonces pasamos aquí un peso, y almacenamos valor actualizado en actualizado para hacer variable. También, para un peso, tenemos que pasar aquí asincrónica, y en la parte inferior, simplemente devolvemos esto actualizado para hacer Guarde los cambios y comencemos esta aplicación. Bueno. Abra la prueba API actualizada. Aquí tenemos cuerpo listo. Justo en la parte superior, necesitamos pasar el real to do object ID como parámetro. Así que copiamos cualquier ID para hacer del Mongo Di convertido en pase, y aquí en el lugar de este ID, pasamos nuestro ID y además nos aseguramos de que agreguemos menos prefijo API Enviar esta solicitud. Bien, obtenemos nuestros datos actualizados. Ahora pasemos a la segunda consulta, que es actualizar todos los documentos cuyo estado actual está haciendo y estado actualizado con hecho. Duplico esta consulta y simplemente comento esto. Ahora tenemos que actualizar aquí múltiples documentos. Entonces en el lugar de encontrar por identificación y actualización, usamos actualizar muchos. Aquí en el lugar de ID, tenemos que pasar objeto de consulta con estado de condición a hacer y queremos cambiar los datos como hecho. Además, eliminamos este tercer argumento. No lo necesitamos, guarda los cambios y no te preocupes por la identificación y el cuerpo de tareas. No los usamos en nuestra consulta. Enviar la solicitud. Ver, aquí obtenemos conteo modificado a uno, lo que significa que lo actualizamos con éxito. También puedes verificarlo desde la brújula Mongo Di B. Este es uno, correcto, trabajar con datos. A mí me encanta. Ahora pasemos a la tercera consulta. Es para eliminar una tarea específica por su ID. Entonces aquí ya estamos obteniendo ID de los PRMs de punto de solicitud Además, eliminamos este método entero pasado porque no lo necesitamos. Ahora solo necesitamos escribir consulta. Eliminamos este código anterior, y usamos para hacer punto, qué método usamos. Piénsalo. Necesitamos eliminar tarea específica por su ID. Sí, podemos usar Dilt uno, uno fino y eliminar, o también podemos usar bien por ID y eliminar Aquí, no especifico, necesitamos devolver documento eliminado o no. Entonces, para el primer rendimiento, utilizamos aquí DLT uno Si queremos documento eliminado, entonces usamos aquí, bien por ID y eliminar. Aquí pasamos objeto de consulta con propiedad ID de subrayado a ID Ahora al principio, agregamos esperar y almacenarlo en la variable llamada resultado. Ahora para esperar, en la parte superior, agregamos Async y en la parte inferior, devolvemos este resultado a este objeto JSON con esta propiedad message Guarda los cambios y echa un vistazo, copia cualquier ID de la base de datos y abre la solicitud de eliminación En W de este ID, pegamos nuestro ID, y además adherimos el prefijo de la API de slash y enviamos la solicitud Ver, obtenemos el recuento eliminado a uno, lo que significa que eliminamos con éxito el todo. Si actualizamos nuestra base de datos, C, solo tenemos siete todos. Uno a hacer se elimina de la base de datos, así es como realizamos la actualización y eliminación en Mongo DB Sé que esta sección es poco larga que otras secciones, pero como pueden ver, Mongo Deb es muy importante de aprender Por eso diseñé estos ejercicios específicos para el aprendizaje de Mongo Deb Si estás viendo este curso continuamente, entonces tómate un pequeño descanso de la pantalla. Bebe un poco de agua y cuida tus ojos. Nos vemos en la siguiente sección donde aprendemos temas avanzados de Mongo Deb 78. Sección 08: validadores incorporados: Bienvenido a la octava sección del curso Node JS definitivo. En esta sección, aprenderemos conceptos avanzados de Mongo DB Comenzamos con la aplicación de validadores en el esquema del modelo, devolviendo errores personalizados para esas validaciones Después de eso, veremos cómo construir relación entre colecciones, diferentes tipos de diseño de estructura de bases de datos, y cómo hacer patch muy rápido. Estos conceptos son muy útiles cuando queremos construir aplicaciones del mundo real. Empecemos esta sección. En la sección anterior en el proyecto demo de Mongo, creamos este esquema para nuestro modelo de usuario, y en el esquema, definimos el tipo de relleno y algunas otras propiedades como required Este requerido es un tipo de validador para este esquema. Anteriormente, solo los definimos, pero realmente no vemos la implementación práctica de validador para esquema Veamos qué pasó cuando intentamos agregar datos sin pasar el relleno de nombre. Cont out esta propiedad name desde aquí y en la parte inferior, en el lugar de la función de usuario delativo, llamamos función de usuario creativo Guarda los cambios, y en el terminal, vamos a ejecutar este nodo de aplicación index dot js. Ver, aquí nos sale el error. Vamos a desplazarnos hasta la parte superior. Aquí podemos ver que estamos obteniendo error de validación, validación de usuario llenada. Se requiere el nombre de la ruta de acceso del nombre. Ahora podrías preguntarte por qué estamos recibiendo este tipo de error largo. Entonces la razón es que no estamos manejando correctamente el error. Entonces aquí sabemos que este nuevo método de usuario dot cv devuelve una promesa, y es por eso que usamos esperar. Pero aquí estamos fingiendo que siempre obtenemos datos en este objeto y nos olvidamos de manejar el error Entonces, ¿recuerdas en la sección JavaScript asíncrona, cómo manejamos el error en los métodos de Asnawt Correcto, usamos try and catch blog. Entonces aquí también agregamos Tr blog mover nuestra tarea de acing en él. Ahora bien, si obtienes error al almacenar este usuario, nuestro código, muévete a catch blog. Aquí, obtenemos objeto error, y por ahora, simplemente consul dot log este objeto de error, y tiene una propiedad llamada message en la que obtendremos mensaje de error Guarde los cambios, y nuevamente, ejecute esta aplicación. Ver, ahora recibimos nuestro mensaje de error. Pero aquí también estoy recibiendo esta información de actualización. Déjame ver qué es lo que está mal. Sí, en la parte inferior, olvidé comentar esta función de usuario de actualización. Guarde los NGs, y volvamos a ejecutar esta aplicación. Ver, aquí nos llega nuestro mensaje de error. Esto es bueno y claro. En el mundo real, podemos devolver este mensaje de error como respuesta con el Código de Estado 400. Ahora, no te preocupes por eso. Ahora bien, ¿y si queremos pasar mensaje de error personalizado para este campo requerido? En el lugar de este valor true, pasamos array. En primer lugar, pasamos nuestro valor por lo requerido, lo cual es cierto. En segundo lugar, pasamos nuestro mensaje de error en cadena. Digamos, por favor ingrese el nombre de usuario. Guarda los cambios y echa un vistazo. Ver, aquí obtenemos nuestro mensaje de error personalizado. Los validadores nos ayudan a mantener la calidad y exactitud de los datos Mediante el uso de validadores, verificamos si los valores en el documento siguen las reglas que hemos establecido para cada relleno Hay dos tipos de validadores en los mangos. El primero está construido en validadores, que son los validadores predefinidos por mangos Segundo, tenemos validadores personalizados, que podemos definir por los nuestros propios. Requerido es una parte de los validadores incorporados. Déjame mostrarte otro construido en validadores de mangos. Para string, tenemos longitud mínima, que verificará la longitud mínima de la cadena, y pasamos la longitud mínima aquí. Después de eso, tenemos la longitud máxima que verificará la longitud máxima de la cadena. A continuación, tenemos match que valida cadena usando una expresión regular, y su sintaxis es slash pattern slash developer use this match validator for validates Por ahora, no queremos eso. Ahora supongamos para cada usuario, tenemos que mencionar el rol de ese usuario, que puede ser simple usuario o puede ser admin, y la cadena distinta a esta no será válida. Entonces en ese momento, establecemos el tipo a cadena para establecer las dos posibilidades, usamos aquí la propiedad num y la configuramos en array, y lo adivinaste correctamente, pasaremos nuestros valores en esta matriz Primero, puede ser usuario y segundo, puede ser admin. Podemos adherir tantos valores como queramos, pero tenemos que pasar uno de estos valores cuando guardamos nuevo usuario. Esto ya lo hemos visto en nuestro ejercicio. Recuerda, estos son los validadores para string. Además, hay dos validadores para el número también, mean y max, pero no queremos agregarlos aquí. Eso es todo validadores incorporados. Son muy útiles. Además, una cosa que quiero dejar claro es que los validadores son una característica de mangosta No hace nada con Mongo DB. Si de la base de datos de Mongo Debi, eliminamos el campo name de un registro, entonces Mongo Deb no le importa en nuestro esquema, establecemos el campo name Mangosta nos da estas características para que podamos validar los valores del usuario antes de almacenarlo en la base Si no es válido, mangosta no almacena esos datos en la base de datos, y si es válido, Mongo los almacena en la Tan simple como eso. Ahora en la siguiente lección, veremos cómo hacer datos válidos personalizados 79. Validadores personalizados: Ahora veamos cómo podemos establecer validadores personalizados en nuestro esquema Entonces aquí tenemos aficiones llenas, que es la matriz de cuerdas. Queremos asegurarnos de que el usuario debe agregar más de un hobby. Para ello, necesitamos definir validadores personalizados. Es realmente simple. Entonces después de esta propiedad tipo, aquí tenemos otra propiedad llamada validate, y pasamos aquí otro objeto. Ahora, dentro de este objeto, tenemos propiedad validador, columna, y aquí pasar la función validador Aquí queremos checar. El valor pasado para este campo tiene dos elementos o no, pero para eso, necesitamos el valor aquí. Obtenemos ese valor como parámetro, y lo llamamos V por valor. Ahora en esta función, podemos simplemente devolver condición. Déjame preguntarte, ¿cómo podemos verificar esto? V tiene dos elementos o no? Sí, podemos escribir aquí, longitud del punto debe ser mayor que uno. Y eso es todo. Veamos que está funcionando o no. Para eso, comentamos este campo de aficiones y también cambio el correo electrónico a Harley one. Guarde los cambios y ejecutemos esta aplicación. Ver, aquí obtenemos dos errores, uno para el nombre y otro para hobby. Validador falló para pasatiempos de ruta con valor cadena vacía Ahora imagina que devolvemos este error con nuestra API. Casi nadie puede entender este error. Entonces tenemos que dar mensaje de error significativo para cambiar este mensaje de error, después de esta función validador, tenemos propiedad de mensaje y pasamos aquí mensaje personalizado, por favor ingrese dos pasatiempos diferentes Asegúrese de que teníamos esta propiedad message en este objeto validador, no en la función validador porque he cometido este error mientras estoy grabando esta lección Guarde esto y ejecutemos esta aplicación una vez más. Ver, aquí obtenemos nuestro mensaje de error personalizado. Ahora probemos más cosas para este relleno. ¿Y si alguien pasa solo una afición? Comprobemos esto. Eliminamos el comando, y eliminamos otros dos pasatiempos de nuestra matriz. Guarde los cambios y ejecutemos esta aplicación. Bien, aquí estamos recibiendo el mensaje de error, está funcionando. Ahora bien, ¿y si alguien pasa aquí valor nulo? Guarde esto y ejecutemos nuestra aplicación una vez más. Ver, aquí obtenemos no se pueden leer propiedades de null, longitud de lectura. Ahora, ¿por qué estamos recibiendo este error? Porque en nuestros validadores personalizados, tratamos de obtener la longitud de este valor Pero si el usuario pasa null como valor, no podemos acceder a la propiedad length. Podemos adherir otra condición tipo de V es igual a array. Y su longitud debe ser mayor a uno. Si estas dos condiciones son ciertas, sólo entonces se validan nuestros datos. También podemos modificar el mensaje para que por favor ingrese la matriz de pasatiempos con dos pasatiempos diferentes. Guarde los cambios y ejecutemos esta aplicación. Ver, aquí también obtenemos el mensaje personalizado para el valor nulo. Entonces, para recapitular rápidamente para agregar validadores personalizados, tenemos propiedad válida después de la propiedad type Y en esa validar, podemos agregar dos propiedades. Uno es validador, que tiene una función validador, y otro es mensaje personalizado Y a partir de esta función validador, devolveremos la condición para la validación Podrías preguntar si queremos devolver la condición, entonces ¿por qué necesitamos esta función? Podemos agregar directamente condición aquí, pero verifique esto una vez más. En esta condición, siempre necesitamos el valor actual de ese relleno, y solo lo obtenemos en la función validador Por eso necesitamos esta función. Así es como definimos los validadores personalizados para el esquema. 80. Validadores asíncronos: A veces en nuestro proyecto, nuestra validación puede implicar algunas operaciones asincrónicas, lo que significa que la operación puede llevar tiempo Por ejemplo, queremos obtener datos de la base de datos, y en base a esos datos, queremos validar nuestro relleno En este caso, podemos aplicar validadores asíncronos. Déjame mostrarte. Para aplicar los validadores asíncronos en la versión anterior Aquí en el objeto validador, tenemos que agregar una propiedad llamada asincrónica a true Pero en la última versión de Mongoose, esta opción está activada por defecto . Podemos eliminar esto. Ahora podemos simplemente hacer esta función asíncrona y dentro de esta función, podemos realizar nuestra tarea asincrónica No queremos esa complejidad ni este modelo, así que para demostrar el retraso, utilizamos aquí el método de tiempo de espera establecido primer parámetro es la función callback, y segundo, agregamos 3,000 milisegundos Ahora, antes de esta función de tiempo de espera establecida, permítame consola de registro de puntos para obtener datos para su validación Ahora supongamos que después de 3,000 milisegundos, estamos obteniendo datos de la base de datos y en base a esos datos, podemos devolver cualquier condición Solo recuerda que tenemos que devolver condición como regresamos anteriormente, lo que significa que debe ser verdadera o falsa. Guarde los cambios y ejecutemos esta aplicación y veamos, aquí obtenemos nuestro error. Así es como podemos aplicar los validadores asíncronos. Yo personalmente nunca uso esto en mi proyecto porque las operaciones de acyc para la validación son raras, pero este tema puede ayudar a algunos de ustedes, y por eso agrego esta lección Ahora en la siguiente lección, veremos algunas opciones esquematizadas. 81. Opciones útiles de SchemaTypes: Ahora veamos opciones de tipos de esquema en mangoose. Ya los usamos en nuestro esquema, que es minúscula a verdad. Esto almacenará nuestra cuerda en minúsculas. Igual que esto, tenemos mayúscula a verdad. Esto almacenará toda nuestra cuerda en la mayúscula. Y después de eso, tenemos otra opción útil, que es stream to true. Esto eliminará el espacio en blanco innecesario de nuestra cadena. Por ejemplo, esto convertirá esta cadena en este tipo de cadena. Así que nuestros datos se ven bien organizados y limpios. No es necesario, tenemos que usar todas estas opciones de esquema en nuestro proyecto. Podemos usar lo que sea necesario de acuerdo a nuestro modelo. No hay reglas para eso. Al final, los validadores son solo para mantener la calidad y precisión de los datos 82. Relación entre modelos: Así que hasta ahora en este curso, hemos visto modelos o colecciones que son simples y no tienen conexión con otro modelo. Pero en el mundo real, la mayoría de nuestros modelos están conectados entre sí. Déjame explicarte con el ejemplo. Así que imagina que estamos trabajando en aplicación de redes sociales como Twitter. Entonces en eso, tenemos una colección para usuarios en la que almacenaremos todos los datos de los usuarios como nombre, correo electrónico, contraseña, etcétera Después de eso, tenemos una colección para post en la que almacenaremos todos los datos de post. En el post documento, tenemos contenido, que es la fecha del texto del contenido post cuando se creó esta publicación. Después de eso, tenemos usuario que subió este post, digamos Harley. Ahora bien, estos dos documentos o podemos decir colecciones no están conectados entre sí. Tenemos que conectarlos. A esto se le llama relación de modelo. Ahora podrías tener duda ¿por qué necesitamos conectar modelos entre sí? ¿Por qué necesitamos esa relación? Entonces, si no usamos la relación, podríamos terminar almacenando los mismos datos de usuario repetidamente para cada publicación que hagan. Supongamos que un usuario publica diez publicaciones diferentes. Si no usamos relación, entonces tenemos que almacenar esos mismos datos de usuario diez veces por cada publicación, y ese es solo un usuario. Imagínese en nuestra aplicación de redes sociales, hay 100 mil estudiantes o más que eso. Piensa cuántos datos tienen que repetir en nuestra base de datos, y esto también es más difícil de manejar. Entonces tenemos que usar relaciones entre modelos que tienen asociación. Ahora hay dos enfoques para implementar la relación. El primero es usar referencias, y otro son datos incrustados en otro documento. Primero veamos cómo podemos implementar la relación usando referencias. En el post documento, tenemos este usuario y pasamos nombre de usuario. Ahora, este usuario ya está disponible en la colección del usuario. En lugar de almacenar el nombre de usuario en la colección de publicaciones, podemos usar su ID de usuario de ese usuario. Por ID único del usuario, podemos ejecutar otra consulta para obtener los datos del usuario como nombre y foto de perfil de la colección de usuarios. Ahora para cada publicación, solo tenemos ID de usuario en el lugar del nombre de usuario. Pero podemos ver que hay que ejecutar otra consulta en este enfoque, lo que podría ocasionar problemas de rendimiento. No estoy diciendo que definitivamente causará problemas de rendimiento, pero a veces puede. El otro enfoque que puede resolver este problema son los datos incrustados en otro documento. En el lugar de pasar aquí ID de usuario, podemos pasar aquí objeto de usuario y eliminamos la colección de nuestro usuario. Este enfoque, no tenemos que correr a consultas, así que no enfrentamos aquí problemas de rendimiento, pero aquí hay una cosa. Imagina que el usuario tiene de 20 a 40 detalles. Eso hará que nuestro post documento sea mucho más grande. Además, provocará duplicación de datos ya que para cada publicación, tenemos que almacenar objeto de usuario. Ahora, algunos desarrolladores dicen que estos días el almacenamiento de bases de datos es barato. Podemos permitirnos la duplicación de datos y eso es cierto. Pero, ¿y si nuestro usuario quiere actualizar su nombre de usuario o ID de correo electrónico? Esa vez, tenemos que actualizar múltiples post y si de alguna manera dos o tres documentos no obtienen esas actualizaciones, entonces eso nos llevará a la inconsistencia de los datos Pero cuando usamos referencias, tenemos que actualizar los datos solo en un lugar. En resumen, cuando usamos referencias, obtenemos consistencia de datos porque nuestros datos se almacenan en un solo lugar, pero podríamos obtener problemas de rendimiento porque en eso tenemos que ejecutar múltiples consultas. Otro lado, cuando incorporamos datos en otro documento, obtenemos rendimiento. Obtenemos nuestros datos más rápido porque no necesitamos ejecutar múltiples consultas. Tenemos nuestros datos en un solo documento, pero con eso, obtenemos inconsistencia de datos porque tenemos los mismos datos en múltiples lugares Esto es comprar uno y obtener uno gratis. Tenemos que decidir por nuestra aplicación. Necesitamos consistencia de datos o queremos rendimiento. Si queremos consistencia de datos, entonces usamos referencias, y si queremos rendimiento, entonces incrustamos datos en otro documento. Diferentes proyectos tienen diferentes requerimientos. Como desarrollador, tienes que decidir qué enfoque funciona mejor para tu proyecto. Hoy en día, los desarrolladores utilizan el enfoque híbrido, que combina estos dos enfoques, y lo veremos en la siguiente lección. 83. Enfoque híbrido para las relaciones: Hemos visto cuando usamos referencias, obtenemos consistencia de datos, y cuando incorporamos datos en otro documento, obtenemos rendimiento. Déjame mostrarte el enfoque híbrido que los desarrolladores utilizan hoy en día. Supongamos que tenemos usuarios que tienen de 20 a 30 propiedades, almacenaremos los detalles de esos usuarios en la colección del usuario. Ahora para el post, tenemos estos otros campos, mismos que vemos en el enfoque de referencia. Pero en enfoque de referencia, almacenamos aquí ID de usuario. El lugar de eso, podemos usar aquí, pequeño objeto de usuario, que contiene solo propiedades necesarias que queremos mostrar con post. Podríamos tener ID de usuario, que es la referencia a la colección del usuario y al nombre de usuario. No almacenamos aquí todas las 20 a 30 propiedades, pero vamos a incrustar sólo esa cantidad de datos. Queremos exhibir con post. Con este enfoque, podemos obtener rápidamente post porque no necesitamos buscar múltiples consultas Tenemos todos los datos necesarios en un solo objeto. Este enfoque funciona mejor cuando nuestra colección necesita pequeños detalles a los que se accede con frecuencia. Por ejemplo, en nuestro proyecto de comercio electrónico, donde tenemos productos, pedidos, carrito, etcétera Cada pedido, queremos usar pequeños detalles de nuestros productos como ID, nombre, imagen de portada y precio porque queremos mostrar los detalles de ese pedido con los productos. Así que tenemos una recopilación separada para los datos de los productos, pero aún así vamos a incrustar algunos pequeños datos sobre los productos en cada pedido. Entonces, cuando queremos un acceso rápido a pequeños detalles, pero también queremos hacer referencia a datos grandes o complejos, entonces usamos el enfoque híbrido. De nuevo, te estoy diciendo que no tienes que apegarte a un solo enfoque. Alguna aplicación funciona mejor con referencias. Así que funciona mejor con datos incrustados, y algunos funcionan mejor en este enfoque híbrido. Tienes que decidir de acuerdo a las necesidades de tu proyecto. No te preocupes cuando construimos otros dos proyectos, te mostraré cómo podemos decidir el enfoque de relación. Estoy hablando de relación entre colecciones, no de otro tipo de relación. 84. Aplicación del enfoque de referencia: Veamos cómo podemos aplicar enfoque de referencia para la relación. Para practicar este concepto, creé este nuevo archivo porque no quiero que te confundas con ese núcleo desordenado Déjame explicarte lo que agregué en este archivo. Primero, conectamos este archivo con base de datos Mongo DB llamada Mongo esa es la relación. Después de eso, como vemos en el ejemplo, definimos aquí esquema de usuario simple con solo tres rellenos, nombre, correo electrónico y edad. Después de eso, definimos un nuevo esquema para post. En eso tenemos dos rellenos de contenido, que puede ser texto y luego fecha, que es la fecha actual en tiempo real. Tenemos usuario que agregaremos en solo un minuto. Después de eso, creamos dos modelos para usuarios y recolección de publicaciones. Ya hicimos esto. No quiero aburrirte escribiendo el mismo código una y otra vez. Ahora, después de crear estas dos colecciones, defino pocas funciones. Uno es para crear usuario en el que podemos crear un nuevo usuario y almacenarlo en la colección del usuario. A continuación tenemos la función Crear Post en la que creamos un nuevo post usando contenido y datos de usuario, quien creó este post. La última función es para obtener todas las publicaciones de la base de datos. Ya hemos visto todo esto. Vamos a crear el primer usuario con estos valores. Ejecute esta aplicación usando nodo, punto de referencia JS. Bueno. Ahora intentemos crear una nueva publicación sin agregar ningún dato de usuario. Aquí comento esta función de crear usuario y eliminar comentario de la función Crear publicación. Volvamos a ejecutar esta aplicación y veamos aquí creamos un nuevo post. Tenemos contenido y vemos, no obtenemos ningún dato de usuario, incluso si pasamos usuario como rellenado los nuevos datos de usuario. Podemos ver que los mangos solo agregarán aquellos rellenos que definimos en el esquema No agregará todos los demás rellenos. Ahora en este modelo de post, tenemos que agregar el campo de usuario y le damos referencia de usuario a partir de la colección de usuarios. Déjame mostrarte a lo que me refiero. Aquí, agregamos usuario. Ahora siempre que queramos dar referencia, podemos dar eso usando ID de objeto porque es único. Pasamos su tipo a Mongos esquema de punto tipos de punto, punto ID de objeto Sí, tenemos que pasar esta expresión para definir el ID de objeto como tipo relleno. Después de la propiedad tipo, tenemos que decir qué otra referencia de modelo estamos agregando. Pasamos RF dos y aquí pasamos nuestro nombre de colección en palabra singular. Igual que pasamos en este método de modelo de punto mangosta, que es usuario Ahora pasemos nuestro ID de usuario en la función create post. En el Mongo D BCMEPass obtenemos la nueva base de datos llamada En eso, obtenemos colección de usuarios, copiamos este ID de usuario, que acabamos de crear y pegarlo en el lugar de esta cadena de usuarios. En la función Crear publicación, teníamos este ID en el lugar del usuario. También cambiemos este contenido a contenido también. Entonces los cambios, y vamos a ejecutar esta aplicación. Mira aquí también obtenemos nuevo post con contenido, y también obtenemos aquí ID de usuario, que es la referencia al modelo de usuario. Agregar una referencia es muy fácil. Tenemos que establecer ese tipo de relleno a Mongos punto esquema punto Tipos punto ID de objeto, y pasamos propiedad ref para agregar el nombre del modelo de referencia en palabra singular Ahora, si tratamos de conseguir post, así que comente esto y elimine el comentario de esta función de publicación G. Guarda los cambios y echa un vistazo. Ver, aquí tenemos dos post. Primero, que creamos sin usuario y segundo en el que definimos ID de usuario como referencia. Ahora podrías preguntar estamos consiguiendo aquí ID de usuario simple. ¿Cómo podemos obtener los datos del usuario como nombre de usuario o correo electrónico de esa referencia? Esto lo veremos en la siguiente lección. 85. Cómo extraer datos de la referencia [Populate]: Veamos cómo podemos extraer datos usando este ID de referencia? Es realmente simple. Para obtener los datos por referencia, utilizamos un método llamado populate. Después de este método fino, agregamos punto poblar y dentro de este, tenemos que pasar el nombre de relleno que es la referencia Sí, es usuario aquí. Guarda los cambios y echa un vistazo. Vuelva a ejecutar este archivo. Ver, aquí volvemos a llegar a publicar. En el segundo post, obtenemos todos los detalles de ese ID de usuario. Ahora imagina que solo queremos llegar aquí nombre. No necesitamos otros rellenos. ¿Podemos hacer eso? Sí, podemos. En el segundo argumento, pasamos el nombre de las píldoras que queremos obtener de nuestra colección de referencia. En códigos, agregamos nombre, guardamos esto y ejecutemos esta aplicación una vez más. Ver, aquí obtenemos solo nombre y subrayado ID. Ahora, en lugar de solo mostrar el nombre, queremos todos los detalles sobre el usuario, pero solo no necesitamos esta edad. ¿Cómo podemos hacer eso? Ay lugar de nombre, queremos eliminar, menos ge Muy sencillo. Así es como extendemos los datos de referencia utilizando el método popular. Ahora déjame decirte algo. Teníamos referencia en nuestro modelo, solo los mangos usan esa referencia A Mongo Deb no le importa eso. Incluso si pasamos aquí ID de usuario no válido, Mongo DB no verifica que el ID de usuario esté disponible en la colección del usuario o no Almacena los datos sin preocuparse por ello. Déjame mostrarte eso. Creamos aquí otro post. Comenta esta función de publicación de Gad y elimina el comentario de esta función de crear publicación Cambiemos este contenido a tres, y simplemente modificamos este último carácter de ID de usuario. En la colección de nuestro usuario, no tenemos ningún usuario cuyo ID sea este. Ahora vamos a ejecutar esta aplicación. Ver, nuestro usuario tres se crea aquí. Ahora vamos a obtener la lista de post, comentar esta función y llamar a esta función Gad Post Los cambios y ver para el tercer post, conseguimos que el usuario nulo porque no obtenemos una referencia para ese ID de objeto no válido, lo que demuestra que MGB no verifica que ID de usuario esté disponible en la colección del usuario o no Ahora en la siguiente lección, veremos otro enfoque que está incrustado en otro documento. 86. Aplicar el enfoque de incrustación: Para aplicar enfoque embebido, no elimino el código anterior porque quiero darte este código para referencia. Descargamos el archivo incrustado punto JS de abajo, o lo conseguirás en la carpeta de la sección de recursos ocho. Ahora en el enfoque de referencia aquí para usuario llenado, pasamos tipo a ID de objeto y lo hacemos referencia con colección de usuarios. Pero en el enfoque incrustado, agregamos directamente aquí objeto de usuario con todas las propiedades. No creamos aquí modelo de usuario, eliminamos esta línea, solo creamos un modelo que es post. Además, podemos eliminar la función de crear usuario de la parte inferior porque para cada post documento tiene un objeto de usuario. Ahora podemos agregar aquí objeto y tenemos que pasar aquí las propiedades que necesitamos para este objeto de usuario. Podemos decir nombre a cadena, correo electrónico a cadena y edad al número. Ahora lo malo de este objeto de usuario es que nuestro usuario puede pasar ningún valor para el nombre, correo electrónico o edad. Tenemos que pasar las validaciones para estos rellenos porque necesitamos objeto de usuario en cada post Entonces, en lugar de agregar aquí validación, ya tenemos esquema de usuario. Entonces en el lugar de pasar este simple objeto, pasamos aquí esquema de usuario. Este esquema, podemos agregar todos nuestros validadores así como tenemos colección separada También, para definir el esquema por separado tiene un beneficio más. También podemos usar ese esquema de usuario para otra colección en la que también queremos incrustar los datos del usuario. Ahora vamos a crear una nueva publicación con estos datos de usuario incrustados. Entonces elimino esta llamada a crear función de usuario, y llamamos a la función Create Post. Ahora en el lugar de este usuario, tenemos que pasar user object porque ese objeto user se almacenará directamente en el post documento. Para el usuario, pasamos objeto con nombre de propiedades al código de correo electrónico a código etheridgmil.com Edad, digamos 25. Guarde los cambios y ejecutemos este archivo s incrustado. Entonces nodo, incrusta, y presiona Enter. C, obtenemos una nueva publicación con objeto de usuario que tiene nombre, correo electrónico y edad. Y si también revisamos nuestra base de datos en la parte inferior, obtenemos post con objeto de usuario. Entonces en la referencia, simplemente pasamos ID de objeto y agregamos referencia a otra colección. Pero en el enfoque incrustado, agregamos directamente datos de usuario completos en un solo documento. Ahora tengo una pregunta. ¿Y si hacemos que este campo de nombre sea obligatorio y luego no pasamos nombre en el objeto del usuario? ¿Nuestro post creará o no? Esto no es parte de la lección que realmente quiera ver. Vamos a et esto. Aquí en el lugar de nombre a cadena, agregamos object, type to string, y required to true. Ahora en la parte inferior, eliminemos este campo de nombre y cambiemos este contenido a error de prueba. Guarda los cambios y echa un vistazo. Oh, obtenemos un error de validación, lo que significa que no se crea un nuevo post, y también podemos verificarlo en nuestra base de datos. Ahora imagina que queremos almacenar 20 a 30 propiedades para los datos de los usuarios. No podemos agregar todos esos rellenos en cada post documento. A, supongamos que queremos obtener datos de los usuarios como correo electrónico y contraseña entonces ¿cómo podemos obtener esos datos por separado sin obtener todos los post Este método incrustado no es realmente práctico para los tipos de aplicaciones de redes sociales. Es por eso que los desarrolladores utilizan enfoque híbrido para lograr el equilibrio en la aplicación, e implementaremos el enfoque híbrido en la siguiente lección. 87. Aplicación de un enfoque híbrido: Implementemos el enfoque híbrido en la misma plantilla de código. Nuevamente agrego el mismo código en el archivo híbrido dot js. También puedes descargarla desde lo siguiente de esta lección. Ahora en el enfoque integrado, agregamos la propiedad de todos los usuarios en una sola colección y ni siquiera creamos la colección de usuarios. Ahora en el enfoque híbrido, creamos colección de usuarios en la que podemos agregar todas las propiedades. Pero lo que vamos a añadir en el campo del usuario de la colección post porque este post document necesita datos de usuarios que crearon esa publicación así que en vez de pasar aquí todos los usuarios propiedad, solo agregamos pocas propiedades que requerimos con post. Por ejemplo, con post, queremos mostrar el nombre de usuario y el correo electrónico de ese usuario. No queremos ahí, así que agregamos nombre, que puede ser cadena, y queremos mostrar la foto de perfil de ese usuario, que puede ser cadena de URL de la foto de perfil Por lo que nos adherimos solo los rellenos necesarios para el usuario. No todo el documento. Ahora bien, esto funcionará perfectamente bien. Pero y si tal vez en algún caso, queremos más información sobre usuario con el post. Algunos desarrolladores también se adhieren al usuario Rf, que es la referencia del usuario. Es la misma referencia que agregamos en la lección de referencia anterior. Dijimos que es tipo a Mongos punto esquema punto Tipos punto Id. de objeto Lo que agregamos aquí sí ref al usuario. Además, podemos cambiar este nombre de campo a resumen de usuario. Creo que esto es mucho mejor. Ahora cambiemos un poco en la función create post. Aquí, agregamos ID de usuario en el parámetro, y en esta publicación, cambiamos este campo de usuario a resumen de usuario y después de eso, otra propiedad usa una referencia a este ID de usuario. Ahora en la parte inferior, llamamos a esta función create post. Aquí podemos cambiar el contenido. Esta es forma híbrida y pasa el nombre de tu objeto a los códigos y la foto de perfil al punto de perfil JPG. Para ID de usuario, copio el ID de la base de datos. Y pega el ID aquí. Guarda los cambios y echa un vistazo. Ver, aquí obtenemos nuevo post con resumen de usuario y representante de usuario. Llegamos los dos. Si deseas mostrar datos rápidamente sin llamar a consulta múltiple, entonces usaremos este resumen de usuario y si queremos más datos de usuario, sólo entonces usaremos esta referencia de usuario. De esta manera, podemos optimizar el rendimiento y además obtenemos los datos que queremos. Usa lo que mejor funciona para tu aplicación. Al final, esto no es tuyo. 88. Índices en MongoDB: Ahora hablemos de índices en Mongo DB. Índices es tema muy interesante e importante de Mongo DB Index se utiliza para hacer que nuestra consulta de base de datos sea rápida, y también veremos la demo de eso. Incluso Mongo DB dice que con los índices, nuestra consulta de búsqueda de base puede ejecutar Tenex más rápido que antes, lo cual es realmente avanzado y genial Ahora podría preguntarse cómo índice hace que nuestra consulta de búsqueda sea más rápida. Déjame explicarte con el ejemplo. Imagina que tenemos aquí el listado de cien usuarios datos y queremos encontrar un usuario cuyo correo electrónico es este y123 atgmil.com Ahora como funciona la consulta real, recojo un objeto de documento, compruebo su correo electrónico es él 123 aterra gmail.com Si no lo es, entonces se moverá a otro objeto de documento y nuevamente revisará ese correo electrónico. Continuará con este proceso hasta que se escanee el documento de los cien usuarios. Como pueden ver, esto es un poco lento. ¿Cuál es la solución aquí? Crearemos un índice para nuestro correo electrónico lleno de colección. Con solo crear el índice de correo electrónico llenado, nuestra consulta de búsqueda para correo electrónico se volverá más rápida. Veamos esto prácticamente. En nuestra colección de usuarios, actualmente, solo tenemos un usuario. Agreguemos algunos datos de usuarios falsos en nuestra recopilación. Así que prácticamente podemos ver nuestra consulta está funcionando mejor o no. Para eso, en la carpeta de la sección ocho de recursos, agregué un archivo, probando index dot js. Simplemente en este archivo en nuestro proyecto. Y en este archivo, agregué casi el mismo código que antes. Primero, colección Mogadbi, aquí tienes que escribir tu nombre de base cual estás utilizando para esta sección A continuación, creamos el esquema de usuario con nombre, correo electrónico y contraseña, para que podamos enfocarnos en nuestra consulta. Entonces en la parte inferior, tenemos funciones. El primero es para insertar algunos datos aleatorios en la colección del usuario. Ver, mediante el uso de este sencillo for loop y este paquete faker, podemos generar nombre de usuario aleatorio, correo electrónico y contraseña para pruebas Para eso, en nuestro proyecto, tenemos que hacer NPM install en el faker rojo Js faker, a la tasa Y dale a Enter. Bueno. Ahora, simplemente llamemos esta función para generar datos de 100,000 usuarios porque aquí estamos ejecutando este bucle 100,000 veces. Y aquí no queremos obtener error en el correo de adición, así que elimino el relleno único a true de nuestro esquema solo para permitir que entren 100 mil usuarios. Además, de tu base de datos, elimina esta colección de usuarios, para que obtengamos todos los datos frescos. Deja caer la colección y escribe aquí usuarios y suelta la colección. Ahora en nuestro archivo de prueba inExis, llamamos aquí Insertar función de usuarios de prueba Guarde esto y simplemente ejecutemos este archivo. Prueba de nodo en el eje dot js y pulsa Enter. Va a tomar poco tiempo y ver aquí conseguimos mensaje de éxito. Si revisamos nuestra base de datos, actualizamos la colección, S en la colección del usuario, obtenemos datos de 100,000 usuarios. Encantadora. Ahora primero, comentamos esta inserción de esta función de datos Ya no queremos ejecutarlo. Ahora veamos qué encontrar usuario por correo electrónico, cuánto tiempo está tomando. En la parte inferior, tenemos la función llamada find user. En esta función, primero, declaro tiempo. Después de eso, ejecutamos user dot Fine query en la que estamos pasando el parámetro de correo electrónico a correo electrónico. Después de completar esta consulta, nuevamente declaramos timer, que es la hora de finalización, y aquí simplemente mostramos la hora de finalización menos la hora de inicio. Por esto, obtendremos cuánto tiempo está tomando esta fina consulta. Además, el punto de rendimiento ahora es más preciso y confiable para medir el tiempo de ejecución. Ahora, llamemos a esta función de usuario fina. Luego, de la colección de nuestro usuario, copiemos cualquier correo electrónico y pasemos ese correo electrónico en nuestra función de usuario fina con códigos. Guarda esto y en la terminal, terminamos el código y volvemos a ejecutar nuestro índice de degustación punto JSFle Mira, aquí tenemos tiempo 130 milisegundos. Ahora creemos un índice para nuestro relleno de correo electrónico y probemos lo rápido que será nuestra consulta. Para crear index, aquí antes de crear colección, agregamos userschema dot index y dentro de este, pasamos object email, que es el nombre de relleno, queremos marcar como índice, y como valor, podemos pasar dos cosas una y menos una Ahora podría preguntarse, ¿cuál es el significado de uno y menos uno? Es realmente simple. Uno es para orden ascendente y menos uno es para orden descendente. Cuando creamos índice, Mongo DB disparó que rellenan los datos en orden ascendente o descendente Esto ayudará a Mongo Deb a encontrar datos rápidamente. No te preocupes, te lo explicaré después de la degustación. Aquí pasamos uno para orden ascendente y hecho. Así es como creamos índice para correo electrónico llenado, una línea de código. Todo el otro código en este archivo es para degustación, no te preocupes por eso. Solo queremos ver creando índice, nuestra consulta se está volviendo rápida o no. Así que aquí volvemos a ejecutar esta misma función find user y vamos a ejecutar este archivo. Mira, aquí obtenemos 133 milisegundos. Déjame ejecutar este archivo una vez más. Mira, ahora solo toma 76 milisegundos. Me sale tanto tiempo porque en mi sistema, actualmente se están ejecutando muchos softwares grandes Anteriormente, cuando pruebo esto sin ningún software, está tardando 60 milisegundos antes agregar el índice y después de agregar el índice, solo toma cuatro milisegundos Es casi 15 ngs más rápido que sin consulta de índice. Esto es realmente interesante. Además, estamos obteniendo el tiempo de consulta en milisegundos porque actualmente nuestra aplicación se está ejecutando localmente y también nuestra base de datos es local Si desplegamos ambas cosas en Internet, entonces los 130 milisegundos pueden llegar a ser 1.3 segundos con index, ejecutamos esa misma consulta en 0.7 segundos. Imagina lo rápido que se vuelve nuestro sitio web , por eso la indexación es muy útil Déjame mostrarte el índice que creamos. Abra la brújula Mongo Divi, vamos a los índices Ver, aquí tenemos dos índices. El primero es para ID de subrayado, y el segundo es para correo electrónico Entonces en la colección Mongo Di B, Mongo DB siempre crea índice para subrayado ID archivado, y esa es la razón cuando buscamos datos por su ID, entonces obtenemos esos Ahora aquí en la parte inferior, tenemos otra función llamada width index. En esta función, primero creamos índice manualmente usando esta línea, y luego escribimos consulta fina. Al final de la consulta, utilizo este método explicado. El método explain te ayuda a analizar cómo Mongo DB ejecuta una consulta Muestra si Mongo DB está usando un índice o realizando un escaneo de colección completa Dentro de esta explicación, pasamos las estadísticas de ejecución de cadenas y simplemente unst log a estos usuarios Veamos qué obtenemos dentro de esto. Aquí en el lugar de la función de usuario fina, agregamos la función de índice B y simplemente me dejó mover esto en la parte inferior. Los cambios y echar un vistazo. Vamos a ejecutar esta aplicación usando nodo, índices de degustación punto js. Mira aquí obtenemos todos los detalles sobre la consulta como estadísticas de ejecución, comandos, información del servidor, y mucho más. Aquí solo necesitamos ver las estadísticas de ejecución. Aquí podemos ver y volver a uno, lo que significa que se devuelve un dato del squery si vemos el total de documentos examinados, que también es uno, si no creamos aquí índice para campo de correo electrónico, entonces estos documentos totales examinados serán mucho más altos que esto Déjenme mostrar eso también. Aquí tenemos sin función de índice. Primero en esta función, elimino todo el índice de nuestra colección de usuarios, y luego ejecutamos la misma consulta con el método explicado. No te preocupes en nuestra aplicación de nodo real, solo usaremos el método userschema dot index cuando definamos el esquema de la colección Agregué estos dos métodos para simplemente eliminar y agregar índice usando la función. Ahora llamemos a esto sin función de índice y pasemos aquí el mismo correo electrónico. Ahora otra vez, ejecute este archivo, nodo probando índices punto js. Consulta aquí en los estados de ejecución, obtenemos el número regresa a uno y el total de documentos examinados a 100,000. Por eso está tomando más tiempo que con el índice. Anteriormente, si verificamos con índice, obtenemos los documentos totales examinados a uno, y es por eso que al crear índice, nuestra consulta se vuelve rápida. Ahora podría preguntarse ¿cómo por índices nuestra consulta se está volviendo así mucho más rápida? ¿Qué está pasando aquí? Eso lo veremos en la siguiente lección. 89. Cómo funcionan los índices en MongoDB: Entonces anteriormente tenemos problema. Nuestra consulta de base de datos está escaneando los cien mil documentos uno por uno para encontrar correo electrónico específico, lo que hace que nuestra consulta sea lenta. Y resolvemos ese problema simplemente aplicando índice para correo electrónico llenado. Pero la pregunta principal es ¿cómo? ¿Qué sucede detrás de escena cuando aplicamos índice? Déjame explicarte con interesante ejemplo. Imagina que estás en una biblioteca con 100 mil libros. Ahora, necesitas encontrar libro titulado Harry Potter. Ahora bien, si los libros no están dispuestos en ningún orden, hay que comenzar desde el primer libro, revisando cada título uno por uno y continuar ese proceso hasta que encuentre el libro de Harry Potter. Esto es como escanear los 100 mil documentos en Mongo Di B sin un índice que podemos considerar lento Ahora, digamos que la biblioteca crea un índice, algo así como la lista para almacenar la información de los libros. Esa lista, o podemos decir en ese índice, tenemos títulos de libros, que ordenamos alfabéticamente, y también agregamos un puntero al yo exacto o ubicación en la que se coloca ese libro Ahora cuando buscas a Harry Potter, vas al índice, encuentras a Harry Potter en segundos porque está ordenado alfabéticamente, y luego con el título del libro, agregamos el puntero Usas ese puntero para ir directamente al libro. En lugar de escanear 100 mil libros, encontrarás tu libro en solo un milisegundos. En Mongo DB, también, cuando creamos índice, Mongo Di B crea una estructura similar a un árbol, que llamamos como árbol B o árbol equilibrado y acortamos nuestros datos en orden ascendente o descendente dependiendo de que pasemos el valor como uno o menos uno Con ese relleno, se almacena el puntero que hace la ubicación del documento original. Al crear índice, reducimos el número de escaneos de documentos y por eso, nuestra consulta fina se convierte en f para ese relleno. Ahora podrías preguntar los datos cortocircuitados, también, tenemos que encontrar nuestros datos, cómo está tomando menos tiempo que revisar todos los documentos uno por uno Esta es la pregunta realmente genial. Déjame explicarte eso. El caso es, supongamos que si tienes matriz sin clasificar y una matriz en cortocircuito en ambas, quieres encontrar el elemento 60 Entonces en la matriz de ambos, no necesitamos escanear cada número, ¿cómo puede esa matriz ordenada tomar menos tiempo? Como vemos anteriormente, cuando creamos índice, Mongo B crea estructura de árbol de batería o equilibrio con puntero adjunto a cada dato Pero en esta Batería, Mongo Dib también tiene que buscar datos, y para buscar los datos, Mongoi utiliza otra técnica de búsqueda, a la que llamamos como búsqueda que llamamos como Entonces, cuando no creamos índice, Mongo Db usa la técnica de búsqueda lineal, lo que significa que Mongo Db verifica los datos uno por uno para todos los documentos Y si creamos índice, entonces Mongo Dib usa la técnica de búsqueda binaria Déjame explicarte rápidamente cómo funciona la búsqueda binaria para que puedas entender mejor. Imagínese aquí hemos cortocircuitado matriz de números diez, 20, 30, 200 En esta matriz, queremos encontrar 60. Ahora hay dos formas. Primero, comprobamos diez es 60, no, 20 no. 30, no. 40, no. 50, no. 60, sí. Entonces aquí buscamos todos los elementos uno por uno, que es el ejemplo de búsqueda lineal. Ahora déjame explicarte qué es la búsqueda binaria. En la búsqueda binaria, hacemos jerms a la mitad. Entonces aquí en el lugar de checar diez, 20, 30, nos jum directamente a la mitad de la lista, que es 50 Aquí comprobamos, 50 es mayor que 60 o menor que 60. Sí, 50 es menos de 60, así que nos movemos al lado derecho de la lista. Ahora nuestra lista es de 50 a cien. En esto, volvemos a saltar sobre la mitad. Dime en qué artículo saltaremos. Bien, saltamos sobre el 80. En eso, volvemos a verificar, 60 es mayor que 80 o menor que. Es menor que. Entonces si nuestro número es menor que, entonces nos movemos hacia el lado izquierdo. Ahora 50-70, volvemos a saltar sobre la mitad, que es 60, y obtenemos el elemento Entonces en el lugar de conseguir 60 en seis átomos en búsqueda lineal, aquí estamos obteniendo 60 en tres a cuatro átomos. Esto es muy rápido. ¿Qué dices? Y esto es sólo un diez datos. Imagina que tenemos 1 millón de datos, entonces cuánto tiempo podemos ahorrar usando index. Entonces es por eso que el índice hace que nuestra búsqueda sea más eficiente y lleva menos tiempo que la búsqueda lineal. También tenga en cuenta que la búsqueda binaria funciona sólo en array ordenado, y es por eso que cuando creamos índice, pasamos si debe ascendente array o descendente array uno o menos uno. Ahora entiendes adecuadamente qué es el índice y por qué funciona muy rápido. Ahora bien, ¿eso significa que necesitamos crear un índice para cada campo de nuestra base de datos? La respuesta es no. Tenemos que crear índice solo para aquellos rellenos para los que queremos buscar. Supongamos que tenemos datos de usuarios y queremos buscar usuarios por nombre. En eso, podemos crear índice con nombre relleno. Entonces Mongotbcmmand, solo utilizamos índice para grandes colecciones en las que vamos a almacenar miles o Podrías preguntar por qué no podemos crear un índice para pequeñas colecciones o para cada campo. La razón es cuando creamos índice, como sabemos, Mongotb crea la estructura Btree, pero que Bitr también se almacena en nuestra base de datos, y Déjame mostrarte. Abra la brújula Mongoib y vaya a nuestra Ver, aquí conseguimos colección de usuarios. Aquí está el tamaño de almacenamiento de nuestra colección, que es 6.65 B en el lado derecho, C, tenemos índices totales tamaño a 3.86 B, lo que significa que nuestros datos son de sólo tres MB y otros 3.86 B es recién adquirido Entonces más del 50% es adquirido por índices, lo cual es realmente enorme, y son solo dos índices. Si creamos índice para todos los campos, entonces cuánto tomará nuestro almacenamiento. Además, cuando tenemos pequeñas colecciones, entonces nuestra búsqueda lineal también se ejecutará rápida. La diferencia es ignorable y por eso no creamos índice para colecciones pequeñas Cuando necesitamos aplicar índice, primero, cuando tenemos grandes colecciones, cuando tenemos grandes colecciones, indexación ayuda a usar conjuntos de datos como millones de registros Sin índice, Mongo Di B comprueba cada documento uno por uno Segundo, cuando la búsqueda es frecuente. Si a menudo buscamos un relleno como correo electrónico, nombre de usuario, ID de pedido, entonces podemos indexarlo. Por ejemplo, en el sistema de registro de usuarios en el que buscamos usuario por correo electrónico. Esto aumenta significativamente la velocidad de lectura. Siguiente, tercero, cuando el cortocircuito es común. Si a menudo usamos Método Corto por Precio, entonces podemos indexar ese precio llenado. Por ejemplo, en el listado de productos de comercio electrónico. El tiempo, queremos acortar los productos por precio o fecha. Índice evitar escaneo de recolección completa. Número cuatro, cuando usamos rellenos en buscar actualización, y método delete. El índice acelera estas operaciones. Ahora veamos también cuándo no necesitamos aplicar índice. Número uno, cuando nuestra colección es pequeña. Si solo tenemos unos cientos de documentos, entonces la búsqueda sin índice ya es rápida. Número dos, nuestros datos cambian constantemente. Índices ralentiza, inserta, actualiza y elimina método, porque Mongo Di B debe tener que actualizar el árbol de índices cada vez Por ejemplo, un sistema de registro. En eso, se agregaron nuevos registros cada segundo, y esto se ralentizará si creamos un índice para el registro. Número tres, cuando ya tenemos demasiados índices, cada índice usa almacenamiento, demasiados índices es igual al espacio de disco conferido Por lo que la solución es solo indexar los rellenos más importantes. Número cuatro, cuando estamos cotejando muchos rellenos diferentes, debemos evitar el índice Entonces, si nuestras búsquedas varían mucho en rellenos como nombre, correo electrónico, edad, ciudad, indexación, cada uno podría no ayudar Por lo que la solución es solo indexar rellenos de uso frecuente. Entonces, para recapitular rápidamente, creamos índice en Mongodi B cuando tenemos gran colección Queremos que nuestra consulta sea realmente rápida. No te preocupes, aplicaremos estos índices en nuestro proyecto cuando lo necesitemos. Ahora, a partir de la siguiente sección, comenzaremos a construir nuestro Proyecto dos, que es backend de aplicaciones de comercio electrónico 90. Sección 09: proyecto 02 y planificación: Es momento de crear nuestro segundo proyecto. En este proyecto, vamos a crear la aplicación de comercio electrónico Ben. No vamos a crear front end porque ese no es alcance de este curso. Para eso, tengo por separado el curso Reac JS. Ahora cuando empiezo un nuevo proyecto, me gusta planear el proyecto más o menos. Me va a dar claridad, y también te recomiendo que hagas lo mismo. Entonces, antes que nada, tenemos que visualizar el front-end básico, no el diseño perfecto, solo visualizar. Por ejemplo, aquí estamos creando aplicación de comercio electrónico. En ese sitio web, el usuario puede crear cuenta o iniciar sesión en el sitio web. Después de eso, pueden ver la lista de productos y al hacer clic en ese producto, pueden ver todos los detalles sobre ese producto, más imágenes y descripción. No importa que el usuario haya iniciado sesión o no. Todos los usuarios pueden ver los productos. Después de eso, el usuario puede ver su historial de pedidos. Además, pueden agregar producto a la tarjeta, eliminar el producto de la tarjeta y realizar el pedido mediante pago. Entonces estas son las características que necesitamos para nuestro proyecto. No te preocupes si no conoces todas las características de tu proyecto, como te dije, esto es sólo de plan. En el futuro, podremos agregar o eliminar funciones de nuestra aplicación. Entonces primero, comenzaremos con la creación del modelo de usuario crear API para la autenticación de usuarios. Después de eso, pasaremos a los productos, luego a la tarjeta, y luego a los pedidos. Esto te va a encantar y además obtendrás la confianza para no crear proyectos por tu cuenta. Empecemos este increíble proyecto. 91. Creación de un nuevo servidor: Ahora en nuestra carpeta de proyectos, vamos a crear una nueva carpeta para nuestro segundo proyecto de comercio electrónico llamado cart Wish Backend y simplemente abra este proyecto en el VS coe Bueno. Ahora cuando creamos un nuevo proyecto, ¿qué debemos hacer? Derecha. Inicializaremos el proyecto usando NPM int Y. Esto creará un paquete de puntos y archivo Ahora aquí, creamos un nuevo archivo llamado index dot js. Vamos a crear un servidor Express para esta aplicación. Const Express es igual al paquete Express requerido. Después de eso, estamos creando la aplicación Express, aplicación Const es igual a, y llamamos aquí a esta función Express Ahora vamos a escuchar este servidor, así app dot LISN aquí, primero pasamos puerto, pero en el lugar de pasar valor codificado duro, creamos aquí la variable const port es igual a process dot nv dot Port o 3,000 Entonces si tenemos puerto en el ambiente, entonces va a usar eso más tenemos 3,000, y simplemente pasamos por aquí puerto en primer lugar. Y lo que pasaremos en el segundo parámetro, pasamos aquí la función callback y simplemente consol dot log El servidor está escuchando en puerto, paquetes de dólar Ci, puerto. Ahora, ejecutemos esta aplicación y comprobemos que lo hemos hecho correctamente o no. ¿Por qué creo que podríamos llegar aquí error? A ver, el error en la vida de los desarrolladores es constante. No te asuste con eso. Abre terminal y ejecuta aquí nodebn index dot js. Ver, aquí nos sale el error. Oh, nos olvidamos de instalar el paquete Express. Por lo que NPM instala Express. Y si quieres usar la misma versión que la mía, entonces escribe a la velocidad 5.1 0.0 y pulsa Enter. Bueno. Ahora vamos a intentarlo de nuevo. Ver, aquí conseguimos escucha de servidor. Ahora en la siguiente lección, conectaremos esta aplicación con la base de datos. 92. Conexión a la base de datos: Conectemos esta aplicación con una base de datos porque necesitamos almacenar información sobre usuarios, productos, etcétera En primer lugar, en nuestro proyecto, tenemos que instalar mangos No vamos a repetir el mismo error. Abre terminal y crea una nueva terminal desde aquí. De esta manera, no necesitamos detener nuestra aplicación. Así NPM instalar Mangosta en el rojo 8.13 0.2. Bueno. Vamos a minimizar esto. Ahora en nuestro archivo index dot s, importamos mangos const es igual a requerir mangos Y después de esta app, escribimos Mongos dot connect En el primer argumento, pasamos nuestra cadena de conexión. Si no recuerdas la cadena de conexión de Mongo Di B, puedes obtenerla del Mongo DB Aquí en la barra lateral, tenemos esta conexión de host local, y en el lado derecho de eso, tenemos opción de tres puntos. Aquí, obtenemos Copy Connection String. Y pegarlo en la primera posición. Ahora, al final de esta cadena de conexión, agregamos nuestro nombre de base de datos, que es Card fish. Ahora, como sabemos, esta expresión devuelve una promesa. Así que usamos aquí el método dot TN y dentro de él simplemente consola dot log. MongoDB se conectó correctamente. Ahora, después del método entonces, también agregamos método de caché de puntos para manejar errores. Aquí, obtenemos error Object, función de error, y gonsol dot log, conexión MongoDB, falló, e imprimimos este Ahora probemos esta implementación, guardemos los cambios, y en el terminal, vea, aquí conseguimos que Mongo DB se conecte con éxito En la siguiente lección, diseñaremos nuestro modelo de usuario. 93. Ejercicio: creación de modelo de usuario: Déjame darte poco ejercicio porque ya hicimos esto. Por lo que hay que crear modelo de usuario para este proyecto. Tienes que decidir qué usuarios llenamos queremos para este proyecto. No te preocupes si agregas más rellenos o menos rellenos, pero lo importante es que piensas en rellenos. Así que recuerda, cuáles son las características relacionadas con los usuarios, y según eso, decidir el relleno del usuario. Defina un esquema para esos rellenos y luego cree un modelo con ese esquema. Después de completar este ejercicio, puedes ver la solución. Ahora veamos la solución. En primer lugar, vamos a crear aquí nueva carpeta llamada models. Y dentro de esta carpeta, crearemos un nuevo archivo llamado users dot js. Bueno. Aquí, antes que nada, importamos Const Mongos es igual a los mangos requeridos Porque sin mangos, ¿cómo podemos crear esquema o modelo El esquema de usuario de costo es igual al nuevo esquema de puntos de mangos. En los paréntesis de Cali, pasaremos nuestro esquema en par de valor clave. En primer lugar, nombre a objeto, establecemos su tipo en string, requerido para drew, y establecemos la longitud media en tres. Después de eso, podemos establecer campo Emil y establecemos su tipo en cadena, también requerido para true también necesitamos único a true porque todos los usuarios deben tener solo un correo electrónico único Y para la mejor práctica, también agregaremos minúsculas a true Después de eso, qué campo podemos agregar, sí, podemos agregar contraseña, escribir a cadena, y también tenemos que requerido a true. Después de eso, para el usuario de comercio electrónico, necesitamos dirección de entrega para entregar el producto. Así que escriba a string requerido para true, y también establecemos la longitud media en cinco. Después de eso, podemos especificar el rol para cada usuario, ya sea usuario o administrador. Así que establecemos que es tipo a cadena. Podemos restringir el campo de rol solo dos opciones mediante el uso de la propiedad Enum a array Aquí pasamos nuestros valores usuario o admin. Además, podemos establecer su valor por defecto a usuario. Si queremos cambiar el rol a admin, entonces tenemos que acceder a la base de datos. Por defecto, todos los usuarios rol establecido como usuario solamente. Creo que eso es prácticamente todos los campos para el modelo de usuario. Si en el futuro, necesitamos más funcionalidad, entonces también podemos modificar el esquema. No te preocupes por eso. Además, si durante el ejercicio, tomas diferentes nombres para estos rellenos, entonces puedes cambiarlos, igual que el mío. De lo contrario, podría darte error en el futuro. Ahora tenemos listo el esquema de usuario, así podemos crear un modelo usando este esquema. Así que el usuario de Const es igual al modelo de punto Mongos, y lo que pasamos en la primera posición Correcto, pasamos el nombre singular del modelo que es usuario. En el segundo argumento, pasamos el esquema de usuario. Además, vamos a exportar este modelo de usuario. Lo necesitaremos en la ruta del usuario. Las exportaciones de punto del módulo son iguales al usuario. Perfecto. Ahora en la siguiente lección, crearemos la primera ruta de este proyecto para crear un nuevo usuario. 94. Crear el nuevo usuario: Ahora vamos a crear una API para crear nuevo usuario. Aquí, creamos una nueva carpeta llamada rutas. En esta carpeta, crearemos todas nuestras rutas en archivos separados. Crear un nuevo archivo usuarios punto js. Ahora bien, ¿recuerdas cómo podemos crear API en un archivo separado? Si tenemos que crear API en nuestro archivo principal index dot js, entonces podemos usar esta variable de aplicación. Pero, ¿cómo podemos crear API en un archivo separado? Bien, vamos a crear router para eso. Entonces primero, ingresamos Express es igual a Express requerido. Después de eso, este expreso tiene método router al que podemos llamar. Esto nos dará router. Almacenarlo enrutador invariable. Bueno. Ahora vamos a crear API para crear un nuevo usuario. Qué método podemos usar aquí, get o put, usaremos el método post. Entonces Router obtuvo post. Aquí escribimos nuestro punto final, que es la barra diagonal hacia adelante, y después de este punto final, agregaremos la función de devolución de llamada, que se ejecutará cuando alguien llame a API con este Esta función tiene dos parámetros de solicitud y respuesta, y función de error. Ahora, antes que nada, en esta función, queremos valores que el usuario pasa en el cuerpo de la solicitud. Por lo que const los datos de usuario son iguales a solicitar el cuerpo del punto. Vamos a Const dot registrar estos datos de usuario. Y después de eso, simplemente responsDTSN o podemos usar aquí respuesta dot JSON porque estamos enviando datos de JSN, que son estos datos que Ahora vamos a comprobar que nuestra API está definida correctamente o no. A mí me gusta dar pequeños pasos porque no va a crear confusión. Esto está funcionando, entonces podemos pasar a la lógica principal. Actualmente, definimos API aquí, pero tenemos que agregar esta ruta en nuestro archivo index dot js. De lo contrario, no va a funcionar. Esto lo conocemos bien. Así que vamos a exportar este router usando el módulo dot export es igual a Router. Guarde este archivo y diríjase al archivo index dot js. Aquí, después de la conexión Mongo DV, podemos agregar app dot U y en la primera posición, agregaremos nuestro prefijo API, slash API slash user, y en la segunda posición, tenemos que pasar Router, que exportamos desde Entonces en la parte superior, agregamos costo rutas de usuario es igual a requerir aquí periodos. Aquí vamos a la carpeta de rutas y dentro de ella ruta de usuarios. Ahora podemos simplemente pasar ruta de este usuario aquí. Ya lo hicimos. Recuerda, y no te preocupes si no recuerdas la sintaxis, está completamente bien. Muchas veces, también olvidé la sintaxis. Por ahora, concéntrese en construir la aplicación. Guarde los cambios y probemos esta API de usuario. Entonces en licitación cliente aquí podemos ver nuestra actividad anterior, pero no quiero mezclar las cosas con el proyecto anterior, vamos a las colecciones y desde el lado derecho, tenemos opción nueva colección y darle nombre cartwis Vamos a añadir todo nuestro sabor API en esta colección. Del lado derecho, tenemos más opciones. Haga clic en Crear nueva carpeta y darle nombre a los usuarios. Por lo que en esta carpeta de usuarios, guardaremos todos nuestros gustos API relacionados con el usuario. Se puede ver lo sistemático que se ve esto, y si en el futuro, visitamos este proyecto, no nos confundimos. Entonces creamos una nueva solicitud y le damos un nombre. Crear un nuevo usuario. Selecciona el método a publicar, e ingresamos a nuestra APIURL que es DTP, Columna Abo barra hacia adelante Host Local, Columna 3,000, o lo que sea que uses como usuario de APIs de puerto No olvides agregar este prefijo. Para enviar datos en el cuerpo de la solicitud, seleccionamos su cuerpo y pasaremos los datos aquí en formato JSON. Objeto, nombre del primer campo, asegúrate de que escribimos en códigos dobles. Valor para codificar plas A continuación, tenemos correo electrónico para codificar en el gmail.com rojo Después de eso, qué relleno agregamos, déjame verificar el esquema del usuario. Sí, tenemos contraseña y estado de entrega y ambos son requeridos. Contraseña, y en cadena, uno, dos, tres, 45678 y dirección de entrega a digamos XYZ, en XYZ Asegúrate de usar el mismo nombre relleno que usamos en el esquema. De lo contrario, obtenemos error. Ahora, enviemos esta solicitud. ¿Qué opinas? ¿Funcionará o no? A ver. Enviar la solicitud. Mira, aquí obtenemos el estado 200, lo que significa bien, pero no obtenemos nuestros datos en la respuesta a esta solicitud. Comprobemos Consola A. Vea aquí también, obtenemos undefined. ¿Puedes adivinar por qué vuelve a suceder esto? Recuerda, cuando queremos obtener datos de solicitud del cuerpo, necesitamos usar un middleware para convertir los datos en Ahora recuerdas, en el archivo index dot js, antes de esta ruta, agregamos app dot ug para agregar middleware y simplemente pasamos aquí express dot Jason Por esto, obtendremos datos de la solicitud del organismo. A ver si los cambios. Volvamos a enviar la solicitud. Ver, ahora estamos obteniendo los datos en la respuesta, nuestra implementación actual está funcionando. Ahora vamos a guardar estos datos en la colección de nuestro usuario. Pero antes de guardar los datos en la recopilación del usuario, necesitamos verificar si este usuario ya existe en nuestra base de datos o no. No te confundas, mira esto y tus asignaciones se despejarán. Aquí, necesitamos modelo de usuario para ejecutar la consulta. Costo usuario es igual a requerir aquí tenemos que ir una carpeta arriba, periodo, periodo, slash modelos y vamos a los usuarios modelo Ahora, después de estos datos de usuario, podemos hacer algo como este punto de usuario Fine. Aquí pasamos objeto por filtro. Aquí encontraremos usuario por su correo electrónico único y por valor, pasamos aquí userdata dot email Entonces estamos encontrando usuario, qué correo electrónico es el mismo que este userdata dot email Además, aquí hay una cosa. Si no tenemos ningún usuario cuyo correo electrónico sea el mismo que este userdata dot email, entonces este método find devolverá una matriz vacía Entonces, en lugar de este método find, podemos usar aquí Find one method. Si el usuario no existe, entonces este método find one devolverá undefined, y eso nos ayudará a escribir la condición. Entonces usaremos aquí Encuentra un método. Como sabemos, esta expresión volverá promesa, así que tenemos que esperar aquí, y para usar esperar, tenemos que hacer de esta función Cavey una Bueno. Ahora, vamos a almacenar el resultado en la variable llamada user. Ahora puedes simplemente poner aquí condición. Si el usuario está disponible, entonces devolveremos el error en la respuesta. Entonces respuesta Dodge estado a 400 por mala solicitud y también en la respuesta queremos enviar datos, así punto Json, y aquí pasamos objeto con mensaje usuario ya existe. Ahora aquí hay una cosa. Si el usuario ya está disponible, no queremos ejecutar esta lógica inferior. Para ello, tenemos que pasar aquí regreso antes de esta respuesta punto Status. De lo contrario, ejecutará el código hacia adelante. ¿Y si el usuario no está disponible en la colección del usuario? Derecho, almacenaremos los datos del usuario en la recopilación. Entonces const nuevo usuario es igual a nuevo usuario, y aquí en el objeto, pasamos nuestros datos Así que nombre a userdata nombre de punto y correo electrónico a userdata dot Espera, aquí tenemos que escribir datos de usuario varias veces. En lugar de eso, podemos desestructurar nuestro objeto aquí. Entonces en el lugar de los datos del usuario, agregamos Objeto y pasamos rellenos nombre que obtenemos de request dot body. Esto se llama como Desestructuración de objetos. Entonces tenemos nombre, correo electrónico, contraseña y última dirección de entrega. Asegúrese de que escribimos aquí el mismo nombre relleno que pasamos en el cuerpo del punto de solicitud. Ahora en el lugar del nombre del punto userdata, podemos escribir solo nombre Además si el nombre de propiedad y un nombre de variable de valor es el mismo, entonces podemos eliminar esto. Pero para que entiendas, no lo voy a quitar. Correo electrónico a correo electrónico contraseña a contraseña y dirección de entrega a dirección de entrega. También, tenemos que cambiar aquí en el método fino, correo electrónico a correo electrónico. Ahora tenemos nuevo objeto de usuario, así podemos guardarlo en nuestra base de datos, nuevo usuario punto c, y esta es la operación asíncrona Por eso nos adherimos aguardan. Ahora, esto devolverá el usuario almacenado de la base de datos. Si no queremos devolver los datos de usuario almacenados, entonces también podemos usar estos nuevos datos de usuario. No te preocupes, obtenemos ID en ambos objetos. Entonces en la parte inferior, nos adherimos estado de punto de respuesta Dime código de estado que usaremos para nuevos datos. Derecha, usamos 201 punto Json, y aquí pasamos nuevo objeto de usuario. Perfecto. Ahora vamos a probar esta implementación. Guarde los cambios y enviemos la solicitud de publicación. Ver, aquí obtenemos nuevo usuario con su ID único. Y si revisamos nuestra base de datos, actualice la base de datos, aquí obtenemos Cardwish Dentro de esto, obtenemos usuarios, y aquí obtenemos nuestro primer usuario. ¿Y si enviamos la misma solicitud con la misma información de usuario? Ver, aquí obtenemos usuario ya existe con error, 400 mal pedido. Perfecto. 95. Hashing de la contraseña por razones de seguridad: Ahora actualmente en nuestros datos de uso, estamos almacenando contraseña en cadena simple. Pero, ¿y si alguien obtiene acceso a nuestra base de datos, entonces cualquiera puede ver las contraseñas reales del usuario Para resolver este problema, podemos tener la contraseña en alguna cadena aleatoria, lo que hace que nuestra contraseña sea ilegible Para fastidiar la contraseña, utilizamos una biblioteca muy popular llamada BCrypt NPM instala BCRP. No te preocupes por ello. Es realmente simple. Entenderemos el hasing de contraseñas en un archivo separado, y al final, lo agregaremos en la ruta de nuestro usuario Aquí, creamos un nuevo archivo llamado pass dots. Bueno. Ahora, antes que nada, importamos const, Bcrypt es igual a requerir Ahora Bcrptespecialmente fuerte porque tenía SLD. Podrías preguntar ¿qué se vende? SALT es una pieza extra de datos aleatorios agregados a una contraseña antes de que se tenga. Déjame explicarte con palabras sencillas. Digamos que tenemos dos usuarios, el usuario A y el usuario B y ambos eligen contraseña. Digamos uno, dos, tres, cuatro, cinco. Ahora supongamos que nuestro paquete BrP tiene esta contraseña que podría verse así Si solo tenemos uno, dos, tres, cuatro, cinco, sin ningún tipo de sal, el usuario A y el usuario B tiene contraseña. Mira lo mismo en la base de datos. Esto es un problema porque se dice que estos dos usuarios tienen la misma contraseña. Si los hackers ven una contraseña de atención idéntica, entonces podrían adivinar que ambos usuarios tienen la misma contraseña simple. Entonces necesitamos SLT para resolver este problema. SALT no es nada, solo datos aleatorios, agregados a una contraseña antes de hesing. Así que antes de UseraPassword, agregamos algunos datos aleatorios, por lo que su contraseña se ve Para la contraseña del usuario B, agregamos algunos datos aleatorios o vendidos. Entonces es contraseña se ve así. No es necesario, Bcrypt mantener lo mismo que contraseña. Yo sólo te muestro para entender. Déjame mostrarte eso prácticamente. Aquí podemos usar crypt dot y esta función excepto dos argumentos. primera es la contraseña original, que es la contraseña ingresada por el usuario. Por ejemplo, aquí pasamos uno, dos, tres, cuatro, cinco, y el segundo argumento se vende redondo. Esto controla el costo del hasing. Alto valor significa más seguridad pero un hesing más lento. Por lo general, un valor de diez se considera seguro y razonablemente rápido. Ahora en el tercer parámetro, vea, aquí tenemos que pasar la función de devolución de llamada porque esta es una operación asíncrona Pero en lugar de usar callback, podemos usar aquí awight al principio Para usar un peso, tenemos que escribir esta expresión con una función sync llamada pass. Y simplemente movemos esta línea a esta función. Ahora almacene esa invariable llamada st pass y simplemente consola dot log este st pass Ahora, vamos a llamar a esta misma función dos veces para que podamos ver contraseña en similar o SALT está funcionando. Abre terminal y simplemente ejecuta node spass dot js. Ver, aquí obtenemos dos st contraseña diferentes. Incluso si pasamos la misma contraseña uno, dos, tres, cuatro, cinco, para a, este es el poder de SLT Implementemos este código en la ruta de nuestro usuario. Corta esta línea desde aquí y pegarla antes de nuestra nueva variable de usuario. Ahora hagamos algunos pequeños cambios aquí. Primero, cambiamos esta contraseña de código duro uno, dos, tres, 45 con nuestra contraseña, que obtenemos del cuerpo de la solicitud. Esto generará contraseña para ese usuario. En el lugar de guardar la contraseña original, almacenamos esta st contraseña. Además, tenemos que importar Bcrt en la parte superior. Const Bcrypt es igual a requerir BCR. Sears los cambios y echa un vistazo. En nuestra base de datos, hemos utilizado datos sin hasing. Para que podamos eliminar este registro de aquí, eliminarlo. Ahora vamos a ejecutar nuestra aplicación usando normon index dot js. Bueno. Ahora de nuevo, envía la solicitud de correos con los mismos datos. Ver, ahora tenemos con éxito la contraseña y la almacenamos en nuestra base de datos. Incluso si alguien ha entrado en nuestra base de datos, no puede ver la contraseña tal como está. 96. Validación de entrada de usuario con Joi: Ahora actualmente, nuestra ruta de usuario está funcionando bien. El usuario de Weg ya está registrado o no, y además estamos usando la contraseña, pero hay una regla para los desarrolladores de Bend. Nosotros como desarrollador de Bend, nunca confiamos en los datos enviados por el cliente. Tenemos que validar siempre esos datos. Supongamos en el lugar de nombre, pase de cliente, propiedad de nombre de usuario. También, a veces se olvidaron de enviar correo electrónico o incluso contraseña. En ese momento, no podemos almacenar mitad de la información en nuestra base de datos. Ahora se podría decir que ya configuramos la validación en nuestro esquema. Deberíamos tener que agregar una validación más, sí, a menudo es una buena idea agregar múltiples capas de validación más allá de lo que está configurado en el esquema. Realizaremos la validación de datos de backend en esta lección. Esta es otra capa de la validación. Si Acker de alguna manera pasa por alto esta capa de validación, entonces ya tenemos validación en esquema que evitará que los datos no válidos ingresen en nuestra base de datos. Aquí tenemos dos opciones. Se puede realizar manualmente o podemos usar paquete muy popular llamado Joy. Además, tenemos otros validadores como Express validator, Yup y validator Yup y validator Puedes usar lo que quieras. Me encanta Joy porque es versátil y fácil de usar y A se integra bien con muchos frameworks nodejs, especialmente express dot Déjame mostrarte eso. Abre terminal y escribe NPM, instala Joy ethert 17.13 0.3. Bueno. Ahora usar la alegría es muy sencillo. En primer lugar, vamos a importar alegría en este archivo. Entonces const alegría con J es igual para requerir alegría. Ya sabes por qué escribimos aquí J porque este paquete joy devuelve una clase. Ahora con alegría, tenemos que definir esquema para solicitar datos corporales. En este esquema de alegría, y hacer muchas cosas, igual que lo hemos hecho en el esquema de usuario. Definimos aquí nueva variable llamada user schema o create user schema es igual a, y aquí pasamos joy dot Object y dentro de este, pasamos nuestro objeto de esquema. En este objeto, pasamos nuestros campos con esquema Joy. ¿Cuál es el tipo de propiedades? ¿Se requiere? ¿Cuál es el valor medio, valor máximo o la longitud media de la cadena ortring length, y mucho, mucho más En primer lugar, necesitamos name to joy aquí, podemos especificar el tipo de campo que es string. Asegúrate de que llamamos a esta función aquí. Ahora también podemos agregar aquí media a tres caracteres, y también queremos que esto se llene a requerido. Hay muchos métodos alegría. Puedes ver todos los métodos utilizando su documentación. A continuación, tenemos aquí email fill joy dot string. Ahora para la alegría del correo electrónico, tenemos el método de correo electrónico, esto también valida el correo electrónico y también pin este relleno según sea necesario. A continuación, tenemos contraseña para alegría punto cadena punto Min 26 letra de contraseña, y también necesitamos esto requerido. Última voluntad, queremos validar su dirección de entrega a joy punto punto Min a Pi y requerido. Bueno. Aquí tenemos este esquema de Joy ahora queremos aplicar este esquema sobre los datos que estamos obteniendo en este cuerpo de punto de solicitud. Por eso escribimos el mismo nombre de campos que pasamos en el cuerpo del punto de solicitud. Para validar los datos usando Joy, tenemos que utilizar este método de validación de puntos de esquema de usuarios creativos . Dentro de esto, tenemos que pasar qué datos queremos validar y qué queremos validar, solicitar cuerpo de punto. Ahora, esto devolverá el objeto que almacenamos en la variable llamada Joe validation. Déjame mostrarte lo que obtenemos en esta variable de validación de Joy. Comento este código inferior y solo valido esta solicitud dot body aquí y simplemente devuelvo respuesta dot json, validación de Joy. Di esto en Js y echa un vistazo. Enviar la solicitud de correo. Consulta aquí nuestros datos son validados. Por eso conseguimos que se llene el valor. Si elimino esta contraseña de solicitar el cuerpo del punto y enviar el De nuevo. Ver, aquí obtenemos objeto error y en eso tenemos estos detalles, que es array, y en eso obtenemos mensaje de error. Se requiere contraseña. Al usar este objeto de error, podemos devolver error en nuestra respuesta. No te confundas. Déjame mostrarte eso. Eliminar este método JSN de punto de respuesta. No lo necesitamos y simplemente escribimos aquí yo condición y comprobamos si el error de validación de alegría está disponible, entonces simplemente devolvemos error en la respuesta. Devolver Response dot status, 400 para bad request dot Json, y aquí devolvemos Joy validation dot error Object. Ahora como una buena práctica, los desarrolladores no pasan el objeto de error completo de aquí. A ellos les gusta enviar solo mensaje de error. Agregamos detalles de punto, que es la matriz y accedemos a su primer elemento por corchetes, cero index dot MESSage vamos a probar esto, enviar la solicitud sin contraseña llenada. Ver, aquí obtenemos contraseña se requiere. Si pasamos contraseña rellenada de nuevo, así que deshacer, pero en nombre, pasamos sólo dos caracteres. Y enviar la solicitud. Ver, aquí nos sale bonito mensaje de error. La longitud del nombre debe tener al menos tres caracteres. En la validación de esquemas de Mongo, no obtenemos este tipo de mensajes de error, y por eso a los desarrolladores les gusta joy Ahora aquí, tengo una pregunta. Si no pasamos por aquí dos fallas, lo que vamos a conseguir. Así que quita estos dos primeros rellenos. Enviar la solicitud. Ver, aquí solo obtenemos un error. Joey ejecuta validación línea por línea. Si la primera línea no consigue validar, entonces inmediatamente devolverá error. Por eso devolvemos siempre detalles primer elemento punto mensaje. Así es como validamos los datos de entrada que obtenemos del cuerpo de la solicitud. Puedes eliminar comentario de otro código. Dios. Para recapitular rápidamente, hay tres capas de validación en el mundo real, validación del lado del cliente, que los desarrolladores front-end realizan en el navegador Los usuarios pueden ver eso en el formulario front-end. A continuación, tenemos la validación del lado de Bacon, que recién hicimos usando joy. En esto, estamos validando datos, que estamos obteniendo de front end en request dot body A continuación, tenemos el esquema de Mongo, que es la validación final Evitará que los datos no válidos ingresen en la base de datos. Si alguien pasa la validación del lado del cliente, entonces tenemos la validación del lado del vagón, y si alguien pasa eso también, entonces el esquema de Mangus siempre está ahí Agregar estas capas proporciona un enfoque sólido para evitar que los datos no válidos ingresen a nuestra base de datos y garantiza una aplicación segura y confiable. Ahora puedes ver que estamos trabajando como profesionales. Ahora en la siguiente lección, veremos cómo funciona la autenticación de usuarios en el mundo real. 97. Cómo funciona la autenticación: Ahora hablemos de la autenticación de usuarios en el nodo js. La autenticación de usuarios juega un papel muy importante en cualquier aplicación. Yo nodejs, hacemos autenticación usando JWT, o podemos decirlo Ahora podrías preguntar, ¿qué es esto JWT o JSN WebTKEN? No te preocupes por eso. Es realmente simple. El token web JSON es una cadena de token larga, que se ve así. Al usar este token, que vamos a generar en el back-end, por eso, podemos autenticar al usuario Déjame explicarte con ejemplo cómo funciona la autenticación antes de JWT y cómo funciona ahora Aquí hay una Harley en la que inicia sesión con su información de cuenta, correo electrónico y contraseña. Ahora nuestro servidor primero verifica la información, y si es verdadera, entonces el servidor devuelve su ID de usuario como respuesta y la almacena en la sesión u ooki Ahora, cada vez que envía solicitudes de alguna información segura, digamos, toda su información bancaria. Entonces servidor primero pide el ID de usuario, y si tiene ID de usuario, y luego el servidor envía la información segura. Pero aquí hay un gran problema, el SSN o Cookie en el que almacenamos nuestro ID de usuario, se puede modificar fácilmente en el navegador Digamos que cambio este ID de usuario por otro ID de usuario, luego obtenemos la información sobre ese usuario. Este enfoque no está asegurado. Ahora para resolver este problema, presentamos el token web JSN Ahora Harley vuelve a iniciar sesión con su correo electrónico y contraseña. Ahora nuestro servidor primero verifica la información, y si es verdadera, entonces el servidor devuelve el token único cifrado largo como respuesta y lo almacena en el almacenamiento local. Ahora, lo mejor de este token es que está hecho con detalles de uso y una clave secreta que solo definiremos en el servidor. Nadie conoce la clave secreta excepto tú y tu equipo. Entonces cada vez que Harley envía solicitud alguna información segura, luego en el servidor, primero pedimos el token JWT y lo verificamos usando nuestra clave secreta Si se verifica, entonces y luego desde el servidor, enviaremos esa información segura. Y si cambiamos algo en la información del usuario, entonces nuestro token también cambiará. Como desarrollador de Bend, nuestro trabajo es enviar token web JSN cuando los usuarios se registran o inician sesión y también verificar el token cuando lo necesitemos Almacenar el token en el almacenamiento local y todo lo demás es un trabajo de desarrollador front-end. Establecer una suma, cuando los usuarios inician sesión o se registran con éxito, enviamos token web JSON, que simplemente funciona como tarjeta de seguridad. Cuando el usuario solicita datos que solo son accesibles por el usuario de inicio de sesión, luego el servidor primero verifica la tarjeta de seguridad, que es nuestro token web JSON y validarla con la clave secreta JWT Ese token verificado, sólo entonces el servidor devuelve los datos a ese usuario. Tan simple como eso. Ahora en la siguiente lección, generaremos el token web JCN y lo enviaremos en respuesta 98. Generar el token de JWT para el usuario: Entonces entendemos el token web JN. Es como una tarjeta de seguridad. Ahora vamos a generar un token cuando el usuario se registró con éxito y enviemos un token en la respuesta. Entonces para generar token web JSN, necesitamos paquete de token web JSN, abrir terminal y escribir NPM, instalar token web JSN Y si quieres instalar el mismo verson que el mío, entonces escribe a la velocidad 9.0 0.2, y presiona Enter Bueno. Ahora en el archivo de nuestro usuario en la parte superior, importamos ese paquete usando require y simplemente lo almacenamos en una variable llamada JWT Ahora cuando queremos crear este token, al principio o al fin, queremos crear token cuando nuestros datos de usuario se almacenen correctamente. Después de este mismo método, escribimos punto JWT Sign In el método sign, tenemos que pasar dos argumentos Al principio, tenemos que pasar los datos que queremos enviar dentro del token. Por ahora, solo queremos enviar ID de usuario con nuestro token. Objeto y primera propiedad, subrayado a ID de subrayado nwuser Asegúrate de escribir aquí, subrayado ID. He cometido este error antes. Además, quiero enviar la propiedad name de este nombre de usuario tonuser punto N. Ahora en el segundo argumento, tenemos que pasar cadena, que es nuestra clave de seguridad Por ahora, pasamos GWT, clave de seguridad. Podemos pasar cualquier cadena. No hay reglas para la clave. Además, actualmente estamos pasando esta clave directamente. Pero en la siguiente lección, la agregaremos en la variable de entorno. No te preocupes por eso. Ahora, esto generará el token web JSN, por lo que lo almacenamos en la variable llamada token Simplemente en el lugar de enviar nuevos datos de usuario, pasamos solo token. Déjame mostrarte cómo se ve esta ficha. Guarda los cambios y desde el cliente Thunder, enviamos nuevos datos de usuario, escribimos el nombre completo y cambiamos el correo electrónico a código one@gmail.com. Asegúrate de agregar la coma y enviar la solicitud. Mira, aquí obtenemos este token largo, que acabamos de generar. Ahora, déjame mostrarte más sobre esta ficha. Entonces copia este token JWT. Asegúrate de no copiar estos códigos dobles. Abre una pestaña en tu navegador y busca jwt dot IO. Y esta es la documentación oficial de JWT. Aquí en las bibliotecas, puede ver la implementación de JWT para diferentes bibliotecas diferentes Ahora vuelve a la página principal y desplázate hacia abajo hasta la sección Depurador Y aquí podemos decodificar nuestro token. Ahora, entendamos qué token contiene. Así que más allá de nuestro token aquí. Ahora todos los tokens GWT divididos en tres partes. primera parte es sobre cabecera, que está en el color rojo. segunda parte trata sobre la carga útil, que está en el morado y última y la parte más importante es la firma, que está en el color azul. Ahora bien, este encabezado contiene el algoritmo y el tipo de token, que es muy común. Enfócate en eso. A continuación, esta carga útil contiene los datos que queremos pasar con el token. En este caso, pasamos ID de usuario y usamos un nombre, que es este objeto en este método de signo. La razón por la que pasamos aquí estos datos es que podemos mostrar esos datos en nuestro front-end sin llamar a API por separado. Después de eso, tenemos una propiedad más It, que significa emitida en y su valor es el momento en que se genera nuestro token. Por esto, podemos ver cuántos años tiene nuestro token. La última parte, que está en el azul es firma, y se genera en base a nuestro encabezado, estos datos de carga útil, y la clave secreta que solo está disponible en nuestro servidor. Por lo que esto evitará que los usuarios obtengan su propio token y luego lo modifiquen con ID para fingir ser otra persona. Porque si modificas algo en esta carga útil o encabezado, entonces la firma se regenerará Por lo que no hay posibilidad de que los usuarios hagan algo poco ético Por solo esta clave secreta nuestro token validará. De lo contrario, nos dará error. Por eso JWT es tan popular. Para resumir rápidamente, cuando los usuarios inician sesión o se registran con éxito, obtenemos el token web JCN que simplemente funciona como tarjeta de seguridad Cuando el usuario solicita datos que solo son accesibles por los usuarios de LogN, luego el servidor primero verifica la tarjeta de seguridad, que es nuestro token web JCN y validarla con clave secreta JWT Los dos verificados, sólo entonces el servidor devuelve los datos a ese usuario, simple como conjunto. 99. Fijar la expiración de un token: Muchos desarrolladores como una buena práctica, establecen un tiempo de caducidad para este token web JSON, como 2 horas o 24 horas. Pasado ese tiempo, este token no será válido. Si el usuario quiere un nuevo token, entonces tiene que volver a iniciar sesión. Entonces para eso, podemos pasar tercer argumento en este método JWT Sign, Object, y en eso tenemos la propiedad llamada caduca en Podemos pasar valores en milisegundos, si queremos establecer 2 horas, luego escribir dos por 2 horas en 60 por minutos porque 1 hora tiene 60 minutos en otra vez, 60 porque 1 minuto tiene 60 segundos y en 1,000 para convertir segundos en milisegundos Se puede ver que esto es un poco confuso. Así que también podemos pasar aquí en cadena a borde, que es de 2 horas. O podemos escribir aquí un día por un día. Alguna vez te gusta. Un valor numérico se interpreta como un recuento de milisegundos. Si usa una cadena, asegúrese de proporcionar las unidades de tiempo como días, horas, etcétera De lo contrario, la unidad de milisegundos se usa por defecto. Entonces si solo pasamos aquí 120 en cadena, entonces equivale a 120 milisegundos. Me gusta establecer 2 horas, así que dos borde, este tiempo de caducidad es realmente depende de su aplicación. Podrías notar en las aplicaciones bancarias, tu inicio de sesión caduca en la última vez, como de cinco a 10 minutos. Después de eso, tienes que volver a iniciar sesión. La razón por la que usan el tiempo de caducidad para token es porque quieren asegurar su aplicación. Por otro lado, muchos sitios web de redes sociales establecen el tiempo de caducidad en 30 días o 60 días. Una vez que ingresas, no caducan tu token porque quieren que usemos más de sus redes sociales. El tiempo de caducidad depende de tu proyecto. Elija lo mejor para su aplicación. Solo asegúrate de no molestarte con ExpiRyT. 100. Protege la clave de seguridad en Environnement: Actualmente, pasamos nuestra clave secreta JWT directamente aquí. Pero en el mundo real, esto no es seguro porque cuando implementamos nuestra aplicación en Internet, también subimos nuestro código en alguna nube como Github o Gitlab Si escribimos nuestra clave secreta en este código, todos podrán ver nuestra clave secreta, y esto no es seguro. Entonces en el lugar de definir la clave secreta aquí, podemos editar en el archivo punto ENV En este proyecto, no creamos el archivo ENV punto. Crea un nuevo archivo aquí llamado punto ENV. En este archivo, simplemente definimos la variable llamada clave de subrayado JWT es igual a, aquí vamos a escribir nuestra clave, que es la clave de seguridad JWT Además, a muchos desarrolladores les gusta adherir nombre de clave aleatorio para que nadie pueda predecir la clave de seguridad. Puedes usar cualquier clave de seguridad, solo para guardar la copia de seguridad de esa clave de seguridad. Ahora para acceder a esta variable clave de subrayado JWT en nuestro proyecto, necesitamos configurar Dot NV y qué paquete usamos para eso, necesitamos paquete DotNV, abrir terminal y simplemente instalar NPM Bueno. Ahora en el archivo index dot js en la parte superior, agregamos require dot NV y llamamos aquí método dot config. Guarda este archivo, y en la ruta del usuario aquí en el lugar de esta cadena hardcod, agregamos process dot nw dot nuestro nombre de variable, que es JWT underscore Y hecho. Ahora bien, si necesitamos volver a usar esta clave, no tenemos que escribir la clave original. Podemos escribir proceso punto E y w punto clave de subrayado JWT. Ahora en la siguiente lección, crearemos ruta de inicio de sesión en la que nos autenticaremos, correo electrónico y contraseña 101. Ejercicio Crear ruta de inicio de sesión: Ahora es el momento de poco ejercicio. Tienes que crear una nueva API para iniciar sesión, lo que debería ser una solicitud posterior con sesión de barras de API de punto final Y en el cuerpo de esta solicitud, el usuario puede pasar dos propiedades, correo electrónico y su contraseña. Entonces antes que nada, en esta API, hay que encontrar usuario por su correo electrónico. Si no has encontrado usuario, entonces tienes que enviar error en respuesta con el mensaje credenciales inválidas, y si el usuario está disponible, entonces tienes que comparar contraseña. Apenas estos dos pasos. No te preocupes por comparar la contraseña, deja el ejercicio a partir de ese punto. Simplemente defina nueva API y encuentre al usuario con correo electrónico. Después de completar el ejercicio, puedes ver la solución. Entonces espero que resuelvas este ejercicio o al menos intentes resolverlo. Date crédito por eso. Ahora veamos la solución. En primer lugar, en la parte inferior, definimos una nueva API usando router punto post. Aquí en la primera posición, pasamos el inicio de sesión de endpoint slash En la segunda posición, pasamos la función de devolución de llamada con dos parámetros, request y response, y adherimos la función de flecha Ahora déjame mostrarte mi trigonometría por escribir código sin confusiones Me gusta escribir pasos en comman. Por ejemplo, aquí, el primer paso es encontrar usuario de base de datos por correo electrónico. Si encontramos usuario, entonces después de eso, comparar contraseña cifrada. Si la contraseña coincide, entonces creamos el token web JSON y lo enviamos en respuesta. De esta manera, obtenemos el camino claro para escribir el código. Primer paso, tenemos que encontrar usuario por correo electrónico. Para eso, tenemos que obtener datos del cuerpo del punto de solicitud. Los datos de costo son iguales al cuerpo del punto de solicitud. O también podemos desestructurar nuestro objeto aquí. Entonces en el lugar de los datos, agregamos objeto y accedemos a nuestras propiedades, correo electrónico y contraseña. Ahora usando este correo electrónico, encontramos usuario. Entonces el usuario de Const es igual a aquí tenemos que esperar usuario punto Bien uno aquí pasamos objeto de comparación y comparamos el correo electrónico llenado con nuestra variable de correo electrónico, igual que lo hicimos anteriormente Aquí, obtenemos un error de tiempo de ejecución por usar un peso. Tenemos que hacer nuestra función asíncrona. Bueno. Ahora podemos verificar el estado. Si el usuario no está definido, entonces volvemos aquí error. Estado de punto de respuesta 401 para credenciales no válidas, y también enviamos Objeto GSN con credenciales inválidas de propiedad de mensaje Ahora bien, ¿y si se encuentra usuario? Sí, tenemos que verificar que la contraseña esté desordenada o no, pero aquí hay una cosa Almacenamos la contraseña de usuario en formato cifrado. No podemos compararlo directamente con una contraseña de cadena simple. Entonces aquí tenemos que volver a usar paquete crypt. Así cripta punto comparar la primera posición, pasamos contraseña, que obtenemos del cuerpo del punto de solicitud, y después de eso, tenemos que pasar una contraseña, que almacenamos en base de datos. Entonces usuario punto contraseña. Ahora bien, esta expresión nuevamente toma poco tiempo, así que podemos esperar aquí y simplemente almacenar ese resultado en contraseña válida variable. Podemos volver a pasar condición si la contraseña válida no está disponible y devolvemos el mismo error con el mismo mensaje de error. Yo pego esta línea aquí. Ahora podría preguntarse ¿por qué enviamos el mismo mensaje de error? Es porque por razones de seguridad, si especificamos contraseña no coincide, entonces significa que encontramos usuario y simplemente contraseña no coincide. Es por eso que los desarrolladores envían este tipo de mensaje de error credenciales inválidas. Ahora bien, si la contraseña es coincidente, entonces tenemos que crear un nuevo token. Copo el código de la API de registro y lo pego en nuestra API de inicio de sesión. Solo nosotros para hacer pequeños cambios. Aquí en los datos, tenemos que pasar ID de guión bajo de punto de usuario y nombre de punto de usuario Al final, simplemente enviamos respuesta dot Json este token. Bueno. Ahora probemos esta implementación. Así que ve al cliente Thunder y en la colección del usuario, crea una nueva solicitud y dale un nombre, inicia sesión en un usuario. Cambie el método para publicar, y URL a STP, llame a una doble diagonal hacia adelante Localhost 3,000 slash API slash users slash Login Y en el cuerpo, pasamos Objeto con relleno de correo electrónico. Aquí, pasamos el correo electrónico, que no creamos el código 12 athergmil.com También pase la contraseña 12345678 y envíe la solicitud. Ver, aquí obtenemos el mensaje de error credenciales inválidas. Ahora si escribimos correo electrónico válido y pasamos la contraseña incorrecta y enviamos la solicitud, vea, seguimos obteniendo el mismo error. Ahora si pasamos escribimos correo electrónico y escribimos contraseña y enviamos la solicitud, mira, ahora obtenemos JSON Web Token. Así es como creamos Login API. Simplemente, tenemos que encontrar usuario, comparar su contraseña con el paquete BCR Si coincidía, entonces generamos JSN WebTKEN y lo enviamos en respuesta, simple Ahora, antes de seguir adelante, aquí literalmente copiamos y pegamos el código para generar el token web JSON Simplemente cambiamos estos datos. Es mejor que creamos una función separada para generar el token, y luego podremos usarlo en ambas APIs. Así que en la parte inferior, creamos una nueva función llamada generar token es igual a la función de flecha. Ahora a partir de esta función, queremos simplemente devolver token. Copia este método JWT dot Sine y pegarlo aquí. Ahora aquí solo queremos pasar diferentes datos. Reemplazamos este objeto de datos con variable de datos y obtenemos estos datos del parámetro. Además, si desea establecer un tiempo de caducidad de token diferente, entonces también puede pasar el parámetro para eso. Por ahora, no queremos que 2 horas esté bien para ambos. Ahora en la API de inicio de sesión, obtuvimos este objeto de datos, que pasamos en el método de signo de punto JWT y simplemente llamamos aquí, generamos la función token, y pasamos ese mismo objeto de datos como argumento Bueno. Ahora, lo mismo hacemos en registro API, cortamos el objeto de datos, y aquí llamamos a generar para confundir y pasar aquí ese objeto de datos Por esta implementación, nuestro código parece más organizado. 102. ¿Cómo autenticar al usuario? ¿Has iniciado sesión o no?: Entonces en la lección anterior, vemos después de registrarse e iniciar sesión, generamos token JWT y lo enviamos en la respuesta Ahora déjame decirte qué va a hacer front end con esa ficha. Entonces, cuando enviamos el token JWT desde el back-end al front end, front-end almacenará ese token en el almacenamiento local del navegador o en la sesión Por eso, el front-end sabrá que el usuario está conectado o no. Cuando el usuario quiere acceder a datos seguros, que solo accede el usuario de inicio de sesión, front-end necesita enviar ese token con la llamada API. Así que hay muchas formas de enviar token con la llamada API. Pero más comúnmente, el front-end enviará token en la solicitud, específicamente en encabezado de autorización. Si su front-end usa otro método, entonces contactarán con el backend y luego para implementarlo de esa manera Así que el front-end establece el token en el encabezado de autorización. Y cuando el usuario quiere acceder a API protegida, que solo se accede por usuario bloqueado, luego en el back-end, primero, qué token se verifica o no. Si se verifica, entonces permitimos que el usuario acceda a esa API, y si el token no está verificado, entonces devolvemos error con el código de estado 401, token de autorización requerido. Ahora bien, ¿dónde escribimos esta lógica? Y crear un middleware, especialmente para verificar el token, y podemos agregar ese middleware para Déjame mostrarte eso prácticamente. Entonces en nuestro proyecto para definir un middleware, creamos una nueva carpeta llamada middleware, y dentro de esta carpeta, creamos un nuevo archivo llamado Ahora, ¿recuerdas que es middleware? Middleware es una función que llama a la siguiente función de middleware o envía una respuesta a Así que aquí definimos una función llamada middleware Orth y AV know for express middleware, obtenemos tres parámetros request response, middleware Orth y AV know for express middleware, obtenemos tres parámetros request response, y next error function. Ahora, antes que nada, aquí tenemos que obtener el encabezado de autorización, el encabezado SeNoth es igual a solicitar encabezados de punto autorización de punto Asegúrese de escribir la ortografía correcta de las propiedades. De lo contrario, no obtenemos el encabezado aquí. Vamos a la consola dot log este encabezado de autenticación para simplemente ver lo que estamos obteniendo en esta variable En el futuro, podremos eliminar esta consola. Además, en el mundo real, obtenemos este encabezado outh como este en la cadena, primero obtenemos espacio de error, y luego obtenemos el token JWT completo La razón por la que obtenemos aquí este error es porque es un estándar de autenticación común y asegurar que el servidor procese el token correctamente. Ahora antes de verificar el token, tenemos que verificar si obtenemos token o no en este encabezado. Nos adherimos si condición, si O header no está disponible, o adherimos una condición más, oth header comienza con aquí en cadena, pasamos espacio portador. Si esta condición no es cierta, entonces devolvemos error. Asegúrate de agregar aquí no es cierto. Ahora dentro de esto, devolvemos estado de punto de respuesta 401 para solicitud no autorizada dot Jason, y aquí enviamos objeto con propiedad de mensaje, autorización, token requerido. Asegúrese de enviar el objeto con la misma propiedad por cada error. Facilita el manejo de errores en la parte frontal. Ahora, qué en la cabecera oth. Como sabemos Oh header es una cadena con prefijo, portador, espacio, y luego token. Entonces tenemos que obtener token de esta cadena. Es realmente simple. Const token es igual a oth header. Aquí, utilizamos el método split, y desde donde queremos dividir directamente del espacio. Entonces pasamos códigos dobles y espacio. Ahora, este método split devolverá una matriz así. El primer elemento es portador y el segundo elemento es nuestro token. Podemos acceder a token por índice uno. Yo corchete, escribimos uno. Ahora solo tenemos que verificar que este token sea válido o no. Entonces para eso, necesitamos paquete JWT en la parte superior, escribimos Cast JWT es igual a requerir Json web token En la parte inferior, escribimos punto JWT verificar este método excepto dos parámetros El primero es un token que queremos verificar, que es este token. En el segundo parámetro, tenemos que agregar la clave secreta JWT, que es process Env dot JWT, Ahora bien, si nuestro token se verifica con éxito, aquí obtenemos los datos de usuario que enviamos con el token. Podemos almacenarlo en la variable llamada usuario decodificado. Podemos guardar estos datos de usuario como request dot user es igual a usuario decodificado. Si en alguna ruta protegida, queremos obtener los datos actuales de los usuarios registrados, entonces simplemente podemos acceder a ellos usando request dot user. No te preocupes, te voy a mostrar eso también a medida que avancemos en este proyecto. Ahora después de configurar los datos de usuario en request dot user, no queremos hacer nada en este método. Así que simplemente podemos llamar a la siguiente función, que llamamos el siguiente middleware en la pila de llamadas Si no llamamos a esta siguiente función, entonces express no llamará a la función API ni a otra función de middleware Nuestro servidor se quedará en este punto, y eso hará que nuestro servidor sea realmente lento. Siempre llame a la siguiente función al final de la función middleware Ahora aquí en este código, ¿y si nuestro usuario no está verificado? ¿Qué pasa si el usuario pasa un token falso o un token caducado? También tenemos que encargarnos de eso. Por error de manejo, agregamos aquí try and catch blog y simplemente agregamos estas tres líneas en el Blog Try. Si obtenemos error en estas tres líneas, este blog de captura se ejecutará. En este blog de captura, simplemente podemos devolver respuesta con estado 400 para solicitud inválida dot Json y Lo que pasamos aquí. Derecha, pasamos aquí objeto con mensaje de propiedad y mensaje de error será token no válido y hecho. Completamos el middleware de autenticación. También probemos esto. En primer lugar, tenemos que exportar este orddalware para usar este middleware Así módulo dot Exportaciones. Igual al middleware de Auth. Guarde los cambios y diríjase a la ruta de los usuarios. Aquí en la parte inferior, después de la ruta de inicio de sesión, agregamos el método Router dot Get y apuntamos a solo slash hacia adelante Después de eso, agregamos función de devolución de llamada con solicitud y respuesta Esta es la API normal. Pero, ¿cómo podemos hacer que esta API esté protegida, lo que significa que solo los usuarios bloqueados deben acceder a esta ruta API Para eso, tenemos que agregar middleware antes de esta función de devolución de llamada En la parte superior, importamos middleware const. También puedes llamarlo OT es igual a requerir que vayamos uno más completo arriba, middleware Para ejecutar este middleware antes de esta función de devolución de llamada de la API, tenemos que agregarlo aquí antes de la Cuando los usuarios envían Get request a este punto final, primero, se ejecutará esta orth función middleware En ese middleware, qué token de acto es válido o no. Si es válido, solo entonces llamamos a la siguiente función, que ejecutará esta función de devolución de llamada API Si en nuestra aplicación, queremos crear cualquier API protegida, solo tenemos que agregar Omddalware antes de esa función de devolución de llamada de API Tan simple como eso. ¿ Me puede decir cómo podemos obtener los datos de los usuarios que han iniciado sesión? Correcto, obtenemos los datos de usuarios registrados de request dot user. Así que el usuario costo equivale a solicitar usuario punto. Y aquí simplemente enviamos a este usuario en el método response dot json. Ahora vamos a probar esta implementación. Guarda los cambios y primero, necesitamos generar token. Abra el cliente Thunder y vaya a API de inicio de sesión. Aquí tenemos los datos, por lo que simplemente podemos enviar esta solicitud de inicio de sesión. Bueno. Aquí conseguimos el token. Asegúrate de generar el token de letras porque establecemos 2 horas de caducidad. Copia este token, y aquí creamos una nueva solicitud. Dale un nombre, usuario iniciado sesión. En primer lugar, escribimos el punto final API, que es HTP, Callan double forward slash local host, 3,000 API Ahora envía esta solicitud. Ver, aquí nos sale el error. Se requiere token de autorización porque no pasamos el token en el encabezado de autorización. Entonces para pasar el encabezado de autorización, vamos a encabezados. Aquí agregamos un nuevo encabezado, clave para la autorización. Ver, también obtenemos autorización, y aquí lo que vamos a pasar. Sí, tenemos que pasar token, pero con prefijo, espacio de error, y aquí pasamos un token. Asegúrate de no pasarlo con códigos dobles. Ahora vamos a enviar la solicitud. Ver, aquí obtenemos los datos de los usuarios de inicio de sesión con nombre ID, Es el que es el emitido en, este es el momento en que se genera este token y EXP es el tiempo de caducidad, lo que significa cuando este token caducará. Además, si revisamos nuestro terminal, una Consola el encabezado de autenticación Verás, primero obtenemos el prefijo portador, y luego obtenemos token. Entonces así es como agregaremos middleware de autenticación para que nuestra API esté protegida Entonces aquí estamos obteniendo solo nombre de usuario e ID. Enviemos toda la información sobre el usuario que ha iniciado sesión. Entonces en la ruta del usuario, aquí agregamos Fine query, sconctUser es igual a esperar usuario dot find Y aquí pasamos nuestro ID de usuario, que es request dot user dot underscore ID Seleccione punto, y aquí no queremos enviar contraseña. Yo cadena menos contraseña, y luego devolvemos respuesta punto jacon este usuario Quitar esta primera línea de usuario, no la necesitamos. También, tenemos que hacer de esta función una. Guarda los cambios y toma un. ver, ahora obtenemos los datos completos de los usuarios registrados. Ahora podemos utilizar esta ruta para obtener la información completa del usuario de inicio de sesión actual. Así es como el usuario autenticado inicia sesión o no mediante el uso de esta función de middleware de Os 103. OAuth en detalles: Entonces en los videos anteriores, vimos cómo nos registramos e ingresamos los usuarios usando correo electrónico y contraseña, lo cual es muy importante. Pero hoy en día, es posible que haya visto que muchos sitios web ofrecen algunas características adicionales, como podemos iniciar sesión con Google, iniciar sesión con Facebook, Twitter, iniciar sesión con Github y la lista sigue y sigue dependiendo del tipo de sitio web. A muchos usuarios les gusta usar estos métodos para firmar. Si utilizan estos métodos, no necesitan crear una nueva contraseña para otro sitio web y recordarla. Simplemente usan su ID de Google alguna identificación social e inician sesión en nuestro sitio web. Además, es realmente seguro. Por lo que es muy útil que agreguemos estas características en nuestra aplicación también. Pero antes de agregarlos, podrías preguntarte cómo funcionan estas características detrás de escena. Entonces aquí está la arquitectura completa del proceso de firma. No tengas miedo. Escúchala como solo una historia porque en nuestra vida diaria, ya estamos usando estas características. Supongamos que aquí hay un Hali que usó un sitio web llamado Amazon o Ebay Ese sitio web, tiene opción de firmar o registrarse con Google. Si haces clic en este botón, este botón lo redirige a la página de inicio de sesión de Google. Aquí ingresa su correo electrónico y contraseña de Google e inicia sesión. Si ingresa escribe correo electrónico y contraseña, entonces algo sucede en la página web, y al final, inicia sesión en el sitio web de Amazon o eBay con su correo electrónico de nombre de usuario sin crear la nueva contraseña. Esto es realmente increíble. Ahora la parte principal está pasando entre estos. Déjame decirte lo que pasó ahí. Cuando Harley ingrese, escriba correo electrónico y contraseña en la cuenta de Google y presione Iniciar sesión, servidor de Google generar un código temporal y enviar este código temporal a nuestro backend Ahora, en el backend, usando este código, podemos obtener algunos detalles de uso a los que queremos acceder y almacenarlos en nuestra base de datos, como nombre del usuario, ID de correo electrónico, etcétera Así que nuestro backend volverá a ponerse en contacto con el servidor de Google y les dirá que queremos acceder a los datos de uso en lugar de este código temporal Por lo que el servidor de Google verifica el código y extrae los datos del usuario de ese código. Y luego el servidor de Google envía estos datos de uso al backend En nuestro back-end, tenemos estos datos de uso y podemos usar esos datos de la manera que queramos usar. Al igual que podemos almacenar el nombre de usuario y el correo electrónico del usuario en nuestra base de datos y generar un nuevo usuario, o si el correo electrónico del usuario ya está disponible, no hacemos nada y simplemente redirigimos al usuario al front-end con token. Ahora bien, cuando aprenda por primera vez sobre esta arquitectura, que es el Juramento o podemos llamar autorización abierta El tiempo, tengo una pregunta y estoy seguro de que tienes la misma pregunta. ¿Por qué el servidor de Google envía primero este código temporal o de autorización a nuestro backend ¿Por qué no puede enviar directamente la información del usuario? Hay algunas razones por las que servidor de Google envía este código de autorización. Supongamos que Google envía directamente información de usuario como correo electrónico o datos de perfil al front-end, luego puede ser detenida o eliminada por piratas informáticos y también templada o mal utilizada antes de llegar a nuestro backend También el código temporal actúa como un permiso para dormir. Le dice a Google que este usuario ha iniciado sesión y dado permiso a nuestra aplicación. Solo nuestro back end con una clave secreta puede extender este código para los datos reales del usuario. Esta clave secreta nos la da Google, y solo estará disponible en nuestro back end InvFle igual que nuestra clave secreta JWT Por el motivo de seguridad, Google envía primero, solo código temporal o de autorización. Aquí está el resumen de cómo funciona OAuth. El usuario primero haga clic en, inicie sesión o regístrese con botón de Google y luego se redcurs a la página de inicio de sesión de Google, o podemos decir servidor de Google Ahora, después de eso, servidor de Google, verifique que el correo electrónico y la contraseña sean correctos o no. Si es correcto, entonces Google genera código de autorización y lo envía al backend Backend nuevamente envía el código de autorización con la clave secreta al servidor de Google, y el servidor de Google extrae los datos del usuario como nombre, correo electrónico, perfil de cerdo, etcétera Ahora, por fin en el back-end, podemos almacenar esos datos en nuestra base de datos, o si el usuario ya está disponible, entonces simplemente podemos redirigir al usuario a página principal del front-end con JWT Token Tan simple como eso. Entonces esta arquitectura funcionará para todo tipo de redes sociales como iniciar sesión con Facebook, iniciar sesión con Github, Twitter, etcétera No sólo para Google. Yo uso aquí Google como ejemplo. Si necesitamos Facebook, entonces este servidor de Google cambió por Facebook autoriza y servidor o Github autoriza y Ahora en la siguiente lección, prácticamente implementaremos este Juramento en nuestra aplicación Catwis 104. OAuth en una aplicación de nodos: inicia sesión con Google: Implementemos el inicio de sesión con función de Google en esta aplicación. Y para eso, necesitamos un paquete llamado passpod dot js. Entonces en OT Architecture, cuando el usuario haga clic en iniciar sesión con Google Pattern, redirigiremos al usuario a Supongamos Local host Columna 3,000 slash APIs OT slash página de Google Esta es nuestra API de backend. ¿Cómo podemos definir? Queremos mostrar la página de inicio de sesión de Google o enlazar el servidor de Google con esta página. Además, si en el back end, obtenemos el código de autorización, ¿cómo podemos enviar solicitudes al servidor de Google y recuperar los datos del usuario? Sí, podemos hacerlo todo de forma manual, pero el pasaporte Js Library lo hace mucho más fácil. Nosotros lo usaremos. No te confundas. Simplemente vea esta lección completa y obtendrá cómo está funcionando esta implementación de Juramento Entonces vamos a la página de passports.org. Aquí podemos ver pasaporte es middleware de autenticación para No Jz, extremadamente flexible En la parte inferior, obtenemos todas las estrategias como Facebook, Twitter, Google, Github, etcétera No te preocupes, simplemente ve a la barra de búsqueda y busca aquí, Google, y selecciona este pasaporte Google Oth dos. Asegúrate de no seleccionar este juramento 20. Usamos Oth dos. Estos dos son muy similares, pero este Juramento 20 es una estrategia más antigua No está realmente bien cuidada. Entonces usaremos este OR dos, que tiene nuevas características y se mantiene activamente por pasaporte. Déjame acercarme un poco. Sí. Entonces, antes que nada, necesitamos instalar este paquete. Entonces copia este comando de nuevo al código Vas, open terminal, y en ese terminal, simplemente pasamos el comando aquí. Y para la misma versión, se puede escribir a la tasa 0.2 0.0. Y también, necesitamos paquete de pasaporte a la tasa, 0.7 0.0, y pulsamos Enter. Bueno. Ahora volvamos a la documentación. Aquí nos dan código completo para implementar pasaporte con estrategia de Google. Copia todo este código, y en nuestro backend, podemos pegar este código en nuestro índice punto Gs archivo Pero Detw estropeó nuestro archivo index dot js, así que podemos almacenar ese código en el archivo separado Para eso, creamos una nueva carpeta llamada Config y dentro de ella, creamos un nuevo archivo, passport dot JS y página que codifique dentro de este. Por ahora, no te preocupes por este código. Voy a explicar este código y también haremos algunos cambios más adelante. Ahora volvamos a la documentación, desplácese hacia abajo, y aquí podemos ver que nos dan para obtener APIs para agregar en nuestra aplicación. primera API es Auth Google y en el lugar de la función de devolución de llamada, pasa el método de autenticación de punto pasaporte, y en la primera posición, pasan a Google, que es el servidor de autenticación, y después de eso, pasan el alcance de los datos Básicamente, están diciendo qué datos de usuario queremos obtener del servidor. Queremos correo electrónico y perfil, que incluyen muchos detalles sobre el usuario. Ahora podrías preguntar qué va a hacer esta API. Cuando el usuario envía obtener solicitud desde el navegador en este punto final de Google Oth barra diagonal, este método de autenticación de punto de pasaporte abrirá la página de inicio de sesión de Google Para agregar esta ruta en nuestra aplicación, podemos hacer algo como esto. En la carpeta route, creamos un nuevo archivo auth dot js. Creación de rutas separadas para la autenticación. En esto, antes que nada, necesitamos que Cost Express sea igual a requerir Express. Para agregar ruta, agregamos costo Router es igual a express dot Router. Ahora, de la documentación, copiamos esta primera ruta y la pegamos en la ruta oth. También en la parte superior, tenemos que ingresar pasaporte porque aquí estás usando pasaporte. Const pasaporte es igual a requerir pasaporte. Ahora en el lugar de esta app punto GAD, ¿qué utilizamos? Derecha, utilizamos router punto GAD. Además, no agregamos este OT. Mencionaremos barra OT como prefijo, igual que definimos prefijo para ruta de usuarios Ahora en la parte inferior, tenemos que exportar esta ruta. Por lo tanto, las exportaciones de punto del módulo es igual al enrutador. Guarda esto y antes de que nos olvidemos de agregar esta ruta en el archivo index dot js, vamos a agregarlo. Después de la ruta de este usuario, agregamos app.us. Aquí agregamos prefijo API OT. En el segundo parámetro, tenemos que pasar rutas de Auth Por lo que ingresamos costo Os rutas es igual a requerir. Aquí vamos en rutas carpeta OT. Ahora simplemente pasamos estas otras rutas en esta app due method. Ahora volvemos a auth dot js file. Aquí hemos especificado el usuario Xs API Auth barra Google, debería abrir la página de inicio de sesión de Google Ahora, después de que los usuarios inicien sesión con éxito, entonces lo que queremos hacer tenemos que especificar eso también. Recordemos anteriormente, teníamos algún código de estrategia en el archivo Passport dot JS Entiende este código, y además haremos algunos cambios en este código. En primer lugar, en la parte superior, necesitamos pasaporte de la biblioteca de pasaportes porque lo estamos usando aquí. SegundoPasaporte es igual a requerir pasaporte y también cambiar esta r a costo Después de eso, tenemos pasaporte dot ug y dentro de esto, tenemos nueva estrategia de Google, que obtenemos de pasaporte, autor de Google al paquete. Por esta estrategia, no necesitamos escribir código manual para obtener código de autorización y extraer datos del servidor de Google Esta estrategia hace todo esto por nosotros. Después de eso, tenemos objeto con un montón de propiedades como ID de cliente y secreto de cliente. Obtendrás este ID cuando registres tu app con Google Console, y con eso, también obtenemos el código secreto del cliente. Sin estos dos rellenos, Google no nos dará datos a los usuarios. Entonces, vamos a generar esto también. De nuevo, te lo digo, no te preocupes por este código. Cuando terminemos esta implementación, te mostraré el flujo de trabajo completo de este código. En el navegador, busque, Google Cloud Console. Abre este segundo enlace. Aquí, tenemos que iniciar sesión con nuestra cuenta de Google. Puedes usar cualquier cuenta. Ahora, después de iniciar sesión, se ve así. No te preocupes, solo tienes que ir aquí Seleccionar proyecto y crear un nuevo proyecto. Dale un nombre. Digamos Card Wish y haz clic en Crear. Aquí en la notificación, se está creando y seleccionar este proyecto. Cuando seleccionamos este proyecto, podemos ver ese proyecto aquí. Ahora necesitamos API y servicios. Da click en estas tres líneas y en la API y servicios, vamos a la pantalla de contenido O OT. Simplemente haz lo que yo hago y ya estás listo para ir. Haga clic en este botón Comenzar. Aquí, tenemos que hacer algunos ajustes de configuración. En primer lugar, aquí tenemos que escribir el nombre de la aplicación. Nuevamente, escribimos Cartwish. Después de eso, seleccione su correo electrónico de soporte y haga clic en Guardar. Ahora aquí tenemos que seleccionar el tipo de audiencia, seleccionar aquí externa. Por eso cualquier usuario puede iniciar sesión en nuestra aplicación y hacer clic en siguiente. Aquí escribimos nuestro correo electrónico en el que queremos recibir notificaciones relacionadas con esta app y pulsamos en siguiente por fin, términos precisos y continuar y crear app. Ahora vamos al acceso a datos desde la barra lateral izquierda. Aquí, tenemos que seleccionar el alcance de los datos de usuario. alcances expresan el permiso que solicitas a los usuarios para que autoricen tu app y permitan que tu proyecto acceda a tipos específicos de datos de usuarios privados desde su cuenta de Google Simplemente haga clic en agregar o eliminar alcances. Seleccione el primero para enviar un correo electrónico y perfil y haga clic en Actualizar y guardar esto. Ahora ve a esta audiencia, y aquí podemos agregar usuarios de sabor. A veces si después de toda la implementación, nuestros usuarios no pueden iniciar sesión, entonces podría ser que tengamos que agregarlos en el gusto de los usuarios. Cuando hice esto, no encontré ningún error. Así que no te preocupes por eso. Simplemente acude a los clientes. Aquí, tenemos que generar credenciales OO, y para eso, damos clic en Crear cliente. Seleccione el tipo de aplicación a la aplicación web. Nombre, no necesitamos cambiarnos. Pero en la parte inferior, tenemos que agregar URI de redirección autorizados Un URI de redireccionamiento es el punto final en nuestra aplicación de back end donde Google redirige al usuario después de que inicia sesión correctamente Aquí, escribimos STP, Column double forward slash local host, Column 3,000 API OT, Google, slash Recuerda este punto final. Necesitamos definir esta API en nuestro back-end. Y haz clic en Crear y listo. Ver, aquí obtenemos ID de cliente y también secreto de cliente. Copia este ID de cliente y en nuestra aplicación en el lugar de este ID de cliente de Google, podemos paginarlo o para hacerlo seguro, podemos ponerlo en archivo punto ENV Creo que eso es más seguro. ¿Qué opinas? Así que en archivo ENV punto en nueva variable, Google, subrayado, ID de subrayado de cliente Es igual a asegurarse de que no addere espacio y pasado aquí ID de cliente de su aplicación de Google Después de eso, copie este secreto de cliente, vuelva a VSCode, y simplemente adhiera Google, subrayado, cliente, secreto de subrayado Igual a basar aquí secreto. Guarde este archivo y vuelva al archivo pasaporte punto js. Aquí, pasamos proceso punto y punto Google, subrayamos ID de subrayado de cliente Y aquí pasamos proceso punto n punto Google, cliente de subrayado, subrayado secreto Ahora después de eso, tenemos la propiedad de URL de devolución de llamada. Asegúrate de que aquí escribimos el mismo punto final que pasamos en nuestra Google Console App. Podemos ver eso desde aquí, da clic en este botón de edición, y aquí tenemos la URL de devolución Copia esto y pegarlo en códigos dobles. Al final, no toque esta solicitud de pase a la propiedad de devolución Asegúrate de que esté establecido en true. Pasará el objeto request a esta URL de devolución de llamada. Ahora, después de esto, en el segundo parámetro, tenemos la función de devolución de llamada, o podemos decir la función de devolución de llamada de estrategia Esta función se ejecutará cuando los usuarios inicien sesión con éxito con sus datos, y obtenemos aquí objeto de solicitud, token de acceso, que es un token emitido por Google a nuestra aplicación. Permite que nuestra aplicación realice una solicitud autorizada a las API de Google en nombre del usuario. Después de eso, tenemos el token de actualización, que es un token que se puede usar para obtener un nuevo token de acceso cuando caduque el actual. No te preocupes, no necesitamos esto por ahora. Después de eso, tenemos perfil, que es un objeto con información sobre el usuario autenticado como nombre, correo electrónico, ID de Google, etcétera Obtener estos datos de Google, y realmente depende de los alcances que solicitamos Y al final, lo hemos hecho, que es la función a la que llamas cuando completas el proceso de los datos del usuario. Ahora dentro de esta función, no queremos encontrar usuario ni crear un nuevo usuario. Haremos todo eso en esta API de devolución de llamada. Así que aquí eliminamos este código y simplemente reten aquí este método hecho En el primer argumento, pasamos error que es nulo. En el segundo argumento, tenemos que pasar los datos de los usuarios. En este caso, podemos pasar directamente perfil. Para resumir, cuando los usuarios iniciaron sesión con éxito con Google, se ejecutará la devolución de llamada estratégica y en este perfil, obtenemos datos de usuarios del Ahora cuando llamamos a este método hecho con un nulo y datos de usuario al perfil, passport ejecutará este punto final de API, y definiremos ese punto final en la siguiente lección. 105. OAuth con JWT: Ahora definamos este último paso de la autenticación de Google, que es agregar esta API de devolución Donde añadimos esta API, definiremos en las rutas ShorthtJSFLE Aquí ya agregamos una API, que es el paso uno. Ahora agregamos aquí otro router punto Get method, endpoint slash Google slash callback Tienes que darle lo mismo que pasas en la propiedad de devolución Entonces, como sabemos, Google enviará datos de uso en esta ruta de devolución de llamada, y para eso, tenemos que volver a adherir pasaporte Middleware Passport dot autenticar. Aquí pasamos Google en el segundo argumento, establecemos objeto con propiedad, que es SSN a false Esto le dirá a la biblioteca de Passport que no almacene el ID de usuario en la sesión. Y también pasamos una propiedad más, falla, redirección, y cuando los datos del usuario fallarán, entonces aquí, el servidor de Google redireccionará a nuestro usuario. Entonces aquí tenemos que pasar nuestra URL de front-end. Aquí, por ejemplo, pasamos la app Local React. Se puede escribir columna SDTP, barra diagonal doble hacia adelante Host local C5173 slash Iniciar sesión. Esto es muy importante. Ahora, después de eso, podemos agregar nuestra función de devolución de llamada, que ejecutaremos después de enviar datos de perfil desde la estrategia de contraseña callback desde aquí Ahora bien, ¿cómo podemos obtener datos en esta devolución de llamada? Entonces obtenemos datos en el punto de solicitud usuario, y vamos a almacenar esta invariable llamada perfil y simplemente devolvemos este objeto de perfil en el punto de respuesta Json y pasamos perfil Ahora vamos a probar que esto está funcionando o no. Para probar esta implementación, tenemos que enviar Get request al endpoint. Abra el Navegador y diríjase a Columna SGTP doble barra hacia adelante Anfitrión local, Columna 3,000. Si tu aplicación se está ejecutando en otro pod, entonces tienes que escribir tu URL de Bean aquí, y luego reducir API OT slash Google Y aquí nos sale el error. Se trata de decir error y estrategia de no autenticación, Google. Déjame revisar. La estrategia de Google es correcta. Además, pasamos el nombre correcto de las variables ENV. Déjame verificarlo dos veces. Sí, son iguales. Oh, espera. No agregamos este archivo passport dot js en nuestro archivo index dot s, y por eso, este archivo no se configuró en nuestra aplicación. Creo que esta es la razón por la que estamos recibiendo ese error. Así que vamos al índice punto Gs archivo, y en la parte superior, agregamos require, vamos a carpeta Config y pasaporte. Vea los cambios y reiniciemos nuestra aplicación. Lun índice punto js. Ahora volvemos a Navegador y descanso la página, mira, redireccionamos directamente a la página de Google Login. Aquí podemos ver el nombre de nuestra aplicación, que mencionamos en nuestra Consola de Google. Bueno. Ahora, tienes que escribir los datos de tu cuenta de Google y simplemente iniciar sesión con eso. Aquí te pide tu permiso para permitir que Google envíe tus datos de correo electrónico y perfil a esta aplicación. Continúa, y aquí puedes ver que obtenemos el objeto de datos del perfil de usuario. En la parte superior, obtenemos proveedor, que es el ID de Google, que es el ID único de Google. Nombre para mostrar a su nombre, guion de correo electrónico verificado a verdadero para que obtengamos EML ID y muchos más detalles Puedes usar cualquiera de estos datos y almacenarlo en tu base de datos. Por lo que hemos completado nuestro importante trabajo para la autenticación de Google. Ahora solo necesitamos verificar si el usuario con este ID de EML ya está disponible en nuestra aplicación o no No está disponible, entonces creamos un nuevo usuario con su nombre de correo electrónico, ID de Google, pero dejamos el relleno de contraseña porque para iniciar sesión con Google o Facebook, no necesitamos rellenar contraseña, y luego generamos el token JWT para los datos de ese usuario Si el usuario ya está disponible en nuestra base de datos, entonces no se preocupe, simplemente actualizamos su ID de Google en nuestra base de datos y luego generamos token JWT para los datos de ese usuario Entonces para implementar esto, necesitamos cambiar un poco el esquema de nuestros usuarios. Cómo hacer estos cambios porque en nuestra aplicación, tenemos usuario que puede iniciar sesión con correo electrónico y contraseña, y también algún usuario puede iniciar sesión con Google. Primero modifiquemos el esquema de usuario. Aquí hacemos contraseña, requerida a true. Pero como sabemos, cuando el usuario inicia sesión con Google, no almacenamos la contraseña, por lo que tenemos que cambiar requerido a false. Además, cuando creamos un nuevo usuario usando el Login de Google, entonces tampoco almacenamos la dirección de entrega. Por lo que también podemos hacer requerido a false para la dirección y también eliminar esta propiedad de longitud media. Después de eso, podemos agregar un campo más para el usuario que usó Google para iniciar sesión. Agregamos el tipo de ID de Google a la cadena y único a True. Podrías preguntar por qué necesitamos este ID de Google en nuestra base de datos? Necesitamos este ID de Google porque al usar eso, podemos identificar al usuario ya está disponible en nuestra base de datos o no. Pero aquí, ya tenemos el correo electrónico de los usuarios. ¿Por qué no podemos usar ese correo electrónico? Ver, en el navegador, estamos obteniendo estos detalles de perfil. Aquí tenemos correos electrónicos propiedad, que es la matriz de correos electrónicos. Una cuenta de Google tiene uno o más correos como arrojado gmail.com, que es el correo principal, hurleredcorporate.com para correo electrónico de trabajo, hurleredcorporate.com Si Harley cambia su correo principal, entonces para la misma cuenta de Google, podríamos crear una nueva cuenta de usuario. Para eliminar este riesgo de correo electrónico, almacenamos el ID de Google. Otra razón aquí que tenemos para usar el ID de Google es porque alguien puede cambiar su dirección de correo electrónico de la cuenta de Google, pero no puede cambiar el ID de Google. El ID de Google es único para todos los usuarios de Google, y es por eso que almacenamos a los usuarios Google ID. Además, el ID de Google es para identificar solo a los usuarios que inician sesión usando Google, no para los usuarios que crearon cuenta usando un simple correo electrónico y contraseña. Para aquellos que usamos el correo electrónico para identificar. Guarde este archivo y escribamos rápidamente nuestra lógica en esta ruta de devolución de llamada de Google Yo escribo comentario para esta lógica. Primero verificamos que el usuario esté disponible o no usando su ID de Google o con correo electrónico. Si el usuario está disponible, entonces actualizamos su campo de ID de Google y luego simplemente generamos el token JWT y lo enviamos en la respuesta Aquí no necesitamos verificar la contraseña porque el usuario está conectado con Google. I usuario no está disponible, entonces creamos un nuevo usuario con nombre, correo electrónico, ID de Google, y luego generamos token JWT y lo enviamos en respuesta Al final, tenemos que enviar el token JWT al front-end, simple como eso En primer lugar, qué usuario está disponible o no. Para eso, necesitamos colección de usuarios. Entonces en la parte superior, costo usuario equivale a requerir, vamos una carpeta arriba modelos usuarios. Ahora en la parte inferior, escribimos consulta fina, punto de usuario Fine one. Y aquí pasamos Object y agregamos condición, Google ID. Para perfilar ID de punto. Además, ¿qué pasa si alguien primero ingresa con correo electrónico y contraseña y luego intenta iniciar sesión con Google En ese momento, no encontramos que los usuarios Google ID en nuestra base de datos. Por lo que necesitamos también encontrar usuario basado en el correo electrónico. Puedes usar aquí u operador. Agregamos dólar o columna, y tenemos que agregar aquí matriz de condición múltiple. Entonces agregamos un objeto de condición, Google al ID de punto de perfil, y segundo objeto de condición, correo electrónico, al correo electrónico de punto de perfil. Ahora aquí hay una cosa. Este campo de correo electrónico de punto de perfil no estará disponible al 100%. Para algunas cuentas de Google, funciona, y para pocas cuentas, no funcionará. Entonces, como una buena práctica, desarrollador no utilice este campo de correo electrónico de punto de perfil. Utilizan correos electrónicos de puntos de perfil, que es la matriz y accedemos a su primer elemento por corchete cuadrado índice cero, y por valor, adherimos valor de punto. Como sabemos, esta consulta devuelve una promesa, por lo que podemos adherirnos a esperar, en almacenar el objeto de usuario en variable, dejar usuario. Además, para usar esperar, tenemos que hacer este callback acing Ahora aquí tenemos dos escenarios. Si el usuario está disponible, y de lo contrario el usuario no está disponible. Ahora lo que queremos hacer si el usuario está disponible, comprobaremos que el ID de Google está almacenado o no. Yo usuario Google ID no está disponible, entonces establecemos usuario dot Google ID. Igual a ID de punto de perfil. Este ID de punto de perfil es ID de Google. Y después de eso, para ahorrar ayuda, escribimos esperar usuario punto guardar. Ahora en lo demás, tenemos que escribir lógica para que el usuario no exista. Básicamente, crearemos un nuevo usuario. Así escribimos usuario es igual a nuevo usuario. Aquí pasamos objeto con propiedades. El primero es nombre a perfil, nombre para mostrar punto. Después envíe un correo electrónico a los correos electrónicos de punto de perfil. Aquí, accedemos al valor de punto del primer elemento. Igual que antes. Última propiedad, necesitamos ID de Google para perfilar ID de punto. Para guardar este nuevo usuario, escribimos aquí esperar usuario punto guardar. Solo hay que hacer una cosa. Genera token JWT y envíalo. Entonces costo token es igual a, vamos a la ruta del usuario. Copiamos este método de signo JWT para generar token y lo pegamos aquí Aquí al ritmo de esta variable de datos, tenemos que pasar los datos que queremos enviar dentro del token. Y lo que hemos pasado en login, sí, pasamos ID y nombre solamente. Entonces aquí también pasamos ID de subrayado, no ID de Google. Google ID es solo para backend para verificar esta condición Simplemente copie este objeto de datos y páselo aquí. Si quieres enviar correo electrónico también, entonces también puedes menton eso Pero es importante en todo token, envías los mismos detalles. Será fácil para el front-end usar esos datos. También asegúrate aquí que tenemos que importar JWT. Costo JWT es igual a requerir token web JSON. Ahora en el lugar de enviar estos detalles de perfil en respuesta, enviamos token JWT, sems enviamos token en el simple registro e inicio de sesión con correo electrónico y contraseña Además, a veces los desarrolladores front-end te dicen que redirijas al usuario en la página principal directa del front end. En ese momento podemos hacer algo así. Respuesta punto RedIC y aquí usamos plantilla de cadena. Aquí, tenemos que mencionar nuestra URL de página de front-end en la que queremos redirigir al usuario después de iniciar sesión con éxito con Google. F localmente, podemos escribir SDDP, Column double for slash local host, Column 5173, que es Aquí tienes que escribir tu URL de front-end , slash dashboard Aquí pasamos token en parámetro de consulta usando signo de interrogación, token es igual al dólar Cali corchetes, token. También puedes cambiar esta URL como quieras. Realmente depende de tu front-end. Muchos desarrolladores redirigen a los usuarios, y algunos desarrolladores envían solo token. Te muestro en ambos sentidos, puedes elegir lo que te diga tu desarrollador front-end. Por último, hemos implementado la función de inicio de sesión con Google en nuestra aplicación. Recapitulemos lo que hemos hecho en las dos últimas lecciones. En primer lugar, el usuario haga clic en el inicio de sesión con Google Button. Nuestro front-end redirigirá al usuario al host local Columna 3,000 barra diagonal API Ath barra Google Esta es nuestra URL de Bend. Si tu back end se está ejecutando en el host local 8,000, entonces el usuario debe redirigir al host local 8,000 API Auth Google Ahora, cuando el usuario redirija a API Auth Google, este código se ejecutará Aquí mencionamos pasaporte punto autenticar con Google y mencionar el alcance Ahora, después de eso, directamente se ejecutará este código, que está disponible en el archivo JS del pasaporte. Aquí, el pasaporte envía nuestro ID de cliente, el secreto del cliente y la URL de devolución donde queremos enviar los datos del perfil Después de que los usuarios inicien sesión con éxito la cuenta de Google y permitan el permiso, entonces esta función se ejecutará, y aquí devolvemos el método con error null y datos de perfil. Estos datos de perfil, podemos acceder como usuario punto de solicitud en nuestra función de devolución Además, asegúrate de que aquí no podemos pasar la solicitud de devolución de llamada a True Después de eso, nuestra API de devolución de llamada se ejecutará, y aquí escribimos nuestra lógica de usuario, y luego enviamos o redireccionamos al usuario con token Tan simple como eso. Seguro que todas tus dudas son claras. No te preocupes, esta es tu primera vez y por eso, estás un poco confundido. Pero con el tiempo, entenderás esto sin ninguna confusión. Últimas dos lecciones un poco largas, pero solo mira lo que has implementado en tu aplicación. Enhorabuena por eso, puedes tomarte un pequeño descanso de la pantalla y luego continuar con esta sección. 106. Inicia sesión en Facebook con OAuth: Así que anteriormente, añadimos iniciar sesión con Google. Ahora también podemos agregar inicio de sesión con Presbook o cualquier otra plataforma como Github o Twitter Hay algunos pasos comunes que tenemos que seguir. Paso número uno, instalar pasaporte y biblioteca de estrategia de pasaporte en la aplicación de nodo. Paso dos, agregar el primer punto final de API, que activará el pasaporte con esa estrategia. Paso número tres, agregue código de estrategia de pasaporte en el archivo passport dot js. Igual que agregamos la estrategia de Google. Paso número cuatro, generar ID y secreto para esa plataforma. Por último, paso número cinco, defina la API de devolución de llamada, almacene los datos de los usuarios si es necesario y envíe el token JWT Con estos cinco pasos, podemos agregar cualquier plataforma en OT. Déjame mostrarte rápidamente cómo podemos implementar el inicio de sesión con Facebook. Paso número uno, tenemos que instalar estrategia de pasaporte. Vamos a la documentación del pasaporte y buscamos aquí Facebook. Ver, aquí obtenemos comando de instalación, copia esto y simplemente pégalo en nuestro terminal. Además, si quieres usar la misma versión que estoy usando, entonces puedes agregar aquí a la tasa 3.0 0.0 y presionar Enter. Ahora paso Número dos, tenemos que agregar API y punto, lo que abrirá la página de inicio de sesión de Facebook. Entonces, en la documentación del pasaporte, desplácese hacia abajo. Y aquí obtenemos el código API. Ver, se ve muy similar a la API de Google. Recuerda, y simplemente copia esta primera API. Y en nuestro archivo th dot js, después de esta API de devolución de llamada, simplemente la pegamos aquí Colgar este punto API para cortar Facebook y también pasaporte punto autenticar con Facebook, y por alcance, tenemos que escribir aquí perfil de subrayado público Paso número tres, tenemos que agregar código de estrategia de pasaporte para Facebook. Así que vuelve a ir al sitio web del pasaporte y copia este código de estrategia. Volver a viscodeopen passport dot js file, y simplemente en la parte inferior, pegamos este código Ahora tenemos que hacer alguna corrección. En primer lugar, hay que importar estrategia de Facebook del paquete. Así que duplica esta línea de estrategia de Google y simplemente cambia este nombre de variable a estrategia de Facebook. Igual que usan aquí, y también cambiamos el nombre del paquete a pasaporte Facebook. Bueno. Ahora aquí, tenemos que agregar estos rellenos Facebook ID y Facebook secret que es el paso número cuatro. Para generar el ID de la aplicación y el secreto de la aplicación, tenemos que ir a la página de desarrolladores de Facebook. Mencione todos los detalles en la documentación de la contraseña para cada plataforma. No te preocupes por eso. La nueva pestaña, busca aquí, Facebook, desarrollador, consola y abre este primer enlace. Aquí, haga clic en Iniciar sesión. Estoy ingresando con mi cuenta. Bueno. Después de iniciar sesión, llegamos aquí para comenzar la opción. Podrá solicitarle el registro y verificar. Complete los pasos básicos, y luego redirigirá a esta página de aplicaciones. Haga clic en Crear aplicación. Aquí, escribimos nuestro nombre de aplicación, que es Cardvis. Estos son los mismos detalles que rellenamos en la Consola de Google. Ahora agregue casos de uso, por lo que queremos autenticar y solicitar datos a los usuarios con inicio de sesión de Facebook Se así y da click en siguiente. Aquí, seleccione, no quiero conectar cartera de negocios. Puede que no obtengas esta opción porque recientemente, Facebook se vuelve estricto al respecto. Así que lo siento si no tienes la opción aquí, pero no te preocupes, escribe un código como yo estoy escribiendo. En el futuro, solo tienes que agregar solo el ID de la aplicación de Facebook y el secreto de la aplicación. Aquí, da clic en siguiente y siguiente y listo vaya a Deskboard ahora aquí, tenemos que completar estos pasos Entonces Clikon personaliza agregando un botón de inicio de sesión de Facebook. Aquí, teníamos permiso. Agregar correo electrónico y el perfil público ya está agregado. Ahora da click en este inicio rápido. Aquí, seleccionamos web aquí mismo, nuestra URL de front-end. Por ahora, solo escribe aquí, STTP, Columna doble slash hacia adelante, Host local, Columna En el mundo real, tienes que escribir tu URL de front-end aquí y hacer clic en Guardar y continuar. Haga clic en siguiente, haga clic en siguiente, haga clic en siguiente y listo. Ahora simplemente vaya a la configuración de la aplicación en la parte inferior y vaya a la configuración básica. Aquí obtenemos APID y App Secret. Copia este APD y en nuestro archivo punto ENV, agregamos otra variable llamada Facebook, aplicación de guión bajo, ID de guión bajo Pasado el ID de la aplicación. Después de eso, agregamos otra variable llamada Facebook underscore app, underscore secret es igual a volver al navegador, y aquí damos click en show puede pedir tu contraseña de Facebook, escríbalo y mira aquí podemos ver el código secreto Copia eso y simplemente pegarlo en archivo ENV. Guarde el archivo y vuelva al archivo de pasaporte punto JS. Aquí, nosotros en process.nw dot Facebook underscore app, underscore ID Y aquí también procesamos dot nwt Facebook underscore app underscore secret Ahora, después de eso, simplemente copiamos estas dos propiedades del código anterior, callb URL y también pasamos request to callback y las paginamos aquí para Facebook Justo aquí, tenemos que cambiar la URL de devolución de llamada para cortar API Oath, cortar API Oath, cortar Además, tenemos que agregarle una propiedad más porque Facebook no es como Google Facebook no envía muchos datos, así que tenemos que especificar la propiedad llamada campos de perfil a array, y en esta matriz, agregar todos los rellenos nombre de Facebook. Agregamos ID, que es el ID único de Facebook, y es único para cada usuario de Facebook, igual que el ID de Google. Además, pasamos correos electrónicos para correos electrónicos, nombre, nombre para mostrar. Comma imagen punto Tipo, y entre paréntesis, grande Esto es para obtener foto de perfil. La mayor parte de la aplicación utiliza estos datos. Ahora aquí para callback, queremos hacer lo mismo que esta estrategia de Google Así que simplemente copiamos esta estrategia callback y la basamos en la estrategia de Facebook Aquí, nuestro paso cuatro está completo. Guarde este archivo. Ahora último paso número cinco, solo tenemos que definir esta ruta de devolución de llamada para el Facebook Bolígrafos punto gs archivo. Aquí simplemente podemos copiar esta devolución de llamada de Google y pegarla en la parte inferior También en la parte superior, noto que tenemos que cambiar esta app dot GAD a router dot gat Bueno. En primer lugar, cambiamos la API y apuntamos a cortar Facebook slash callback y también en passport dot Autenticar en el lugar de Google, Ahora en la devolución de llamada API, tenemos que cambiar este ID de Google con ID de Facebook Entonces tenemos que agregar otro campo en nuestro esquema de usuarios igual que el ID de Google. Aquí, selecciona Google ID y presiona Control plus T o Command plus y selecciona todos los ID de Google en esta API de Facebook. En el lugar de eso, agregamos Facebook ID, y no necesitamos cambiar nada. Guarda los cambios y no olvides agregar el campo ID de Facebook en el esquema de usuario. Abrir los usuarios punto gs archivo y simplemente duplicar el campo ID de Google y cambiar su nombre a Facebook ID, y estamos listos para ir. Guarde los cambios, menos es esto. Abra Browser y vaya al host local, Columna 3,000 slash API OT slash Facebook Mira aquí obtenemos app no activa. Esta aplicación no es accesible en este momento. El motivo está en esta app, no agregamos ni verificamos el negocio. Recientemente, Facebook se vuelve estricto al respecto, pero esto no importa porque podemos ver cuando hacemos esta Get API con APIs Orth, slash Facebook, estamos obteniendo la página de Facebook, lo que significa que por nuestro fin nuestra API está funcionando bien Nuestro principal objetivo es implementar el inicio de sesión con característica. Si tu cliente requiere iniciar sesión con Facebook, puedes usar su negocio y verificar tu aplicación. Después de eso, esta función funcionará, igual que nuestro inicio de sesión con Google está funcionando. Entonces así es como implementamos Auth para nuestra aplicación backend Es realmente simple. Tenemos que seguir estos cinco pasos. 107. Simplificar el código: Ahora como sabemos, en este tanto callback, nuestro código es el mismo Simplemente cambiamos el ID de Google con el ID de Facebook. Como una mejor práctica, podemos definir una función reutilizable común que simplemente escribió token al final. Cortemos esta lógica de et user hasta esta generación de tokens. En la parte inferior, creamos una nueva función, const, handle, u oth callback es igual a la función de flecha En los corchetes de Gly, pasamos este código, y al final, simplemente devolvemos token Ahora, antes que nada, para usar este Avid, necesitamos hacer esta función asíncrona Ahora ¿qué queremos cambiar aquí? Aquí, necesitamos estos datos de perfil, y también necesitamos esta propiedad que queremos cambiar, Google o ID de Facebook. Entonces podemos pasar aquí dos parámetros de perfil, que son los datos completos del perfil, y después de eso, el ID del proveedor. No podemos agregar este ID de proveedor porque cuando llamamos a esta función de identificador o devolución de llamada, pasamos el ID de Google o el ID de Facebook como cadena, y no podemos agregar aquí esa cadena No va a funcionar. Simplemente, podemos usar aquí, corchete, ID de proveedor. Además, en el lugar de usuario punto Google ID, podemos escribir corchetes de usuario ID de proveedor. Esta es la segunda forma de acceder al valor del objeto A aquí y también en el blog Else y hecho. Ahora en la API de devolución de llamada de Google, llamamos a esta función handle orth callback Y pasar aquí perfil en el primer parámetro, y para ID de proveedor, lo que pasaremos escribir, pasamos aquí, cadena, ID de Google. Asegúrese de escribir el mismo nombre de campo que configuró en el esquema del usuario. Ahora, esta función tardará algún tiempo en ejecutarse. Así que podemos usar aquí esperar y esta función devuelve token. Así podemos almacenarlo en token variable. Hagamos lo mismo con la devolución de llamada de Facebook. Copia esta línea de token y en la devolución de llamada de Facebook del usuario let hasta este token, eliminamos esto y simplemente pasamos aquí esta llamada a la función Aquí, no olvides cambiar este ID de proveedor a ID de Facebook. Eso es lo que dijimos, ¿llenar nombre? Sí, es el ID de Facebook. Ver, ahora nuestro código se ve limpio. Ahora en la siguiente sección, crearemos APIs para tarjetas de productos y pedidos de usuarios. Esto es muy divertido. 108. Problema con un solo token [ACTUALIZACIÓN]: Ahora veamos cómo las grandes empresas como Google, Microsoft y Netflix implementan la autenticación segura y fluida, y así es como otras aplicaciones de nivel de producción también implementan la autenticación. Utilizan dos tipos de token JWT, token acceso y token de actualización No te preocupes por estas grandes palabras. Déjame explicarte esto con palabras muy sencillas. Actualmente, en nuestra aplicación, creamos API para registro, un nuevo usuario, y luego creamos API para registrar a ese usuario. Ambas API, estamos enviando token JWT al front-end y nuestro front-end enviará ese token en el encabezado de la solicitud con prefijo de portador y usando ese encabezado, obtenemos información del usuario en nuestro middleware oth Ahora hay dos problemas con este enfoque. El primero es el problema de caducidad del token. Establecimos el tiempo de vencimiento del token para 2 horas después de las 2 horas, nuestro usuario necesita iniciar sesión nuevamente para obtener un nuevo token. Esta es una mala experiencia de usuario porque tienen que iniciar sesión de nuevo cada vez que caduca el token. Ahora se podría decir que podemos aumentar el tiempo de caducidad, y por eso, se solucionará nuestra experiencia de usuario. Sí, esto es cierto, pero de esta manera, hay otro problema que es sobre el riesgo de seguridad. Imagínese para una buena experiencia de usuario, aumentamos el tiempo de caducidad a diez días. Ahora bien, si ese token JWT es robado por otra persona, entonces el atacante o hacker puede usar ese token como lo estamos usando hasta que el token caduque En este caso, no tenemos forma de cerrar sesión o revocar el token Solo tenemos que esperar a que caduque el token. Entonces como podemos ver, no podemos aumentar el tiempo de caducidad. Tienen que hacer este tiempo de caducidad a 5 minutos o 10 minutos. Ahora, para que la experiencia del usuario sea genial, primero Google, idear estos dos conceptos de tokens, que es token de acceso y reprime token y veremos cómo funciona este concepto en la siguiente lección 109. Acceso a token y actualización de la lógica del token [ACTUALIZACIÓN]: Ahora vamos a entender el concepto de exceso de token y refrescar token. Entonces, en el lugar de crear un token, creamos dos tokens en nuestra API de registro o inicio de sesión. Primero token, lo llamamos como token de exceso y segundo token, lo llamamos como token de actualización. Estos dos son tokens JWT, igual que generamos token al final de nuestra API Pero la única diferencia es para el exceso de token, establecemos el tiempo de vencimiento como ordenar como 5 minutos o 10 minutos o máximo en horas para token de referencia, establecemos el tiempo de vencimiento como largo por ejemplo, para cinco días o dos semanas así, token sobrante y token de referencia, ambos son tokens JWT Podemos generarlos usando el método de signo de punto JWT, pero solo su tiempo de vencimiento es diferente Ahora podrías preguntar qué hará diferencia al crear dos tokens por separado. Para que esto sea sencillo me explico tu flujo de trabajo completo para que todas tus dudas se aclaren. Imagina que esto es front end y este es backend. Usuario rellena el formulario de inicio de sesión como correo electrónico y contraseña y envíalo. En el back-end, verificamos los detalles y comparamos la contraseña. Si la información es correcta, entonces anteriormente, estamos creando un token. En este enfoque, creamos dos tokens. Uno es el token en exceso y el segundo es el token de actualización. Damos tiempo de vencimiento del token en exceso para digamos 5 minutos y para el token de actualización, le damos tiempo de vencimiento a cinco días. Almacenamos este token de actualización en la colección del usuario y luego enviamos estos dos tokens al front-end. Nuestro front-end establecemos el exceso de token en el encabezado global de la API con mejor prefijo, igual que antes. Ahora, si el usuario tiene exceso de API protegida, entonces en el back-end, obtenemos el exceso de token del encabezado de la solicitud y podemos enviar los datos que nuestro usuario necesita. Ahora imagina después de 5 minutos, nuestro token de acceso caduca. Nuestro usuario vuelve a enviar la solicitud de API. Aquí, nuestro backend comprueba, este token de acceso es válido o no Aquí no es válido, desde el back-end enviamos la respuesta con error 401 en token válido. Ahora en el front-end, desarrollador escribirá código. Cuando el front-end, obtenga el error 401, desarrollador llamará a otra API para obtener un nuevo token de acceso. Digamos que OT slash refresh. Ahora en esta API, podemos acceder al token de actualización. Pero aquí, tenemos que verificar si este token de actualización es válido para este usuario o no. Recuerde, cuando generamos nuevo token de acceso y un token de actualización, almacenamos el token de actualización en la base de datos. Podemos comparar estos dos tokens de actualización si coinciden, lo que significa que el usuario es válido. En ese momento, nuevamente generamos un nuevo token de acceso, un nuevo token de actualización, actualizamos el token de actualización en la colección del usuario, y igual que antes, enviamos estos dos tokens al front-end. Por esto, el usuario no necesita iniciar sesión una y otra vez. Cuando el usuario no tiene token de actualización o cuando un token caduca, solo entonces necesita iniciar sesión nuevamente. Tan simple como eso. Ahora la pregunta que podrías hacer es, ¿y si este token de acceso es robado? Con eso, el atacante puede acceder fácilmente. Sí, eso es posible, y por eso hoy en día, los desarrolladores front-end no están almacenando el exceso de token en el almacenamiento local. Lo almacenan en el ábside como variable JavaScript o tienda RxTate o Redux E incluso si de alguna manera el atacante sigue siendo el token en exceso, mantenemos el tiempo de caducidad del token en exceso a muy corto. Ahora podrías preguntar a los atacantes también pueden seguir siendo el token de actualización. ¿Qué pasa con eso? Y además, tiene larga caducidad. Para resolver este problema en el lugar de enviar refrestocan al front-end, podemos configurar refrestocen Ahora bien, ¿qué es la cookie SDTPoly? Una cookie SDDPoly es un tipo especial de cookie al que no se puede acceder mediante JavaScript que se ejecuta en el navegador Esta cookie solo SDDP no puede acceder a través de nuestro navegador. Nuestro navegador solo puede enviar esta cookie con la llamada API. Pero JavaScript en la página o ejecutándose en el navegador no puede leer, modificar o eliminar una cookie, lo que hace que nuestro token de actualización esté a salvo de los atacantes. Ahora podrías preguntar que esta cookie SDDPoly se envía solo a nuestras llamadas API, o se enviará con cualquier otra llamada a la API Esta es realmente una gran pregunta. SDDPoly Cookie tiene característica que llamamos como el mismo sitio a la calle Establecimos propiedad, mismo sitio a calle, y por eso, esta cookie solo SDDP solo se enviará a nuestras API de dominio de backend, no a otra persona Es por eso que el token refiere es alto en seguridad porque no puede acceder por JavaScript. Ahora vamos a recapitular este token de acceso y se refiere concepto de token Cuando el usuario se registra o ingresa en el lugar de un token, creamos dos tokens. El primero es el token en exceso, cuyo tiempo de vencimiento se busca, y el segundo token es el token de actualización, cuyo tiempo de vencimiento es largo. Almacenamos el token de actualización en la colección del usuario para ese usuario, y luego enviamos el token en exceso al front-end configuramos el token de actualización en el SDDPolyoki Ahora, lo mejor de SDTPoly Cookie es que no puede acceder por el código JavaScript del navegador. Amigo y navegador solo pueden enviar esa Cookie SDTP con SDDPRquest Esto hace que nuestro token de actualización sea más seguro y, como sabemos, nuestro token de acceso está disponible en el estado de la aplicación, no en el almacenamiento local. Así que nuestras fichas de barco son seguras, y así es como podemos darle a nuestro usuario una mejor experiencia y una mejor seguridad. Tan simple como eso. Entonces usamos token de acceso para acceder a los datos desde el back-end y por eso lo llamamos token de acceso. También usamos token de actualización para reprimir nuestro token de acceso, y por eso lo llamamos token de actualización Este flujo de trabajo es muy importante para tu aplicación, y muchos desarrolladores no conocen realmente este flujo de trabajo completo. Pero estoy seguro que ahora lo sabes , lo cual es realmente genial. Ahora en la siguiente lección, implementamos esta lógica en nuestro código. Será divertido. 110. Implementar token de acceso y actualizar token [ACTUALIZACIÓN]: Ahora para implementar el enfoque de token en exceso y actualizar token, necesitamos hacer muy poca oferta en nuestro backend Primero, cuando nos registramos o iniciamos sesión de usuario, necesitamos generar dos tokens y almacenar token de actualización en la colección del usuario. Después de eso, tenemos que devolver el exceso de token, igual que lo estamos enviando previamente en la respuesta. Y luego tenemos que ct refresh token en el SGDP solo cookie, por lo que nuestro navegador JavaScript no puede acceder ni actualizar token No te preocupes, es realmente sencillo. Hagámoslo. Entonces aquí creamos una función para generar token, y estamos devolviendo directamente el token. Entonces, en lugar de generar un solo token, aquí podemos generar dos tokens. Entonces primero, cambiamos el nombre de esta función para generar tokens. Y dentro de esto en el lugar de este escrito, lo almacenamos en una variable llamada token de acceso. Y después de eso, duplicamos esta línea y queremos generar token de actualización, como el nombre de la variable para refrescar token, también, necesitamos cambiar la caducidad del token en exceso a 5 minutos y refrescar el vencimiento del token a siete D durante siete días. Además, en el token de actualización, no queremos enviar todos los datos del usuario que queremos en el token sobrante. Así que aquí en el lugar de los datos, simplemente agregamos objeto con ID, columna, y datos passier punto subrayado Además, a muchos desarrolladores les gusta usar diferentes claves secretas para token de acceso y reprimir token por razones de seguridad Aquí también, abrimos el archivo ANV punto, y aquí en el lugar de la clave JWT, escribimos token de acceso, Después de eso, creamos una variable para reformular, token, clave y te damos cualquier clave que quieras agregar Guarda esto y en nuestra ruta de usuarios, en nuestra función, cambiamos JWTK a token sobrante, K, y este JWTK para reformular token, K. Genial Ahora, al final de esta función, devolvemos objeto con dos propiedades, token sobrante, token acceso o podemos eliminar este token de acceso y después de eso, devolvemos refresh token para refrescar token. Bueno. Ahora veamos qué tenemos que hacer en el registro, una nueva API de usuario. En la parte inferior, podemos ver que llamamos a esta función generar token y pasamos aquí bajo la propiedad ID cuadrada y nombre. Aquí, como sabemos, no devolvemos un solo token de esta función. Estamos devolviendo objeto, por lo que podemos desestructurar este objeto aquí y obtener token de acceso y token de actualización Ahora en la respuesta, igual que antes, devolvemos el exceso de token. Además, algunas empresas también envían token de actualización en la respuesta, pero no vamos a hacer eso. Estamos implementando aquí código de nivel de producción. Por lo que estableceremos este token de actualización en el SDP solo Cookie. Para eso, escribimos respuesta punto Cookie. Asegúrate de estar en el punto de respuesta Cookie antes de escribir envío del punto de respuesta o el punto de respuesta JSn porque no podemos configurar la cookie después de que enviemos la respuesta Si lo escribes después respuesta dot json, obtendrás error. Con el primer parámetro, escribimos nuestro nombre de propiedad. Digamos que se refiere token. Después de eso, pasamos token de actualización. En el tercer parámetro, tenemos que pasar objeto con algunas propiedades importantes. Primero, escribimos el SGDP solo a verdad. Esto significa que JavaScript en el navegador no puede leer esta cookie. Después de eso, agregamos seguro a verdadero para asegurar el SDP como solicitud Ahora actualmente lo estamos probando para solicitud STDP local y por eso lo hacemos aquí falso Pero para recordar escribimos aquí comando cambiar este seguro a verdadero para la producción. Después de eso, tenemos el mismo sitio a la calle. Por eso, detenemos nuestra cookie para ir a otra llamada API de dominio. Pero aquí, tienes que asegurarte tu frontend y backend deben estar en el mismo dominio Por ejemplo, gobleu.com para front end y cola.com Si tu backend y front end están alojados en un dominio diferente, entonces podemos establecer esta configuración en none, lo que significa que nuestra Cookie puede ir a cualquier dominio Aquí queremos nuestro navegador, enviar Cookie solo para nuestra plataforma backend Para eso, aquí escribimos propiedad de dominio a nuestro dominio Bend como api dotben.com Por esta propiedad, solo este dominio obtendrá esta Cookie, no cualquier otro dominio. Actualmente, estamos ejecutando nuestro back end en Local Host 3,000 y en el campo de dominio, no podemos agregar host local 3,000 porque aquí tenemos que agregar solo dominio real. Comentamos esta propiedad también y por fin, agregamos MaxH a nuestro tiempo de vencimiento del token de reprensa Aquí pasamos siete días, igual que el tiempo de caducidad de nuestro token de actualización. Siete en 24 horas en 60 minutos en 60 segundos en 1,000 milisegundos. Esto simplemente significa que después de siete días, esta Cookie solo STP también caducará y eliminará y finalizará Establecemos el token de actualización para SDTPoly Cookie. Ahora tenemos que hacer lo mismo para la API de inicio de sesión. Entonces copiamos este método de respuesta punto Cooke, y antes de este punto de respuesta Jason, lo pegamos Entonces aquí en el lugar de este token, desestructuramos objeto y obtenemos aquí el exceso de token y reprimimos También cambiamos el nombre de la función para generar tokens, y aquí devolvemos el exceso de token en la respuesta. Además, cuando creamos token de actualización, tenemos que colocar ese token en nuestra colección de usuarios porque usando eso solo, sabremos cómo el token de actualización es válido o no. En primer lugar, en nuestro esquema de usuarios, al final, agregamos refrescen dos corchetes Carly, escriba dos cadenas Guarde esto y vuelva a la ruta de los usuarios. Aquí en la ruta de inicio de sesión antes de enviar el token en exceso, agregamos el token de actualización de punto de usuario es igual a token de actualización. Y luego agregamos un peso usuario punto s. ahora aquí hay una cosa. muchos desarrolladores les gusta almacenar tiene o encriptado token de actualización en la base de datos para mayor seguridad, y también es una buena práctica. Entonces aquí también, podemos hacer costo, nuevo hed, refresh token es igual a esperar, crypt punto a, aquí, pasamos token de actualización y establecemos SALT en diez Igual que estamos hezing la contraseña, estamos hezing el token de actualización Aquí en el lugar del token de actualización, almacenamos el nuevo token de actualización hesed Además, copia estas líneas y en nuestra API de registro, pegamos aquí. También tenemos que cambiar esto a nuevo token de actualización de punto de usuario y esperar Nwuser dot CV Eso es. Comprobemos que esto está funcionando o no. Guarda los cambios, asegúrate de que nuestro backend esté funcionando. Ahora, abre Cartero, abre la API de inicio de sesión y envía la solicitud Mira, aquí tenemos el nuevo token, que es nuestro token de acceso. Y si vemos después de esta ficha de cuerpo, obtenemos una Cookie. Si verificamos eso, vea, aquí obtenemos el nombre de la cookie que es token de actualización. Entonces obtenemos valor, dominio, ruta expira, STP solo a true y secure a false, lo cual es genial Así que establecemos con éxito el token de actualización en el sddPolygogi. Ahora en la siguiente lección, crearemos ruta en la que nuestro front-end envíe este token de actualización, verificamos ese token y luego les enviaremos un nuevo token de acceso. 111. Actualizar ruta para el nuevo token de acceso [ACTUALIZACIÓN]: Ahora, como sabemos, cuando nuestro token de acceso caduque, front-end enviará el token de actualización a nuestro back end para obtener un nuevo token de acceso. Pero la pregunta es en qué punto final, front-end enviará token de actualización. Tenemos que definir ese punto final. Así que en la ruta del autor, al final, agregamos punto exterior post, endpoint a slash refresh y función callback con request y response Además, esto no es obligatorio. Tenemos que definir ruta llamada refrescar. Es solo un uso común de los desarrolladores de convenciones. Ahora en esta función, necesitamos hacer pequeñas cosas. Primero, verificamos que el token de actualización esté disponible en la cookie o no. Entonces para acceder a la cookie, utilizamos request dot Cookies dot our Cookie name, que configuramos para reprimir token Déjame mostrarte. Verás, este es nuestro nombre de cookie. Ahora tenemos que almacenar este valor en la variable llamada user repress token Y después de eso, simplemente agregamos condición. Si el token de represión de usuario no está disponible, entonces devolvemos la propiedad de mensaje JSON de estado de punto de respuesta 2401 punto a ningún token de actualización proporcionado Ahora, ¿y si obtenemos un token de actualización? Simplemente, tenemos que comparar ese token de actualización con el token que guardamos en la colección de nuestro usuario. Ahora la pregunta es cómo sabemos qué usuario envía este token de actualización. Para eso, recuerda cuando creamos un token de actualización, en el momento en que pasamos aquí ID en el token. Entonces, al usar este ID, podemos pasar el token de actualización almacenado. Para eso, escribimos JWT punto Verify. Primero, pasamos token de actualización, después de eso, tenemos que pasar la clave secreta que es process dotenv dot refresh token Asegúrese de que agregamos aquí clave token de actualización, no el exceso de Tgenkey De lo contrario, un token no verificará. Ahora bien, esta expresión devuelve la carga útil o podemos decir los datos. Entonces lo almacenamos en la variable llamada usuario decodificado. Supongamos que este token no es válido. Alguien cambió algo en este token, por lo que esta expresión puede devolver error. Así podemos adherirnos, tratar de atrapar blog y simplemente agregar esta línea en dr blog y en el blog de caché, obtenemos aquí error, y simplemente devolvemos respuesta, estado de punto 403, punto Jason y propiedad de messet a no válido, reprimir token Ahora supongamos que obtenemos el usuario decodificado del token y ahora al usar eso, tenemos que encontrar el token de usuario almacenado. Así costo usuario es igual a un peso, usuario punto encontrar por ID, y pasar aquí descodificado usuario punto subrayado ID Aquí también agregamos condición. Si el usuario no está disponible, entonces devolvemos el estado del punto de respuesta, 404 dot Json y el mensaje al usuario no encontrado. Además, aquí para usar esperar, tenemos que agregar asincrónico para nuestra devolución de llamada Bueno. Ahora, si el usuario está disponible, entonces solo necesitamos comparar el token. Ahora, como sabemos, en nuestra colección, almacenamos como token, por lo que necesitamos compararlo la misma manera que estamos comparando nuestra contraseña. Entonces para eso, escribimos esperar, descifrar punto comparar. Primero pasamos token de actualización de usuario, que obtenemos de la cookie, y luego queremos compararlo con el token de actualización de punto de usuario. Esta expresión devolverá es válida o no. Así que lo almacenamos en variable. El costo es válido. Además, asegúrese de importar cripta B en este archivo. Entonces en la parte superior, agregamos costo. B cripta es igual a requerir aquí agregamos Wikip. Ahora de vuelta a nuestra ruta. Aquí, después de esto, tenemos que pasar su condición. I es válido es falso, entonces devolvemos respuesta punto status 403 punto JSn y mensaje para refrescar token no es válido Y si el token es válido, entonces necesitamos repetir exactamente el mismo proceso que estamos haciendo después de iniciar sesión correctamente. Abrimos API de inicio de sesión aquí después de comparar contraseña, C, generamos nuevo token de acceso y nuevo token de actualización, como el nuevo token de actualización, actualizar token de actualización de punto de usuario con nuevo stoken luego configuramos el token de actualización en la cookie, y al final, devolvemos token de acceso Simplemente copiamos este código. Y pégalo en nuestra ruta de reprensa. Ahora aquí, antes que nada, necesitamos esto generar a la función Cs. Podemos ingresar nuestra función desde el archivo de ruta del usuario, pero para eso, necesitamos cambiar entrada en el archivo JS del punto índice. No quiero confundirte por hacer eso, así que simplemente podemos copiar este generar a la función C desde aquí y simplemente la pegamos en el archivo outhoute, y eso es Aquí, se realiza la implementación de nuestra ruta de actualización. Vamos a esta API, guardemos los cambios y echemos un vistazo. Open Postman, aquí creamos una nueva solicitud llamada refresh token method to post, y aquí escribimos nuestra URL, STP, Columna doble para slash Local host, Columna 3,000 slash APIs OT porque está Refresco de barras. Ahora simplemente envía la solicitud. Ver, aquí obtenemos error, no se pueden leer propiedades de undefined. Creo que no nos estamos poniendo ooky en el token de actualización de usuario Déjame tratar de consolar dot log. El usuario repres token, guarda los cambios y vuelve a enviar la solicitud Mira, aquí obtenemos el mismo error, y si abrimos nuestro código vía, mira, no estamos obteniendo el token de actualización en el registro de la consola, lo que significa que no estamos obteniendo el token de actualización del usuario en la cookie. La razón por la que no estamos recibiendo cookie es porque en Node js, no podemos acceder directamente a Cookie, igual que no podemos acceder directamente a los datos del cuerpo de la solicitud. Recuerde, para acceder a los datos del cuerpo de la solicitud, agregar middleware Express dot JN Para Cookie también, necesitamos agregar un middleware que nos ayudará a obtener Cookie de solicitud Entonces para eso, instalamos otro paquete Cookie parser, NPM instalamos Cookie, das parser y pulsamos enter. Bueno. Ahora, en nuestro archivo índice punto Js, primero ingresamos costo analizador de cookies es igual a requerir analizador de cookies Y luego en la parte inferior, agregamos app dot ug, Cookie parser y llamamos a esta función aquí Sin esta función de analizador de cookies, no podemos acceder a Cookie in request dot cookies Además, en nuestra API de represe, noto que este usuario decodificado está calificado. Es porque lo definimos con Cst en el blog seco y por el costo, este usuario decodificado solo es accesible en este blog seco Aquí queremos acceder al usuario decodificado fuera del blog dri Entonces para eso, antes de este Tyblog definimos dejar que el usuario decodificado y luego eliminemos este costo Ahora podemos acceder al usuario decodificado aquí, guardar los cambios, y echar un vistazo. Enviar la solicitud y ver aquí obtenemos usuario no encontrado, lo que significa que no estamos obteniendo datos de usuario. Déjame revisar. Aquí estamos pasando el ID de subrayado de punto de usuario decodificado. Déjame comprobar que es propiedad de identificación de subrayado o no. Sí, vea, en el token de actualización generadora, pasamos propiedad ID no subrayado ID Así que actualizamos esto para subrayar ID y también con el mismo la ruta del usuario generar tokens función Guarda los cambios y echa un vistazo. Aquí, si obtienes token caducado, entonces puedes llamar a la API de inicio de sesión que establecerá el nuevo token en Koki Ahora volvamos a enviar la solicitud de actualización. Ver ahora en respuesta, obtenemos nuestro nuevo token de exceso, y también se establece un nuevo token de actualización en la cookie de solicitud. Si volvemos a enviar la misma solicitud, entonces mira aquí obtenemos ambos token nuevo. Esto es similar a nuestra página de inicio para refrescarse. Si el exceso de token caduca, entonces nuestro front-end, llama a esta API de actualización, y luego nuestro front-end obtiene el nuevo token de exceso y el token de actualización. 112. OAuth con dos tokens [ACTUALIZACIÓN]: Ahora, actualicemos rápidamente el código Oth también porque aquí también estamos enviando solo un token. Entonces, como puede ver, estamos generando token dentro de esta función de devolución de llamada OT handle Ahora en el lugar de generar el token aquí, podemos usar nuestra función generar tokens y pasar aquí los mismos datos que este. Y ahora llegamos aquí const cli brackets, exceso de token y token de actualización Ahora no necesitamos esta variable token, y después de eso, simplemente devolvemos objeto con token en exceso a token en exceso, o podemos eliminar esta y actualizar token para refrescar token. Ahora aquí tenemos una cosa. Aquí, ya tenemos datos de usuario. Es bueno. Guardamos el token de actualización en los datos del usuario, por lo que no necesitamos enviar otros datos por consulta. Entonces, desde la API de usuario de inicio de sesión, copiamos estos códigos de cifrado, y también guardamos token en user dot Refresh Token Y pega este código en la función handle o callback. Ahora en nuestra API de devolución de llamada de Google, aquí obtenemos objeto en el lugar del token y desestructuramos el exceso de token y reprimimos token Ahora, antes de redirigir al usuario al front-end con token, necesitamos establecer el token de actualización en la cookie de solo SDP Entonces volvemos a la API de inicio de sesión y copiamos este método de cookie de punto de respuesta y lo pegamos en la API de devolución de llamada de Google Por fin, simplemente pasamos el exceso de token en el lugar de togan ahora hacemos lo mismo para la API de devolución de llamada de Facebook Aquí, obtenemos objeto con exceso de token y reprimimos token y pegamos aquí, el mismo Goki Entonces simplemente cambiamos este token con exceso de token, y eso es todo. Ahora en la siguiente lección, vemos lo que tenemos que hacer para logo el usuario. 113. Ruta para cerrar la sesión de un usuario [ACTUALIZACIÓN]: Ahora, ¿puedes decirme qué pasó cuando el usuario se desconectó? Si caducamos el token en exceso desde el front-end, entonces en la cookie solo SCTP, ya tenemos token de actualización que tiene una caducidad larga Nuestro front-end puede volver a ejecutar la API de actualización y obtener los nuevos tokens, pero no queremos eso. Queremos cerrar la sesión completa del usuario. Entonces para eso, solo tenemos que eliminar el token de actualización del SDDP solo Cookie y de la colección del usuario Así que vamos a crear aquí nueva ruta, punto exterior post slash Log hut y función de devolución de llamada ASN con solicitud Ahora para eliminar Cookie, utilizamos response dot clear Cookie method. Aquí pasamos nuestro nombre de cookie que queremos eliminar. Pasamos aquí token de actualización, asegúrate de verificar tu nombre de cookie mientras lo generas. Ahora, este método eliminará la galleta refrestken, y funciona en la Pero cuando queremos implementar esto en producción, entonces tenemos que agregar también objeto con propiedades. Esta expresión funciona para la producción, pero a veces puede causar problemas en la producción. Es mejor que pasemos propiedades. Asegúrate de que sean las mismas propiedades que agregamos durante la creación de Cookies. Copia este objeto y en nuestra cookie clara, lo pasamos. Bueno. Ahora después de eso, simplemente devolvemos el punto de respuesta Json Object con la propiedad del mensaje desconectado correctamente. Ahora antes de retirar la galleta, es mejor. También eliminamos el token de actualización de la colección del usuario. Para eso, necesitamos actualizar token de la cookie, decodificar el ID de usuario del token, recuperar el token de la base de datos, y luego tenemos que eliminarlo Ya lo hemos hecho en nuestra API de actualización. Recuerda, podemos simplemente copiar este código desde obtener Cookie para decodificar usuario hasta que estemos consiguiendo al usuario Copia esto y simplemente pegarlo antes del método Cookie claro. Ahora aquí tenemos usuario. Solo tenemos que hacer el token de actualización de punto de usuario es igual a nulo. Y luego esperamos al usuario punto guardar y listo. Probemos esta API de cierre de sesión. Decir los cambios NINGÚN POSTERO, duplique esta solicitud de token de actualización Bien, cambia el nombre de la solicitud a logo de un usuario. Cambie la API y cierre de sesión de punto a corte. Ahora, actualmente, revisamos nuestra cookie. Ver está disponible aquí. Ahora, si enviamos esta solicitud de cierre de sesión, vea, aquí conseguimos cerrar sesión con éxito, y si volvemos a revisar la cookie, se ha ido de Entonces así es como funciona el registro a nivel de producción, inicio de sesión, cierre de sesión y token Además, las últimas seis lecciones son lecciones actualizadas. Entonces, si no ves este código en las próximas lecciones, entonces no te preocupes por ello. Puedes seguir esas lecciones. Yo sólo quiero que estas llagas estén al día. Por lo que actualmente estamos probando este proyecto. Entonces, si ponemos el exceso a una caducidad a 5 minutos, entonces es muy difícil de probar. Entonces, solo para la degustación, establecemos la caducidad en un día. Además, en el archivo de ruta del usuario en la parte inferior, cambiamos el exceso a una caducidad a un día. En producción, podemos actualizarlo a 5 minutos. 114. Sección 10: creación del modelo de categoría: Bienvenido a la sección entonces del curso Node JS definitivo. En esta sección, seguiremos trabajando en nuestro proyecto dos aplicaciones de comercio electrónico backend Añadiremos algunas características geniales como agregar imágenes de productos en backend, autorización basada en roles, consulta de búsqueda simple y rápida, y mucho, mucho más Entonces comencemos en esta sección. En primer lugar, en nuestra aplicación de comercio electrónico, queremos agregar productos por categoría. Si seleccionas auriculares de categoría, solo enviaremos productos cuya categoría sea auricular Para ello, tenemos que definir modelo de categoría. Así que en la carpeta de modelos, creamos un nuevo archivo llamado categoría punto JS. Ahora, dentro de este archivo, en primer lugar, Const Mangoose es igual para requerir Después de eso, el esquema de categoría de costo es igual al esquema de puntos nu mangos Dentro de este objeto, agregaremos nuestro esquema. Ahora bien, ¿qué quieres agregar en esta colección de categoría? Primero, necesitamos el nombre de la categoría. Entonces podríamos necesitar el icono de la categoría. Estas propiedades dependen de la parte de interfaz de usuario del front-end. Queremos mostrar categorías como esta con iconos, después tenemos que almacenar ese nombre de archivo Cn en nuestra base de datos. Ahora, en nuestra aplicación, queremos hacer una cosa. Solo Admin puede agregar categorías en nuestra base de datos. El usuario simple no puede agregar categoría ni eliminar categoría. A, si en nuestra aplicación, tenemos varios administradores, entonces podemos agregar aquí llenados para Admin Es la identificación de ese admine. Pero aquí no queremos almacenar los datos del administrador para que podamos eliminar este relleno. Por lo que solo tenemos dos rellenos para esta categoría modelo o colección. Así que agregamos aquí nombre a objeto, tipo, a cadena requerido a true y también único a true. A continuación, queremos icono nombre de imagen para objeto, tipo, a cadena porque queremos almacenar el nombre de la imagen aquí y requerido a true, y eso es todo. Ahora muchos estudiantes se confunden al almacenar la imagen en el backend Déjame explicarte la lógica. En la base de datos, no podemos almacenar imágenes directamente. Entonces hacemos algo así. Supongamos que el usuario sube esta imagen desde el front-end. En el servidor backend, creamos una carpeta llamada uploads, y en esa almacenamos la imagen Ahora hemos subido archivo en nuestro servidor con el nombre que queramos darle a esa imagen. Después de eso, simplemente almacenamos el nombre de la imagen en la base de datos. Además, a algunas personas les gusta almacenar toda la ruta de la imagen, pero eso no es necesario en este caso, porque estamos almacenando esta imagen en nuestro propio servidor. Entonces solo necesitamos rellenar nombre de la categoría e imagen que es el nombre de la imagen. Ahora, después de eso, podemos crear un modelo basado en este esquema. La segunda categoría es igual al modelo de punto Mongos. Primero, pasamos el nombre singular de nuestra colección categorías, que es categoría. Y segundo, pasamos el esquema, y al final, el módulo de exportaciones de punto es igual a esta categoría. Hecho. Ahora en la siguiente lección, agregaremos API para crear nueva categoría con carga de imágenes. 115. Crea una nueva API de categoría con carga de imágenes: Ahora vamos a crear una nueva API para la categoría. Para ello, creamos un nuevo archivo en la carpeta Rutas llamado categoría punto js. En este archivo, ¿qué hacemos? Escribe, tenemos que crear Router usando Express. Por lo que const Express es igual a requerir Express. Y siguiente const Router es igual a express dot Router. Y también al final, tenemos que exportar este router. Las exportaciones de punto del módulo son iguales al enrutador. Bueno. Ahora antes de que nos olvidemos de agregar esta nueva ruta en el archivo JS index dot, hagámoslo. He cometido este error e intenté probar mis APIs. Guarde este archivo, vaya a index dot js file. Aquí, importamos rutas de categoría es igual a requerir aquí vamos a la carpeta rutas y en esa categoría. Ahora en la parte inferior, usamos app dot g. aquí, definimos el prefijo, que es la categoría API slash Después de eso, en el segundo parámetro, pasamos rutas de categoría. Guarde este archivo y vuelva al archivo de rutas de categorías. Bueno. Ahora definamos API para crear nueva categoría. Aquí definimos una nueva ruta usando router punto post. 8.2 slash hacia adelante, y aquí pasamos devolución de llamada con la función flecha de solicitud y respuesta Aquí queremos almacenar la imagen del icono con el nombre de categoría. Entonces, para almacenar la imagen, necesitamos un paquete llamado Multer Este es un paquete muy popular para almacenar todo tipo de archivos en la aplicación Express. Muchos desarrolladores confunden con Multer pero es realmente sencillo. Déjame mostrarte. Abra el terminal y escriba NPM instale Multer en el 1.4 0.5 dash ts punto uno y presione Enter Bueno, minimizar esta terminal. Ahora, en nuestro archivo, primero agregamos Const ulter es igual a requerir a Multer Y después de eso, creamos una variable llamada st upload es igual a aquí, llamamos a este método Multer, y dentro del paréntesis, tenemos que pasar objeto con la propiedad dest, que es el destino Aquí, tenemos que especificar en qué carpeta o ruta, queremos almacenar nuestra imagen. Escribimos la categoría de subida. Por esto, nuestras imágenes de categoría permanecerán en carpeta separada. Ahora tenemos que añadir este método de subida como middleware de nuestra post API Aquí agregamos subir punto. Aquí tenemos muchos métodos como single. Esto aceptará solo archivo único. Ninguno, esto no aceptará ningún archivo. A aceptará múltiples archivos. N aceptará todos los archivos y rellenos, lo que acepta múltiples rellenos específicos. Si quieres adentrarte más en estos, entonces puedes mirar su documentación. Por ahora, no te preocupes por eso. Aquí, queremos aceptar y guardar un solo archivo. Utilizamos aquí, método único. Ahora en este paréntesis, tenemos que pasar el nombre del campo Supongamos que pasamos por aquí, icono. Ahora desde el front-end, tenemos que usar input tag, type to file, y en el campo name tenemos que pasar el mismo nombre que es C. Por este nombre relleno, Malta sabe qué archivo tiene que guardar, y eso es todo. Multer guardará nuestro ícono de archivo en la categoría de carga de ruta de destino, y obtendremos la información sobre ese archivo en el archivo punto de solicitud, y obtendremos el resto de los datos del formulario en el cuerpo del punto de solicitud, igual que antes Ahora escribamos el resto del código para esta API. Así que antes que nada, aquí añadimos I condición, y esto comprobará solicitar el cuerpo del punto el nombre del punto no está disponible o solicitar archivo punto no está disponible. Entonces aquí devolvemos el estado del punto de respuesta, 400 por mala solicitud dot JSON, y aquí pasamos Objeto con propiedad de mensaje y pasamos aquí mensaje de error, nombre e icono son requeridos ahora ¿y si tenemos esto ambos? Creamos una nueva categoría, const, nueva categoría es igual a nueva Aquí, necesitamos modelo de categoría. Entonces en la parte superior, la categoría de costo es igual a requerir aquí vamos una categoría de modelos plegada Up. Bueno. Ahora en la parte inferior, nos adherimos nueva categoría, y aquí pasamos objeto con propiedades de esta colección. Primero, agregamos nombre para solicitar punto cuerpo punto Nombre. Tenemos un solo relleno en el cuerpo, y por eso no desestructuramos este relleno igual que antes A continuación, pasamos imagen para solicitar archivo punto. Y aquí queremos guardar el nombre del archivo, así escribimos filename Si quieres almacenar la ruta completa del relleno, entonces tienes que adherir, solicitar ruta de punto del archivo punto. Además, podemos adherir el registro de puntos de consola, solicitar archivo punto para ver lo que nos metemos en request dot file, para que no nos confundamos. Después de eso, agregamos esperar, nueva categoría punto c, y ya sabes lo que tenemos que hacer ahora. Sí, tenemos que hacer que esta función sea para usar esperar, al final, enviamos respuesta con estadísticas al 01 para nuevos datos dot Json. Aquí agregamos objeto con propiedad messet, categoría agregada con éxito A medida que pasamos categoría a nueva categoría. Ahora vamos a probar esta API. Es un poco diferente porque aquí tenemos que enviar archivo. No podemos enviar un archivo en el formato JSON, así que tenemos que usar aquí formulario, y además no podemos subir archivo usando Thunder Client porque esa función solo está disponible para usuario pago. muchos desarrolladores les gusta Postman y no les gusta Thunderclient por esto Aquí usaremos Cartero. Si no conoces a Cartero, te voy a dar mi tutorial anterior para una guía rápida del Cartero Entonces para descargar el Cartero, vamos a postman.com Aquí, podemos descargar esta aplicación. Simplemente instale esta aplicación. Es realmente simple. Así se ve cuando lo abrimos por primera vez. Tenemos dos opciones, crear una nueva cuenta o iniciar sesión con cuenta. Rápidamente me conecto con mi cuenta aquí. Si te registras o inicias sesión, entonces puedes crear aquí colección igual que cliente Thunder. Aquí, creamos una nueva colección en blanco. Caris y en nuestro proyecto Cartws, agregamos una nueva carpeta llamada categoría Si quieres acercar el zoom, presiona Control y más o Command Plus. En esta carpeta, agregamos una nueva solicitud, creamos una nueva categoría. Ahora, antes que nada, seleccionamos método post, URL a STP, columna doble slash forward host local, columna 3,000 categoría ABI Ahora para enviar un archivo en el cuerpo, vamos al cuerpo. Aquí seleccionamos los datos del formulario. Aquí, obtenemos la clave, que es el nombre de relleno, el valor y la descripción. Para primero, agregamos nuestra clave, que es el nombre relleno para digamos laptops. A continuación, ingresamos nuestro nombre de relleno para archivo, y ¿qué fue eso? Recuerda, escribimos aquí icono. Entonces aquí también, tenemos que escribir icono. Para subir el archivo en el lado derecho de la clave, obtenemos texto y desplegable, que es el tipo de contenido. Aquí, seleccionamos Archivo, clic en Seleccionar Archivo y seleccionamos un nuevo archivo de la máquina local. Ahora para los iconos de laptop, ve a la carpeta de recursos, que descargarás previamente, o también puedes descargarla ahora mismo debajo de esta lección. Carpeta de recursos, agregué carpeta para el Proyecto dos. En esa carpeta, vamos a carpeta de categoría, y en eso, obtienes todos los iconos para categoría. Seleccione el archivo PNG de punto portátil y OpenI. Ahora vamos a enviar esta solicitud. Aquí me sale error. Lo siento, olvidé iniciar esta aplicación. Así que nota en los puntos índice bueno. También, aquí noto que cometo este error, estado de punto de respuesta. Guarde los cambios y vuelva a Cartero y envíe la solicitud Ver, aquí obtenemos la nueva categoría, laptops e imagen a este nombre aleatorio. Además, comprobemos que nuestro archivo se guarda en la carpeta de subida o no. Ver, aquí obtenemos el archivo con ese nombre de archivo aleatorio. Entonces está funcionando hay algunos temas. Este archivo, guarda sin su extensión como dot png, o dot JPG, etcétera Sin extensión, nuestra imagen no será visible en el navegador. Este es el número uno. siguiente número está aquí, podemos subir cualquier tipo de archivo, no solo imágenes. Supongamos por error, alguien sube aquí punto archivo PDF, entonces qué vamos a hacer. Entonces aquí hay que agregar filtro para eso también. Solo se pueden subir puntos png o dot jpg o dot GIF para este relleno de imagen, y resolveremos estos problemas en la siguiente lección. 116. Establece el nombre de archivo y el filtro en multer: La lección anterior, tenemos dos temas. No obtenemos extensión para nuestro archivo de imagen y también en la base de datos. Segundo, no podemos filtrar solo imágenes. Vamos a resolver esto. Esto es realmente sencillo. Permítanme mover esta categoría por encima del multer para que podamos ver esto con claridad Aquí, pasamos solo la propiedad dest en la función multer. Pero en multer, tenemos pocas propiedades más que escritorio. Quitar este destino y aquí podemos pasar propiedad de almacenamiento, que excepto la propiedad de almacenamiento en disco multer Entonces, en lugar de abarrotar el co aquí, podemos definirlo en variable separada El costo de almacenamiento es igual al almacenamiento en disco multer dot. Dentro de esto, podemos definir cómo y dónde deben almacenarse los archivos en nuestro servidor. Pasamos Object y la primera propiedad es destino donde queremos almacenar nuestro archivo. Esto excepto la función de devolución de llamada, que tiene tres propiedades, archivo de solicitud Este es el objeto de archivo cargado, y CB es una función de devolución para especificar la ruta de destino Función de error aquí, simplemente llamamos a esta función de devolución de llamada en la primera posición, pasamos null, que es por error Después de eso, pasaremos por nuestra ruta de destino, que es la categoría de subida. Esta devolución de llamada establecerá el destino como categoría de carga Si este directorio no existe, entonces tenemos que crearlo manualmente. Pero ya tenemos esta carpeta aquí. Si no tienes, entonces tienes que crear esta ruta, subir, y en esa carpeta carpeta categoría carpeta. De lo contrario, ulter nos dará error. Ahora, después del destino, aquí también podemos especificar la propiedad de nombre de archivo. Esto también acepta la función de devolución con las mismas tres propiedades, archivo de solicitud, CB para devolución de llamada y función de flecha Ahora en esta función, queremos definir el nombre de archivo específico y único para nuestro archivo. Nombre de archivo único porque si dos nombres de archivo son iguales, entonces el último reemplazará a la primera imagen. En lugar de imagen femenina, el usuario obtendrá imagen masculina, y eso no es lo que queremos, como práctica común, almacenamos la marca de tiempo en el nombre del archivo así Primera marca de tiempo y luego nombre de archivo con extensión. Esto son casi todos los archivos obtendrán nombre único. SecCtttMP es igual al punto de fecha ahora. Por esto, obtenemos la hora actual. Después de eso, también queremos hacer algo en el nombre del archivo. nombre seconstoiginal es igual al archivo. Nombre original del punto. Por esto, obtendremos el nombre original del archivo subido como laptops dot PNG. Ahora en el nombre del archivo, tal vez haya algo de espacio, así que es mejor que reemplacemos ese espacio con el guión. Hará que nuestro nombre de archivo sea amigable con la URL. Añadimos el método plex. Aquí, primero agregamos expresión regular y su sintaxis es doble barra hacia adelante entre estas, agregamos barra diagonal hacia atrás como para el espacio y más para uno o más espacios en blanco Al final de la expresión regular, agregue G para la bandera global, lo que asegura que todas las coincidencias en la cadena sean reemplazadas, no solo la primera. Aquí pasamos guión en códigos únicos, esto significa que todo el espacio será reemplazado por guión. Ahora bien, ¿y si en el nombre del archivo, también obtenemos los caracteres especiales? También tenemos que eliminarlos. Agregamos otro método de reemplazo. Primero, ¿qué pasamos? Expresión regular, y ¿cuál es la sintaxis, doble barra diagonal hacia adelante Entre estos, estamos obteniendo expresión regular para conseguir los caracteres especiales. Aquí agregamos A a Z, Alt A a Z cero a nueve, también ahora queremos obtener otros personajes que no forman parte de esto, y esos serán nuestros caracteres especiales. T inversa esto, lo envolvemos entre corchetes y después del primer corchete, agregaremos Garret al final, también agregamos G para bandera global Ahora queremos sustituir estos caracteres especiales por nada. Sólo queremos quitarlo. Entonces agregamos aquí solo códigos sin nada. No te preocupes si no sabes mucho expresiones regulares, está bien. Ahora por estos dos métodos, si nuestro nombre de archivo es este, entonces hará así. Ahora al final, mezclaremos esta marca de tiempo y el nombre del archivo original CB primero pasamos null por error, y segundo, escribimos etiquetas de vuelta, aquí agregamos dólar Cully Brackets, timestamp, dollar Cully brackets, original Definimos destino y también nombre de archivo para nuestro archivo subido. Ahora podemos simplemente pasar esta variable de almacenamiento aquí en la función Multi. Nuestro primer problema está resuelto. Ahora pasamos al número dos para aplicar el filtro para archivo. En la función multer, tenemos otra propiedad llamada file filter Aquí también, tenemos que pasar la función de devolución de llamada para que podamos definirla en variable separada Costo, filtro de archivo es igual a la función de devolución de llamada con tres parámetros, solicitud , archivo y función de error CB, y en esta función, decidimos si el archivo debe ser aceptado o rechazado Aquí, primero definimos una variable, tipos permitidos, que es la matriz, y aquí agregamos todos los tipos que aceptamos. En primer lugar, las imágenes GPG, que es dot JPG y dot JPG ambos. Después imagen png, para punto png, y imagen GIF para punto GIF. Aquí, podemos simplemente poner condición. Si Mientras que el tipo de mimo es de esto, entonces lo permitimos, de lo contrario lo rechazaremos Si permiten tipos, punto incluye y entre paréntesis, pasamos archivo punto tipo Mme. Ahora podrías preguntar ¿qué es el tipo Mme? Mime type significa tipo de extensiones de correo de Internet multipropósito, que es una etiqueta utilizada para identificar el formato del archivo o datos Las aplicaciones o navegadores saben manejarlo. Si subimos el archivo PNG, tipo Mme será imagen barra diagonal PNG, o si subimos archivo PDF, entonces el tipo Mme será aplicación barra diagonal Si el tipo Mme está disponible en el tipo permitido, entonces llamamos a la función CB, y primero, pasamos null por error y pasamos por excepto el archivo Ahora bien, si el tipo M es otra cosa, entonces estos tipos, entonces nos adherimos como condición y llamamos a la función Cb, y al error, pasamos nuevo error, y aquí pasamos mensaje de error, tipo de archivo no válido, solo se permiten JPEG , PNG y GIF. Y para rechazar este archivo, agregamos aquí falso. D. Ahora tenemos que agregar aquí, archivo a filtro de archivo. Aquí, resolvemos ambos problemas. Déjame mostrarte una propiedad más útil de ulter. Aquí en la función múltiple, tenemos límites que nos ayudan a limitar el tamaño del archivo. Imagínese a alguien cargue bumstakally aquí No necesitamos 10 megabytes para el icono pequeño. Podemos limitar su tamaño de archivo. Aquí pasamos el tamaño del archivo objeto. Aquí, tenemos que pasar el tamaño del archivo en bytes. Para nuestro ícono de categoría, podemos establecer límite de dos MB, eso es más que suficiente, y para convertirlo en bytes, agregamos en 10 a cuatro. Por esto, obtendremos kilobytes o KB y nuevamente en 104. Por esto, convertiremos ese KB en bytes. Y hecho. Ahora vamos a probar esta API. Así que ve a Cartero y aquí ya tenemos nuestros datos para laptops. Enviar esta solicitud. Mira aquí no obtenemos respuesta. Pero si revisamos nuestra carpeta de categorías subidas, obtenemos un nuevo archivo con nuestro nombre único Extensión, nuestra imagen está almacenando. Ahora vamos a comprobar el error y si revisamos nuestro terminal, entonces aquí podemos ver que obtenemos error de clave duplicado para las computadoras portátiles de nombre. Recuerda, en la lección anterior, almacenamos la categoría laptops con ese nombre de archivo aleatorio y también en el esquema de categoría, establecemos name property en unique. Tenemos que eliminar esa categoría anterior de Mongo Di B Compass Aquí, simplemente retire este documento. Además, eliminamos ambas imágenes de nuestro servidor. No lo necesitamos. Ahora volvemos a enviar la solicitud. Ver, aquí obtenemos mensaje de éxito. Obtenemos buen nombre de imagen y también imagen guardada correctamente en nuestro servidor. Genial. Ahora agreguemos algunas categorías más. Entonces el nombre de la segunda categoría son los teléfonos inteligentes. Y para eso, subimos icono de mobilephone punto png. Asegúrate de eliminar la primera imagen. De lo contrario, enviará a imágenes. Enviar la solicitud. A continuación, tenemos categoría, relojes inteligentes, e icono que seleccionamos aquí ver punto png. Y envíalo. A continuación, tenemos auriculares e icono a auricular punto PNG y enviar la solicitud. Por último, tenemos consolas de juegos y para videojuego icono punto PNG y enviarlo y listo Ahora en la siguiente lección, crearás API para obtener todas las categorías de nuestra colección. 117. Obtén la API de todas las categorías: Vamos a crear API para obtener todas las categorías. Es realmente simple. Después de la API post, creamos una nueva API, router dot Gate forward slash for endpoint, callback function with request response, arrow Y dentro de esta función, primero, obtenemos todas las categorías del modelo. Entonces C categorías es igual a un peso, categoría punto encontrar. Y si quieres enviar categoría corta por nombre de categoría, entonces agregamos aquí método de tiro, y aquí pasamos nombre de relleno por el cual queremos disparar, que es nombre y simplemente enviar respuesta punto JCN categorías También, aquí tenemos que hacer esta función acing. Guarda los cambios y probemos esta API. Así que acude al Cartero o cliente tierno. Añadimos aquí nueva solicitud. Sin embargo, todas las categorías, en el punto final, escribimos Host local 3,000 categoría API. Seleccione el método Get y simplemente envíe la solicitud. Ver, aquí conseguimos categorías acortadas por sus nombres. Bastante genial. Ahora bien, si necesitas agregar más APIs como actualizar o eliminar la categoría, entonces también puedes hacerlo. Realmente depende de ti por ahora no lo necesitamos aquí, así que no los creo. 118. Compartir imágenes estáticas desde el servidor: Actualmente para los datos de categorías, almacenamos la imagen en nuestra carpeta de categoría upload slush Pero, ¿cómo puede nuestro navegador acceder a estas imágenes? Están disponibles solo en nuestro servidor. Para acceder a las imágenes desde el navegador, tenemos que compartir los archivos de imagen estáticos desde nuestro servidor. Ya lo han hecho en la Sección cinco, Lección cuatro. Es realmente simple. Entonces index dot js file aquí después de express dot J y middleware, agregamos app dot U. Aquí teníamos el prefijo de la ruta del archivo estático, así que lo configuramos para subir categoría Ahora para compartir los archivos estáticos desde el servidor, tenemos que usar otro middleware integrado llamado express dot Y dentro de esta función, tenemos que pasar el nombre de la carpeta que queremos compartir. Subir menos categoría. Solo recuerda que este es el prefijo para URL, y esta es la ruta de la carpeta de nuestros archivos estáticos. Guarde los cambios, e intentemos acceder a esta imagen de laptop. Copia esta imagen nombre completo. Ahora ve al navegador. Aquí en la URL, escribimos nuestro backend, Host local, Columna 3,000 Aquí tenemos que agregar el prefijo para archivo estático, que es la categoría upload slash Pasamos aquí categoría de imágenes, entonces tenemos que escribir también categoría Imágenes en la URL del navegador. Por ahora, nos apegamos a la categoría Subir, y aquí también, pasamos Subir categoría, y aquí pegamos el nombre completo de la imagen. Ver, aquí obtenemos la imagen. Así es como al usar esta URL, front-end mostrará estos iconos. Ahora en la siguiente lección, crearemos un nuevo modelo para productos. Esto va a ser divertido. 119. Ejercicio: definición de modelo de productos: Ahora es el momento de poco ejercicio. Hay que definir el modelo de un producto. En este modelo, tenemos los rellenos, y estos son los datos de muestra de un solo producto. Tienes que diseñar el esquema por tu cuenta para estos rellenos, tomarte tu tiempo, resolver este ejercicio, y luego cuál es la solución. Espero que resuelvas este ejercicio o intentes resolverlo. Date crédito por eso. Ahora vamos a resolver este ejercicio. Para el modelo de producto, creamos un nuevo archivo en la carpeta models llamado products dot js. Bueno. En primer lugar, el costo de los mangos es igual a requerir mangos Después de eso, definimos esquema de producto de costo es igual al esquema de punto Nu Mongoose Dentro de esto, pasamos objeto en el que definimos esquema. La primera propiedad es title, que configuramos para escribir a string, requerido a true, y también adherimos longitud máxima a cien. Ahora siguiente descripción que queremos establecer para escribir string required to true, y es de longitud mínima a 50 caracteres. Después de eso, necesitamos vendedor que enumere este producto. Aquí, almacenamos el ID del vendedor, por lo que tipo de objeto a Mongoose punto esquema punto Tipos punto ID de objeto, ref al usuario requerido a true Ahora aquí podría preguntarse ¿por qué no utilizamos aquí el enfoque híbrido? ¿Por qué no incorporamos datos para el vendedor? Por qué almacenamos ID de vendedor. Aquí en la parte frontal, nuestra tarjeta de productos se verá así. En la lista de productos, no queremos mostrar los detalles del vendedor. Si queremos mostrar la información del vendedor, aquí, entonces también podemos agregar aquí, nombre del vendedor, y algunos detalles requeridos, pero ese no es el caso aquí. Tienes que pensar así cuando queremos múltiples datos en una sola llamada API, múltiples datos significa t datos de productos en una sola llamada API. En esos datos, necesitamos mostrar los datos de referencia o no. Si en esos datos queremos mostrar datos de referencia, entonces es mejor incrustar esos datos en la colección. Por eso, nuestra API no necesita ejecutar la consulta de relleno para cada dato incrustado En ese momento, podemos utilizar el enfoque híbrido. Después de eso, necesitamos categoría. Ahora dime qué enfoque utilizamos aquí, incrustado o de referencia. Bien, usamos tu referencia porque no queremos mostrar categoría con múltiples datos. Solo necesitamos categoría para filtrar productos. Así que de nuevo, usamos su tipo de referencia para Mongos esquema de punto tipos de punto punto ObjectID de punto Ref a categoría y requerido a true. A continuación, tenemos precio. Aquí, establecemos type a number, required to true y mean to zero. Obvio. A continuación, duplicamos esta línea y cambiamos este precio a stock, que es el número de productos disponibles en el stock. A continuación, tenemos imágenes, que es la matriz, y en esto también, almacenamos el nombre de la imagen como cadena. La razón por la que agregamos matriz porque los productos pueden tener múltiples imágenes Como requeríamos imágenes para verdades. Esto asegurará que nuestro producto tenga al menos una imagen. Después de eso, tenemos las últimas revisiones de propiedad, que es la matriz de objeto de revisión. Ahora esto es interesante. En la matriz de reseñas, queremos múltiples objetos de reseñas. Tenemos que definir el esquema para ese objeto. Aquí simplemente pasamos objeto, y en esto, podemos definir esquema para ese objeto, igual que lo estamos haciendo anteriormente. En este objeto, queremos tres datos de usuario que envíen esta opinión. Entonces objeto, pasamos tipo, esquema de punto de Mongos tipos de punto punto ID de objeto, f al usuario y requerido a True A continuación, para la revisión, necesitamos calificación, por lo que es tipo a número, y también requerimos a true y valor medio a cero. Por fin, necesitamos comando, que puede ser string, pero no agregamos aquí requerido a true porque no todos los usuarios agregarán comando. Simplemente les gusta agregar estrellas. Ahora podrías tener dudas cuando añadimos un nuevo producto, ¿ es obligatorio? Necesitamos agregar estas reseñas? Porque aquí pasamos requerimos dos. Entonces la respuesta es no. No necesitamos agregar revisiones obligatorias. Esto se requiere para este único objeto. Si intentamos ingresar nuevo objeto de revisión, entonces debería tener ID de usuario y su calificación. De lo contrario, no lo necesitará. Básicamente, estamos agregando esquema para ese único objeto. Además, podrías preguntar, podemos incrustar datos de los usuarios aquí? Sí, podemos incrustar datos aquí, pero imagina que los usuarios cambian el nombre de usuario, entonces será muy difícil mantener la coherencia con esos datos y no te preocupes demasiado por diseñar la base de datos. Casi todas las empresas tienen equipo para diseñar la base de datos, o algún desarrollador senior diseñará la base de datos. Solo te estoy explicando por qué usamos referencia y por qué no usamos el enfoque embebido. Creo que aclarará tus dudas. Aquí, nuestro esquema está completo. Ahora podemos crear modelo a partir de esto. El costo del producto es igual al modelo de punto Mangosta. Aquí pasamos el nombre singular de nuestra colección, que es producto, y después de eso, pasamos esquema de producto, y por fin, exportamos este modelo. Por lo tanto, las exportaciones de módulos son iguales a producto. 120. Autorización basada en roles: Ahora vamos a construir API para crear un nuevo producto. En la carpeta Rutas, creamos un nuevo archivo llamado products dot js. Ahora tenemos que crear un nuevo router usando Express. SecStePress es igual a requerir Express. A continuación, costo, Router es igual a express dot Router. También por fin, tenemos que exportar este router. Las exportaciones de punto del módulo son iguales al enrutador. Ahora, agreguemos este nuevo router en el archivo index dot js. Guarde este archivo, vaya a index dot js file. Aquí, importamos costo rutas de productos es igual a requerir. Vamos a la carpeta Rutas y en esos productos. Ahora en la parte inferior, agregamos app dot g. aquí, definimos el prefijo, que es API slash Products Y en el segundo parámetro, pasamos productos, guardamos los cambios y volvemos a nuestro archivo de rutas de productos. Aquí queremos crear una API para agregar nuevo producto. Así router punto post, API y punto de deslizamiento hacia adelante. Aquí, nos aseguramos de que solo el usuario de inicio de sesión pueda acceder a esta API. Entonces podemos agregar aquí Osmalware. Ver aquí me sale sugerencia de auto, y también va a auto entrada Omdalware en la parte superior Ahora agregamos la respuesta de solicitud, y la función de flecha. Bueno. Ahora antes de manejar la imagen de cómo almacenar productos, tenemos que verificar solo los vendedores pueden agregar producto, no simples usuarios, solo vendedores, y ¿cómo podemos hacer eso? Usaremos middleware. En la carpeta middleware, creamos un nuevo archivo llamado cheseller Ahora, como sabemos, el middleware es una función. Definimos const, cheque vendedor es igual a la solicitud de respuesta, y siguiente y la función de flecha En esta función, tenemos que comprobar si la regla de usuario es vendedor o no. Si no es vendedor, entonces devolvemos error. Solicito punto usuario no está disponible, o solicitar punto usuario punto rol no es igual al vendedor, entonces devolvemos respuesta punto estado, 403 para prohibido Xs punto JSON. Y aquí pasamos objeto con mesetpperty exceso Si sobrepasas esta condición, sólo entonces podremos pasarlas al siguiente middleware o Ahora vamos a exportar esta función desde aquí. Entonces módulo dot export es igual a verificar vendedor. Entonces los cambios. este middleware después del middleware orth en nuestra API de productos Vamos a configurar este middleware después del middleware orth en nuestra API de productos . Ver, nuevamente, la entrada automática funciona. Genial. Ahora, aquí hay dos cosas para ti. El primero está en nuestro esquema de usuario, solo establecemos dos valores opción para rol. Déjame mostrarte usuarios abiertos dot js file. Aquí podemos ver que solo tenemos usuario y admin. También necesitamos agregar aquí, vendedor, y guardar este archivo. Ahora lo segundo es, ¿cómo podemos obtener usuario en el rol de punto de usuario de solicitud punto? Porque en el punto de solicitud de usuario, obtenemos solo aquellos datos que pasamos mientras generamos el token. Recuerda, pasamos solo dos propiedades subrayado ID y nombre. Veamos esto también. W usuarios punto js ruta aquí en el sinnup al final, C, solo pasamos subrayado ID y nombre Aquí tenemos que pasar también papel. Roll a nuevo rol de usuario. Bueno. También en el login al final, también agregamos aquí rol y aquí tenemos que usar user dot role porque ya tenemos usuario aquí. Ver los cambios. Ahora, ¿qué pasa autenticación basada en Google y Facebook Allí también pasamos solo subrayado ID y nombre. También tenemos que pasar la regla. De lo contrario, nuestro medidor de bodega les dará error. Así pothjs archivo donde tenemos que cambiar aquí, creamos esta función común . Eso es lindo. Ver, en la parte superior, estamos encontrando al usuario, así que eso es fácil para nosotros. Aquí en la parte inferior, estamos generando el token, así que agregamos aquí rol al rol de punto de usuario. Y hecho. Aquí hicimos todos los cambios. Guarda los cambios y déjame cerrar otros archivos en la API de productos, simplemente devolvemos aquí respuesta punto SN vendedor está aquí. Probemos esta API. En primer lugar, agreguemos la API de inicio de sesión en Postman porque no creo que para los productos también, usaremos el cliente Tundar En nuestra colección Cardwih, agregamos una nueva carpeta llamada users Y agregamos aquí solicitud llamada login a user. Primero, seleccionamos y apuntamos al inicio de sesión de usuario de API. Asegúrese de que este método esté configurado para publicar. Ahora para los datos, simplemente lo copio del cliente Thunder de nuevo a Postman, selecciono aquí cuerpo, crudo y simplemente los datos aquí y envío la solicitud Ver, aquí consigo token fresco, copiarlo y para probar los productos API, crearás una nueva carpeta en cartwdg llamada Creo que tenemos que cambiar permanentemente al Cartero. Cuando comencé a investigar las puntuaciones en ese momento, la función File Upload está disponible en la versión gratuita de Tender client. Pero ahora lo que podemos hacer, cambiamos a Cartero. Perdón por esto. Aquí teníamos solicitud llamada crear un nuevo producto. Seleccione el punto final a API slash products, request is post and send the request Ver, aquí obtenemos error, se requiere token de autorización. Lo sentimos, no pasamos token en el encabezado, vamos a encabezados. Aquí agregamos autorización, y en el valor, lo que tenemos que pasar primero agregamos espacio de error y pegamos nuestro token JWT aquí Ahora vamos a enviar esta solicitud. Ver, ahora nos llega otro mensaje de error, acceso denegado solo a los vendedores. Entonces, para recapitular rápido, agregamos un middleware para vendedor después del Othmdalware porque por orthomdalware, obtenemos Si se verifica el token y la regla del usuario es vendedor, entonces solo la función de vendedor Moware nos permitirá ingresar en la API del producto Así es como podemos realizar la autorización basada en reglas. Para ingresar a esta API, tenemos que hacer nuestra cuenta corriente a la cuenta del vendedor. Entonces, cuando Mongo Di se convierta pase aquí en la colección del usuario, encuentra tu cuenta por la que estás ingresando y cambia su regla a vendedor Asegúrate de vendedor, no vendedores. Ahora tenemos que generar un token API de prensa porque cambiamos nuestros datos. Enviar la solicitud de inicio de sesión copia este token de nuevo a la API de productos. Aquí en el encabezado, reemplazamos el token antiguo con el token nuevo del espacio Barrer Ahora vamos a enviar la solicitud. Ver, aquí conseguimos vendedor está aquí. Encantadora. 121. Autorización personalizada basada en roles: Ahora anteriormente, añadimos categorías API. Aquí, no verificamos el rol del usuario para agregar nueva categoría. Aquí también queremos. Solo Admin puede agregar categorías. Entonces hay dos opciones para nosotros. Podemos crear un nuevo middleware, igual que este middleware de vendedor de cheques, o podemos crear un nuevo middleware que verifique o podemos crear un nuevo middleware cheques, o podemos crear un nuevo middleware que Si en ese middleware, pasamos admin entonces solo debería permitir Pasamos vendedor, entonces solo debe permitir vendedores. Ambas opciones son buenas. Realmente depende de ti cuál quieras elegir. Déjeme mostrarles a ambos. Para Admin, simplemente copiamos todo el código del archivo check seller, y en la carpeta middleware, creamos un nuevo archivo llamado check admin dot gs, y simplemente pegamos este código Ahora aquí tenemos que hacer pequeños cambios. Primero, cambiamos el nombre de esta función. Seleccione esto y presione F dos y escriba check admin. Después de eso, tenemos que cambiar esta condición, rol a admin, y también en el mensaje de error admin only, y estamos listos con nuestro middleware admin Podemos agregar este middleware en nuestra API después del Osmalware igual que agregamos cheque vendedor Ahora déjame mostrarte cómo podemos crear verificación de reglas generales o middleware Es realmente simple. En la carpeta middleware, creamos un nuevo archivo llamado check role dot js Aquí también, podemos simplemente pegar el mismo código y cambiar nombre de esta función para verificar la regla. Ahora podría preguntarse, ¿cómo podemos pasar regla en esta función? Porque como sabemos, en el lugar del middleware, solo tenemos que agregar esta función y que llamaremos a esta función callback Aquí podemos hacer simplemente una cosa. Podemos agregar aquí una función de flecha más. Entonces después de signo igual, agregue el parámetro de rol y luego la función de flecha. Entonces antes de agregar esta función de flecha, para acceder a esta solicitud de devolución de llamada de respuesta, tenemos que llamar a la función de regla Jack Ahora, después de agregar esta función de flecha para acceder a esta solicitud de devolución de llamada de respuesta, tenemos que llamar a la función de regla Jack Aquí, pasamos la regla del usuario, digamos admin. Y después de eso, simplemente lo llamamos una vez más. Y por eso, podemos acceder a esta solicitud de respuesta callback. Esto se llama función de orden superior. Una función de orden superior es una función que devuelve otra función o toma otra función como argumento. Aquí, estamos devolviendo esta función de devolución de llamada en esta función de regla de verificación En sintaxis simple, se ve algo así. Aquí está la función de regla de verificación, y simplemente devuelve esta función de devolución Es por eso que llamamos a la regla de verificación por primera vez, y luego tenemos que llamarla nuevo para acceder a esta función de retorno. Espero que aclare sus dudas. Aquí, podemos reemplazar esta cadena de vendedor con el parámetro rule. Y aquí, para mensaje de error personalizado, convertimos estos códigos en retroexcavaciones, y en el lugar del vendedor, agregamos rol de dólar y eso es todo Ahora podemos usar este middleware de verificador de reglas personalizado con cualquier tipo de rol Entonces realmente depende de ti si te gusta usar check seller y check y mid middleware, o te gusta usar check rule Me gusta usar este middleware de regla de comprobación. En la API de productos en el lugar de venta de cheques, tenemos que llamar a check Rule middleware Y aquí pasamos vendedor de reglas. Este vendedor de reglas de verificación es lo mismo que el middleware de vendedor de cheques, ambos llaman a esta solicitud de devolución de llamada de respuesta Ahora para las categorías también queremos comprobar rol como admin. En la ruta de categoría, queremos agregar middleware para esto crear nueva ruta de categoría Ahora aquí hay una pregunta. ¿Por qué deberíamos agregar middleware check role ¿Antes de esta subida multer o después de ella? Derecha, lo agregamos antes este método multer upload porque primero verificamos la regla Si es admin, entonces almacenaremos la imagen del icono en nuestro servidor. Agregamos el middleware Jack Roll después del método ulter, luego primero almacenará la imagen en nuestro servidor y luego verificará Entonces agregamos check roll middleware antes de esto y pasamos aquí rol admin Además, antes de verificar Roll middleware, tenemos que agregar middleware Auth porque sin eso, ¿cómo podemos obtener la información del usuario en el usuario punto en Guarda los cambios y probemos nuestra API de productos. Enviar esta solicitud, y aquí me sale error. Déjame comprobarlo. Es un error en la comprobación Archivo de rol. Oh, lo siento, se me olvidó eliminar esta llamada de función. Ver los cambios, y enviemos nuevamente la solicitud. Ver, aquí conseguimos vendedor está aquí. Eso significa que nuestro middleware está funcionando. Entonces así es como podemos usar este middleware de regla de verificación para cualquier tipo de autorización basada en reglas 122. Manejo de varias imágenes de productos: Antes de guardar los datos reales de los productos en la base de datos, vamos a crear un método de carga múltiple para almacenar múltiples imágenes de productos. Entonces aquí, el vendedor puede subir mínimo una imagen o máximo ocho o diez imágenes. Entonces a partir de la ruta de categorías, simplemente copio este filtro de archivo de almacenamiento, y subo variables y lo pego y subo variables y antes de nuestra API de productos. Bueno. Ahora, antes que nada, necesitamos importar paquete Multar Entonces costo ulter es igual a requerir multer. Además, podemos eliminar esta importación de middleware vendedor jag. No lo necesitamos. Ahora aquí, tenemos que hacer pequeños cambios. Primero, cambiamos el destino para subir productos de slash Por eso, podemos asegurarnos las imágenes de los productos estén separadas del ícono de categoría. Y como sabemos, multer no crea directorio por sí mismo, así que necesitamos crearlo. En la carpeta de subida, creamos una nueva carpeta llamada products. Aquí almacenaremos la imagen de nuestros productos. Estos son pequeños detalles que debemos tener en mente mientras trabajamos con nod Jas, medida que trabajas más en nod Jaz, sabrás todas No te preocupes por eso. Ahora, después de eso, el nombre del archivo está bien. El filtro de archivos también está bien. Si también quieres almacenar videos, entonces tenemos que agregar estos tipos MM en la matriz de tipos permitidos. Por ahora, no lo queremos, y además el límite de tamaño es de dos MB, lo cual también está bien. Aquí podrías preguntar este límite de dos MB es para todas las imágenes de tamaño combinado. No, es para cada tamaño de imagen, no para tamaño combinado. Ahora agreguemos este método de carga en esta API. Después de jackrll middleware, agregue upload dot, queremos almacenar múltiples imágenes, así que podemos usar aquí array dot single es para un solo archivo, y dot array es Ahora aquí, tenemos que pasar nombre fil para estas imágenes. Aquí, lo configuramos a imágenes. Entonces desde el front-end, tienen que enviar todas las imágenes de los productos en las imágenes individuales rellenadas. Veremos que cuando probemos esta API, ahora después de pasar el nombre del campo, podemos pasar el límite de los archivos. ¿Cuál es el número máximo de archivos que queremos almacenar? Para la aplicación de comercio electrónico, ocho es más que suficiente, pero también puedes ajustar este conteo según tus necesidades. Además, si no quieres establecer el límite máximo, entonces no necesitamos pasar el segundo parámetro. Pero aquí queremos ocho imagen. Ahora, como hemos visto, anteriormente, obtenemos la información del archivo en el archivo punto de solicitud porque hay archivo único. Pero aquí estamos tratando con múltiples archivos, por lo que vamos a obtener estos archivos de datos en los archivos de punto de solicitud plural. Por eso, vamos a buscar cada nombre de archivo en la base de datos. También, podemos crear aquí una función ultter común, pero eso creará confusión innecesaria Por eso lo dejamos como está. Ahora en la siguiente lección, almacenaremos datos de los productos en la base de datos. 123. Crear nuevos productos: Almacenemos los detalles del producto en la base de datos. Entonces antes que nada, en esta devolución de llamada, obtenemos todos los campos que vamos a pasar en el cuerpo del punto de solicitud Por lo tanto, el costo de paquetes CLI es igual a solicitar el cuerpo del punto. Ahora, antes que nada, en este cuerpo, obtenemos título, descripción, categoría, que es el ID de categoría, precio y stock. Ahora después de eso, tenemos que crear una matriz de imágenes, que es la matriz de nombres de imagen, y ¿cómo podemos conseguirlo? Entonces obtenemos todos los detalles de las imágenes en la matriz de archivos de punto de solicitud, y cada dato de imagen está disponible en el objeto así. Y aquí obtenemos un nombre de archivo. Entonces podemos hacer esto. Las imágenes de costo es igual a solicitar archivos de puntos dot MAP. Aquí obtenemos cada función de flecha de objeto de imagen y simplemente devolvemos el nombre del archivo de punto de imagen. Este nombre de archivo es lo que generamos en la parte superior. Ahora por este método de mapa, obtenemos la matriz de nombres de imagen. Además, a veces los vendedores olvidaron agregar imágenes. Podemos poner aquí condición si las imágenes de longitud de punto es igual a cero. Si es cierto, entonces simplemente devolvemos estado del punto de respuesta, JSON de 400 puntos. Y aquí pasamos error en objeto con propiedad ensuciada. Se requiere al menos una imagen. Ahora aquí tenemos toda la información. Almacenemos rápidamente esta información en la colección de productos. Costo, nuevo producto es igual a nuevo producto. Ver, aquí obtenemos autorización, productos de modelo, bueno, y aquí pasamos nuevo objeto de producto. En este objeto, título a título, y como sabemos, si la propiedad del objeto y el nombre del valor ambos son iguales, entonces simplemente podemos eliminar esto. Ambos funcionan igual. Siguiente, descripción a descripción, categoría, precio, stock, imágenes. Y ahora por fin, tenemos que almacenar al vendedor. ¿Cómo podemos conseguir ese vendedor? Bien, podemos usar request dot user dot underscore ID porque nuestro Osmitalware está configurando los detalles de uso en el Vamos a contar los rellenos para ver si te faltan rellenos o no. Uno, dos, tres, cuatro, cinco, seis y siete. El esquema del producto, también, tenemos reseñas de uno, dos, tres, cuatro, cinco, seis , siete y 80, que no agregaremos ahora, así que vamos por el buen camino. Ahora, vamos a guardar estos datos. Esperar nuevo producto punto c para usar esperar, tenemos que hacer que esta función esté ahora en la parte inferior, vamos a devolver el estado del punto de respuesta a 01 punto GSN, y aquí enviamos nuevos datos de productos Guarda los cambios, menos es esta API. Esto es realmente emocionante. En la carpeta de recursos, agregué proyecto a carpeta, y en eso, obtendrás la carpeta Productos, y dentro de eso, agregué imágenes de productos por categoría, y además obtendrás el archivo GSN de punto de datos En el que agregué título, descripción, y todos los demás detalles. Abrir estos datos punto JSNFle en el código VS. Ver aquí agregué el nombre de la categoría en la parte superior, y en la matriz de productos, agregué todos los datos de los productos con título, descripción , precio, stock, imagen es nombre, para que puedas buscar imagen por eso. La razón por la que no agrego aquí ID de categoría porque para cada categoría ID puede ser diferente porque anteriormente, agregamos categoría manualmente. Aquí está mi categoría de smartphone y aquí está ID. Puedes compararlo con tu ID de categoría. No puede ser lo mismo. Copia esta identificación, ve a Cartero, aquí, primero ve a los datos del formulario Aquí, simplemente agregamos categoría clave, y en valor más allá del ID de categoría de teléfonos inteligentes. A continuación, tenemos que agregar título, luego descripción, precio y stock. Copio todos estos detalles uno por uno del archivo JSON y los pego aquí. Primero, selecciona título, pegarlo aquí, descripción. El precio es de 1299 y el stock es de ocho. Así pas la descripción, precio 1299, que es USD y stock a ocho Ahora necesitamos agregar solo imágenes para este producto. En la parte inferior, agregamos otras imágenes clave. Aquí, seleccionamos tipo a archivo, y ahora seleccionamos nuestras imágenes de iPhone 14. Así que ve a la carpeta Productos, smartphones, y vamos a la carpeta iPhone 14 Pro. Aquí, seleccione todas las imágenes 1-4. Ahora vamos a enviar estos datos. Ver, aquí obtenemos estos nuevos datos de productos. Aquí tenemos categoría de vendedor, nombres de imagen en matriz, y también en nuestro back end en la carpeta subir productos, obtenemos estas imágenes. Hicimos un gran trabajo. Estoy agregando todos estos detalles de productos en mi base de datos. Cuando ejecutamos la consulta de producto GD con paginación, entonces obtenemos más También puedes agregar todos los productos en tu base de datos si lo deseas. De lo contrario, simplemente puede saltarse esta parte. Ahora copio el siguiente título del producto, lo pego aquí. No toques el ID de categoría porque seguimos en la misma categoría. Descripción. Pégalo aquí y precio es 399 y stock al 50. Ahora vamos a seleccionar imágenes para Samsung a 54. Enviar esta solicitud. Bueno. Así, puedes agregar todos los productos o al menos diez productos. Simplemente cambie el ID de categoría cuando cambie la categoría del producto. Sé que esto es aburrido, pero podemos usar estos datos para probar nuestra API get products. Así que pon un poco de música escalofriante y crea estos productos. Yo también estoy haciendo esto, nos vemos en la siguiente lección. 124. Obtención de todos los datos de productos: Entonces en la lección anterior, agregamos productos en la base de datos. Ver, agregué los 24 productos en la base de datos. Ahora vamos a obtener estos productos a través API porque así es como front ten obtendrá estos datos. Entonces después de la API post, agregamos router dot Get y apuntamos a reenviar slash Ahora aquí no agregamos ningún middleware porque queremos que cualquier usuario pueda ver todos los productos, no solo los usuarios conectados Entonces agregamos directamente aquí devolución de llamada final con solicitud y respuesta Bueno. Ahora aquí, primero obtenemos todos los productos, así que los productos const es igual a los productos dot find No pasamos aquí ninguna condición porque queremos todos los productos. Y aquí tenemos que agregar esperar para la consulta. Y para esperar, agregamos aquí asincrónico y al final, simplemente devolvemos respuesta punto jcnpducts S los cambios vamos a probar esta implementación. En el cartero, creamos una nueva solicitud en colección de productos, productos G Aquí, ingresamos al punto final a Productos API, seleccionamos Método a G y simplemente enviamos la solicitud. Vea aquí obtenemos todos los datos de los productos en matriz. Y en esa matriz, obtenemos objeto para cada producto con todos los campos. Ahora mi pregunta es, ¿ necesitamos todos los detalles aquí? ¿Podemos reducir el tamaño de los datos que estamos enviando desde el back-end? Si pasamos el cursor sobre este tamaño, obtenemos el tamaño de respuesta con encabezado y cuerpo separados Observe el tamaño actual de los datos 14.39 KB. Ahora déjame mostrarte cómo debería quedar nuestra página de productos en front end. Ver, aquí tenemos la lista de todos los productos, y es casi similar a Amazon o cualquier aplicación de comercio electrónico. Si prestas atención a la tarjeta de productos, realmente no necesitamos todos los detalles. Escribamos los rellenos que queremos mostrar en la tarjeta de productos. El primero es ID para identificar título del precio del producto, stock si los productos están en stock, solo entonces mostramos botón de cabeza a tarjeta. A continuación, por supuesto, mostrar imagen, que será la primera imagen de la matriz de imágenes. A continuación necesitamos detalles sobre las reseñas, y eso es todo. En nuestra consulta, agregamos método select para seleccionar los rellenos. Ahora, en lugar de agregar todos los rellenos nombre, podemos escribir qué rellenos no queremos. Para eso, solo agregamos o menos antes de ese nombre de campo. No necesitamos descripción. Además, no queremos mostrar vendedor. Tampoco categoría, y no queremos subrayado subrayado V. No es necesario. Aquí están los cambios y échale un vistazo. Volvamos a enviar la misma solicitud y comprobemos la talla. Ver, se reduce en un tercio porque la descripción tiene más datos que cualquier otro campo, y es por eso que eliminamos rellenos innecesarios. Ahora vamos a hacer más estrechos estos datos. Aquí tampoco queremos todas las imágenes. Solo queremos que se muestre la primera imagen en la portada. Ahora hay dos soluciones para eso. La primera es que podemos crear un relleno separado en nuestro modelo de productos como imagen de visualización o imagen de portada. Cuando estemos almacenando el nuevo producto, entonces en ese campo, almacenaremos el nombre de la primera imagen. Esa es una solución. Otra solución es que podemos extraer el nombre de la primera imagen de cada producto y agregarlo en el mismo objeto de producto que estamos enviando desde el back-end. De esta manera, no tenemos problema de duplicación de datos. Ver ambas soluciones son geniales. Aquí, no podemos aplicar la primera solución porque agregamos todos los productos. Te voy a mostrar la segunda solución, que también es genial. En primer lugar, aquí escribimos productos punto Mapa. Ahora aquí estamos obteniendo un solo objeto de producto, y la función de flecha. Ahora como sabemos, lo que sea que devolvamos de esta función, será el ítem de la nueva matriz. La lógica es que devolveremos todos los datos que tenemos en un solo producto, y luego no queremos enviar la matriz de imágenes, por lo que reemplazaremos esa propiedad images con el primer elemento images. Queremos array de imágenes, cuando no agregamos una nueva propiedad con el mismo nombre, podemos hacer que muestre imagen o algo más, pero aquí no queremos enviar array de imágenes. Por eso estamos dando el mismo nombre. Déjame mostrarte. Aquí devolvemos objeto. Dentro de esto, antes que nada, agregaremos todas las propiedades del operador de amplio spread de un solo producto. Agregamos todas las propiedades de un solo producto tal como es. Después de eso, para reemplazar la propiedad images, agregamos aquí imágenes y aquí como valor, establecemos product dot Images, primer elemento, que es índice cero. Hecho. Ahora, este método de mapa devolverá una nueva matriz con todo el objeto de producto único actualizado. Lo almacenamos en variables llamadas productos actualizados. En el lugar de los productos, simplemente devolvemos productos actualizados en respuesta punto JSO Guarda los cambios, y veamos que estamos obteniendo esto correctamente o no. Mira, aquí estamos obteniendo algún objeto extraño y al final de cada objeto, estamos obteniendo esta propiedad de imágenes, lo que significa que nuestro método de mapa está funcionando. Pero por qué estamos consiguiendo este extraño objeto. Simplemente const dot log este array de productos y Al en la respuesta dot json, volvemos a enviar productos objeto Guarde los cambios y enviemos la solicitud. Vea, aquí obtenemos la matriz de productos regulares y volvemos al código VS, terminal abierta, y vea aquí estamos obteniendo la misma matriz de productos. Ahora intentemos mover esta línea de consola en el método map. Y en el lugar de los productos , consola dot log el único producto. Guarde los cambios y enviemos la solicitud. A terminal, S, aquí obtenemos de nuevo el objeto de producto único regular. Creo que cuando estamos agregando operador spread, que cuando estamos obteniendo ese objeto propiedades, en lugar de un solo producto, lo envolvemos en el objeto y agregamos aquí operador spread. S los cambios y enviar la solicitud. Volver a VSCode Mira, aquí estamos consiguiendo este extraño objeto. Lo que está pasando aquí. Entonces esto sucede cuando estamos obteniendo datos con mangos, no obtenemos un simple objeto Javascript. Obtenemos objeto de documento Mongoose, que incluye tanto los datos del documento en bruto en el perro como propiedades y métodos adicionales como el subrayado del dólar, dólar es nuevo proporcionado por mangosta para Ahora el problema es que no queremos esas propiedades y métodos. Quiere un objeto JavaScript simple de la base de datos, no un objeto de documento de mangos Para resolver esto, simplemente agregamos una propiedad al final de esta consulta. Esto elimina todas las propiedades específicas de los mangos adicionales. Ahora podemos devolver aquí productos actualizados en la respuesta. Guarda los cambios y echa un vistazo. Enviar esta solicitud y ver, aquí reemplazamos la matriz de imágenes con el nombre de la primera imagen, y si verificamos nuestro tamaño de datos, reducimos más. Encantadora. Así depuramos y encontramos el error. Ahora aquí está la única cosa también. Aquí estamos enviando una matriz completa de reseñas en que tenemos objeto que tiene detalles de uso, la calificación, y también comentario. Actualmente, para todos los productos, no tenemos ninguna reseña. Por eso no podemos ver esos datos de gran tamaño. También en front end, solo queremos mostrar el promedio de calificación y el número total de calificación. También podemos reemplazar la matriz reviews con solo dos propiedades. Déjame mostrarte. Retiramos esta consola. No lo necesitamos. En primer lugar, crear un nuevo costo variable el número de reseñas es igual al producto dot rev dot LNT Aquí, Jack, tienes reseñas o reseña. Tengo reseña, así que me quedo con la revisión de punto del producto. Ahora bien, ¿cómo podemos encontrar el promedio? El promedio es básicamente, tenemos que sumar todos los números de calificación y dividirlo con el número total de reseñas. Definimos una nueva variable Cast suma de calificaciones es igual a ahora para sumar las calificaciones, usamos reduce, que es el método array. Revisión de puntos Badu, que es array dot reduce. Ahora aquí obtenemos dos parámetros. El primero es total, o podemos decir suma, y el segundo es el valor actual, que es una sola revisión. Y ¿qué quieres hacer en esta devolución de llamada? Simplemente suma más revisión punto lectura. Después de eso, en el segundo parámetro, se puede establecer el valor por defecto de esta suma, que establecemos en cero. Este método reducido tomará dos argumentos. La primera es la función callback, que utilizamos para hacer algunas operaciones matemáticas, y la segunda es el valor predeterminado del parámetro sum Ahora tenemos suma de calificaciones, costo promedio de calificación es igual a suma de calificación, dividido por número de reseñas. Ahora, aquí hay una cosa. Si el número de reseñas es cero, ¿entonces qué? 0/0 nos dará undefined. Si el número de revisiones es cero, ASir u operador uno Esto evitará ese error. Ahora vamos a reemplazar la matriz de revisión por estas dos propiedades. Después de las imágenes, volvemos revisión a objeto, número de reseñas, a número de reseñas, o para simplificar, eliminamos la segunda propiedad, calificación promedio a calificación promedio. Guarda los cambios y echa un vistazo. Enviar la solicitud de nuevo y ver ahora podemos revisar como objeto. Entonces a partir de la consulta, solo enviamos lo que el front end necesita. Entonces así es como tenemos que pensar cuando estamos enviando datos desde el back-end. 125. Paginación o consulta infinita: Ahora actualmente estamos enviando los 24 productos de la base de datos. Imagínese si en nuestra base de datos, tenemos 100 o mil productos, entonces enviar todos los productos en una sola respuesta hará que nuestra API sea lenta. Dime ¿qué debemos hacer ante esta situación? Bien, podemos enviar datos página por página, para que nuestro front-end pueda implementar funciones paginación o desplazamiento infinito Esto ya lo hemos visto en la Sección Siete. Vamos a implementar la paginación o consulta de desplazamiento infinito. Backend es lo mismo para ambas características. En primer lugar, obtendremos el número de página actual del parámetro de consulta, y ¿cómo podemos acceder a él? Derecha, por consulta de punto de solicitud. La página de costo es igual a la página de punto de consulta de solicitud. Ahora bien, esta petición punto query dot page es string porque lo que sea que obtengamos del parámetro query, será string. Tenemos que convertir esta página en entero, envolvemos con paréntesis y paralizar entero A continuación, tenemos que definir cuántos datos de número de productos queremos enviar en una página. Entonces const por página es igual a ocho. Ahora tenemos que simplemente agregar dos métodos en nuestra consulta. El primero es punto Skip y aquí pasamos página paréntesis menos uno por página Si page es uno, entonces uno menos uno, cero en ocho, que también es cero. Nuestra consulta salta cero productos. Si la página es dos, entonces dos menos uno, que es uno en ocho, que es ocho. Así que nuestra consulta Omita los primeros ocho productos. Ahora, después de Skip, tenemos que agregar la propiedad Limit, y en eso, pasamos por página. Entonces límite es cuántos datos queremos obtener de la base de datos Tan simple como eso. Probemos esta implementación, envíemos la solicitud. Verás, solo conseguimos ocho productos. Ahora podrías preguntar, no pasamos página en el parámetro de consulta. Aún así estamos obteniendo ocho productos. Sí, estamos obteniendo ocho productos porque esta solicitud punto query dot page no está definida. Entonces el método skip omitirá cero elementos, y luego establecemos el límite en ocho. Entonces por eso estamos consiguiendo ocho productos. ¿Y si queremos que esta consulta sea más personalizada para front end? Imagina que nuestro front-end quiere ascender por página productos en parámetro de consulta Supongamos diez productos en una sola página. Podemos hacer algo así. En lugar de este Ed codificado duro, obtenemos request query dot perpge query parameter Nuevamente, lo convertimos en entero usando parse integer. Incluso si el front-end no quiere pasar por parámetro de página, pase aquí el valor predeterminado, por lo que el operador ocho. Y podemos manejar esta página agregando operador y el valor predeterminado será uno. Ver los cambios, y vamos a obtener datos de la página dos. Entonces nos interrogamos al final de la URL para pasar el parámetro de consulta. La página es igual a dos. Y además, pasamos por página a diez y enviamos la solicitud. Consulte, nuestra consulta, omita primeros diez registros y luego envíe la página dos, que es de 11 a 20 productos. Ahora aquí hay una cosa. En el front end, muchas veces necesitan más detalles como número total de productos. Por eso, decidirán cuántas páginas tienen que mostrar o cuántas veces pueden obtener los datos del back-end. Entonces quieren el número de página actual y algunos otros detalles. Consigamos rápidamente estos detalles y pasémoslos en la respuesta. En primer lugar, después de estos productos de actualización, podemos hacer algo como esto. Costo, el total de productos es igual a esperar documentos de vaca punto producto. Esto contará todos los productos. Ahora después de eso, también podemos contar un número total de página, costo, páginas totales es igual al total de productos, dividir por página. Supongamos que tenemos 50 productos y por página es ocho, entonces obtenemos 6.25, lo que significa seis páginas completas, y necesitamos una página más para mostrar dos productos Entonces es mejor, siempre sellaremos este número. Para eso, tenemos que simplemente envolver esta ecuación con la función matemática punto SL. Esto convertirá este 6.25 en siete. Ahora en el lugar de enviar esta matriz de productos actualizados, pasamos aquí objeto. Primero propiedades productos a productos actualizados, productos totales, a productos totales, o también podemos eliminar esto. Además, pasamos páginas totales. Además, podemos enviar página, que es actual página a página y publicar por página por página por página. He añadido aquí toda la información, pero puedes agregarla de acuerdo a tus necesidades. Guarde los cambios y enviemos la misma solicitud. Mira, obtenemos una matriz de productos y con eso obtenemos estos detalles. Eso es todo lo que tenemos que hacer para paginación o la consulta infinita 126. Envía productos por categoría: De obtener productos, es posible que queramos obtener solo productos por categoría. Para eso, no necesitamos crear una nueva API. Simplemente podemos implementar eso en esta consulta también. Primero, obtenemos el nombre de categoría en el parámetro de consulta, la consulta de costo es igual a la categoría de punto de consulta de solicitud. Si no pasamos categoría, entonces pasamos aquí o nulo. Ahora, después de eso, para la consulta, agregamos la variable let query. Lo configuramos en objeto vacío. Aquí, pasamos este objeto de consulta en este método fino. Ahora podemos llenar esta consulta de acuerdo a nuestras necesidades. Esta consulta es el objeto de comparación. Pasamos aquí si la categoría de consulta de condición está disponible, entonces primero tenemos que agregar la propiedad de categoría al ID de categoría en este objeto de consulta. Ahora, si desde el front-end, obtenemos directamente el ID de categoría, entonces podemos pasar directamente ese ID en el objeto de consulta. Pero la mayoría de las veces obtenemos nombre de la categoría de la parte delantera. Tenemos que encontrar ID de categoría en nuestra base de datos. La categoría de costo es igual a una categoría de peso punto Fine Vn. Aquí pasamos el nombre del objeto de comparación a la categoría de consulta. Asegúrate de importar este modelo de categoría en la parte superior. Por lo que la categoría de costo es igual a requerir. Aquí vamos una carpeta arriba modelos categoría. Ahora bien, ¿y si no financiamos la categoría? Aquí comprobamos si la categoría no está disponible. Simplemente devolvemos respuesta con código de estado 404, no se encuentra en el método Jason, pasar objeto con propiedad de mensaje, categoría, no encontrado. Al final, simplemente establecemos categoría de consulta es igual a la categoría punto subrayado ID Ahora nuestro objeto de consulta se ve así. Si pasamos eso en nuestro método fino, entonces actuará como objeto de comparación. Ahora, vamos a probar esto de Mongoi convertido pase, ir a la categoría colección, copiar cualquier Supongamos que copio la categoría de smartwatches. Ahora volvemos a Cartero en la URL, agregamos otro parámetro de consulta y la categoría es igual a los relojes inteligentes Asegúrate de escribir el mismo nombre que tenemos en la colección de categorías y envía esta solicitud. Y aquí obtenemos matriz vacía. Oh, aquí pasamos página es igual a dos, y en esta categoría, no tenemos tantos datos que podamos mostrar en la página también. Por lo que cambiamos esta página a una y enviamos la solicitud. Ver, aquí conseguimos todos los productos de relojes. 127. Envía el producto por búsqueda: En nuestra aplicación, el usuario también puede buscar los productos y querer ver todos los productos de acuerdo a su búsqueda. También podemos implementar eso en esta única consulta. No es obligatorio agregar todas las características en esta consulta, pero te estoy mostrando la práctica del mundo real. Después de esta categoría, la búsqueda de consulta de costo es igual a solicitar consulta punto SRG o la configuramos en Nulo Después de esta condición de categoría, agregamos otra condición if, query search está disponible entonces establecemos otra propiedad en el objeto query. El título del punto de consulta es igual al objeto. Aquí agregamos dólar jx, para consultar surge y para hacer esta consulta insensible a mayúsculas y minúsculas, pasamos otra propiedad, opciones de dólar a cadena I. Además, en la parte inferior, en este tutor productos, tenemos que pasar el objeto de consulta en el método count document Olvidé pasarlo en la lección anterior, y eso es todo. Guarda los cambios y echa un vistazo. Agrega aquí otro parámetro de consulta, y surge es igual a aquí agregamos app y enviamos la solicitud. Verás, solo obtenemos un dato porque en su título, tiene Apple. Así es como podemos personalizar esta Gtquery para obtener todos los productos Además, me doy cuenta de una cosa. Almacenamos con éxito las imágenes de nuestros productos en nuestra carpeta del servidor, pero no podemos acceder a ella. Necesitamos establecer esos archivos estáticos como hicimos para las imágenes de categorías. En el archivo index dot js, después de esta categoría estática, agregamos app dot ug. Aquí, agregamos el prefijo para la ruta del archivo estático. Pasamos subidas de productos. Ahora, después de eso, usamos Express dot static Middleware para compartir los archivos estáticos desde el serfer y dentro de esta función, tenemos que pasar el nombre de la carpeta que queremos Así sube productos. Recuerde, esto es prefijo para URL, y esta es la ruta de la carpeta de nuestros archivos estáticos y hecho. 128. Ejercicio: obtén datos de un producto único: Ahora, cuando en el front-end, alguien hace clic en la tarjeta de productos, deberíamos mostrarle todos los detalles sobre ese solo producto. Aquí está el ejercicio para ti. Tienes que definir una nueva API para obtener detalles de un solo producto. Entonces nuestra API debería verse así. Productos API de Slash, ID de producto de slash. Esta identificación, tienes que encontrar el producto. Además, intenta obtener datos reales del vendedor como ID del vendedor, nombre del vendedor e ID de correo electrónico, no simple ID de vendedor. Intenta resolverlo y si te olvidaste de poblar, entonces puedes ver seis y siete poblar lección y luego tratar de resolverlo Entonces espero que resuelvas este ejercicio o intentes resolverlo. No te preocupes si te dan error o te quedas atascado en algún momento. Es la parte del aprendizaje. También solía pegarme mucho donde aprendí nodo primera vez. No te preocupes por eso. Ahora veamos la solución. Así escribimos router punto Gt. ¿Qué pasamos en la URL? ¿Cómo podemos saber qué detalles del producto queremos? Derecha. Aquí agregamos ID de columna como parámetro raíz, y este es el ID único de un solo producto. Ahora, de nuevo, no agregamos aquí middleware porque cualquier usuario puede ver los detalles de un solo producto Pasamos directamente la función de devolución con solicitud y respuesta En primer lugar, necesitamos este ID, por lo que Const ID es igual a solicitar dot VMs dot Ahora por esta identificación, podemos encontrar este producto. Entonces C producto es igual a esperar producto punto encontrar por ID. Aquí pasamos ID de producto. También hacemos esta función asíncrona. Después de eso, podemos poner condición I producto no está disponible, entonces devolvemos respuesta con código de estado 404 punto JSObject con propiedad de mensaje, producto, Ahora bien, si obtenemos el producto de la base de datos, entonces simplemente respondemos dot Json este producto. Di los cambios, y vamos a probar esta API. Copia este primer ID de producto porque lo necesitamos. En el cartero, creamos una nueva solicitud llamada Get single product Bien, seleccione el producto API URL. Y aquí pegamos nuestro ID de producto. Asegúrate de que la solicitud es G y envía la solicitud. Ver, aquí obtenemos los datos completos de un solo producto. Ahora si pasamos aquí algún ID aleatorio y enviamos la solicitud, entonces no obtenemos los datos. Y si revisamos nuestra terminal, vea que nuestra aplicación se estrelló Ocurre porque no manejamos errores en nuestra API. No te preocupes, lo haremos en la siguiente sección. Actualmente, tenemos que reiniciar esta aplicación con node mod. Volvamos a pasar el DNI original y enviar la solicitud. Bonito. Ahora aquí tenemos poco problema. En la página de productos individuales, queremos mostrar la información del vendedor como el nombre y el correo electrónico. Pero aquí obtenemos ID de vendedor, así que tenemos que poblar esos datos de la colección del usuario Además, no queremos que esta categoría se llene. Otras cosas están bien. En primer lugar, después del método fino, pasamos punto poblar. Al primer parámetro, pasamos qué campo queremos poblar. Derecha, es vendedor, en qué datos queremos poblar subrayado ID, nombre Ahora, también, queremos poblar al usuario, que estará disponible en el array reviews Aquí tenemos que poblar los datos NASD. También es realmente simple. Pasamos otro método de poblar. En primer parámetro, añadimos review, que es el array para acceder al usuario, tenemos que escribir punto user. Ahora en el segundo parámetro, nuevamente queremos los mismos rellenos. Subrazo ID, nombre y correo electrónico. Bueno. Guarda los cambios y echa un vistazo. Enviar la solicitud. Ver, ahora obtenemos el Objeto del Vendedor con ID, nombre y correo electrónico rellenados. Actualmente, no tenemos reseñas. Por eso no lo podemos ver. Además, se nos olvidó eliminar este relleno de categoría. Al final, pasamos punto seleccionar Método y aquí menos categoría y menos subrayado subrayado ID Entonces los cambios y echar un vistazo. Enviar esta solicitud, C, eliminamos categoría y subrayamos subrayado propiedad V. Así de sencillo es el nodo js. Al principio, sientes que es duro. Pero si haces implementación paso a paso, entonces puedes dominarla correctamente. Y por eso te explico código línea por línea. Ahora en la siguiente lección, crearemos API para eliminar el producto único. 129. Ejercicio. - Eliminar el producto: Ahora vamos a crear API para eliminar el único producto. Así que aquí escribimos router dot delete. Aquí, nuevamente obtenemos ID como parámetro de ruta. Ahora aquí necesitamos middleware o no. Correcto, necesitamos middleware porque solo el usuario conectado puede eliminar el producto, y además queremos obtener detalles sobre ese En primer lugar, pasamos middleware juramento. Luego pasamos la función de devolución de llamada API con solicitud y respuesta Ahora, antes que nada, obtenemos ID del producto del parámetro route. Costo, ID del producto es igual a solicitar punto params dot ID. Ahora tenemos que encontrar el producto a partir de esta identificación. El producto fundido es igual a esperar punto del producto encontrar por ID en que pasamos el ID del producto. Ahora a partir de esta consulta solo necesitamos el ID del vendedor. Agregar método selecto, y aquí pasamos vendedores llenos y también en la parte superior, hacemos esta función acing. Ahora ponemos aquí condición para que el producto se encuentre o no. Así que simplemente copiamos esta condición de la API anterior y la pegamos aquí. Bueno. Ahora si encontramos producto, entonces comprobamos que el usuario es admin o el usuario es el vendedor de ese producto. Escribimos solicito usuario punto regla punto es igual a admin o solicitar usuario punto, punto subrayado ID es igual al producto, punto vendedor Si alguna de esta condición es cierta, entonces podemos eliminar este producto. Ahora la pregunta es, ¿cómo podemos eliminar este producto? En este objeto producto, que obtenemos de la base de datos, Mongoose también pasa un método con él, que es dot delete one Y eso es todo. Por esto, el producto se eliminará de la base de datos. Además, usamos aquí eliminar un método porque previamente obtenemos el producto de la base de datos. Si tenemos que eliminar directamente ese producto, entonces usamos el método find by ID y delete. También, tenemos que agregar aquí una espera porque esta es una operación asíncrona Ahora, después de eso, simplemente devolvemos respuesta punto Json con propiedad de mensaje, producto eliminado con éxito. Ahora actualmente, comentamos esta lógica de eliminación para verificar esta implementación. Lo habilitaremos después de algún tiempo. Ahora bien, si esta condición no es cierta, entonces volvemos aquí respuesta con código de estado 403, 44 Biden dot Json con propiedad mesa, exceso denegado Solo el administrador o vendedor puede eliminar este producto. Ahora probemos esta implementación, copie cualquier ID de producto de nuestra lista de productos. Copo este último ID, ahora en el post win, creo una nueva solicitud llamada tilt, un producto en este método para eliminar, aquí escribimos URL, productos API, y aquí pasamos nuestro ID de producto y nos aseguramos nuestro ID de producto y nos aseguramos de que el método sea eliminar y enviar la solicitud. Oh lo siento, también necesitamos enviar token JWT en encabezado, ir a API de inicio de sesión, iniciar sesión con tus datos de usuario, quien es el vendedor de ese producto Ver, aquí consigo clave JWT, copia eso, y en eliminar API, vamos a encabezados y agregamos aquí autorización en clave Como valor, pasamos el error, el espacio y pegamos la clave JWT aquí Ahora, envía la solicitud. Mira, aquí tenemos acceso denegado, así que no nos metemos en esta condición de I. Por eso nos sale este error. El problema está en esta condición, simplemente consol dot log esta condición de cabina Copia esta primera condición y péguela aquí, coma, copia la segunda condición y péguela aquí Di los cambios, y nuevamente, envía la solicitud. Ahora volvemos al código VS, abrimos un terminal aquí para la primera condición, obtenemos false, lo cual es cierto porque no somos admin. Después de eso, por una segunda condición, también nos hacemos falsos. Por qué esta cuenta es vendedor de este producto. Seleccione por separado consultar dot log, estas dos propiedades. Quitar esta primera condición, y en el lugar de iguales, agregamos coma Ver los cambios, y volvamos enviar la misma solicitud de vuelta al código VS, y en el terminal, ver, primero obtenemos el ID de objeto en cadena, y luego obtenemos el nuevo ID de objeto, que es el ID de objeto Mongoose Es por eso que la cadena y el ID de objeto no coinciden. Entonces o tenemos que convertir esto tanto en ID de objeto o podemos convertir esto ambos en cadena. Ambos funcionarán. Entonces convertimos estos dos en cadena. En JavaScript, tenemos el método dot two string para convertir los datos en cadena. Pase ese punto dos cadenas para ambos ID y retire esta consola. Guarde los cambios y volvamos a enviar la solicitud. Ver, ahora conseguimos que el producto se elimine correctamente. Ahora, si quieres, puedes habilitar este método delete one. Ahora, después de eliminar el producto de la base de datos, es mejor eliminar también esas imágenes de productos del servidor. Para eliminar el archivo del servidor, podemos usar el módulo FS. Entonces en la parte superior, Fs es igual a exigir promesas de Fs. Y también necesitamos módulo path. Entonces const path es igual a requerir el módulo Path. Ahora en la parte inferior, después de este método delete one, agregamos fs unlin Ahora en este método, tenemos que pasar la ruta completa del archivo que queremos eliminar. Pero en la matriz de imágenes, solo tenemos nombre de archivo, pero necesitamos aquí ruta completa. Para eso, necesitamos usar el módulo Path, que es otro módulo incorporado de node jazz. Déjame mostrarte que el camino completo de Const es igual a path dot join Primero, pasamos y disco y Discord su nombre, que es toda la ruta del directorio de nuestro proyecto A continuación, escribimos nuestra carpeta en la que almacenamos las imágenes. Aquí vamos una carpeta arriba porque actualmente estamos en la carpeta rutas, subir productos de slash, y luego en el tercer argumento, agregamos nuestro nombre de imagen Ahora aquí no tenemos una sola imagen. Tenemos matrices de imagen, así que tenemos que ejecutar loop para esto. Antes de esto, agregamos producto dot Images. Entonces para acceder a las imágenes, aquí en el método select, tenemos que pasar imágenes. Bueno. Ahora producto dot images dot para cada uno. Aquí, obtenemos cada nombre de imagen, función de flecha, y en eso, moveremos estas dos líneas. Ahora, aquí en el desenlace de punto fs, pasamos esta ruta completa, y esto como desenlace punto es una operación asíncrona Entonces tenemos que adherir un peso, y para eso, tenemos que hacer esta función de color asíncrona. Bueno. Ahora antes de ejecutar esta página, es mejor verificar que tenemos array de imágenes o no. I producto dot Images está disponible y producto imágenes de punto longitud de punto, mayor a cero. Sólo entonces ejecutamos este bucle. Mueve este código aquí. En esta operación de desvinculación, podría ocurrir un error. Antes de este desenlace de fs punto, agregamos try and cache blog Mueve este método de desenlace en el tr Blog, y en el blog de caché, obtenemos esta excepción Simplemente consultamos error de punto en metics, error, borrado, archivo, corchetes de dólar C, ruta completa, coma, agregar objeto de error Ver los cambios y echar un vistazo. Probemos esta implementación, copiemos el ID del último producto. También vea el nombre de su imagen. Estas imágenes deben ser eliminadas. Reemplace este ID de producto este ID y envíe esta solicitud de eliminación. Ver, aquí conseguimos que el producto se elimine correctamente, y si revisamos nuestra carpeta de productos, vea en esta carpeta, no obtenemos esas imágenes. Así es como eliminamos el producto y sus imágenes. Ahora agreguemos también ese producto que acabamos de eliminar. Entonces y crear una nueva API de producto y aquí cambio este título a nuevo nombre de producto. Seleccione aquí imágenes. Y simplemente envía esta solicitud. Aquí, obtengo token válido porque este anterior está caducado. Vamos a la API de inicio de sesión, copiamos el token, y en los encabezados, pegamos este token. Ahora, enviemos esta solicitud. Ver, aquí obtenemos nuevos datos. Encantadora. Nos vemos en la siguiente lección. 130. Búsqueda de productos por título [OPCIONAL]: Ahora en todas las aplicaciones de comercio electrónico, tenemos la función de búsqueda donde en la parte inferior de la barra de búsqueda, podemos mostrar sugerencias. Entonces tenemos que definir API para eso. Además, esta API llamará cuando cada carácter entre en la barra de búsqueda. Así punto exterior cat, punto final dos sugerencias de barra diagonal, función de devolución de llamada asíncrona con solicitud En esto, antes que nada, obtenemos lo que el usuario está buscando. Así que la búsqueda de costos es igual a solicitar punto consulta punto Sarge aquí, tenemos que usar expresión regular para comparar y encontrar la cadena en el título Entonces Const productos es igual a esperar producto punto encontrar pasier condición Objeto, título a Aquí, usamos expresiones regulares de dólar, que es la última forma de escribir expresión regular en Mongo Aquí pasamos nuestro texto de búsqueda y para desactivar las mayúsculas y minúsculas, pasamos aquí las opciones de dólar a la cadena I. Aquí, comparamos nuestra cadena de búsqueda con nuestro título. Esto nos dará productos que tengan esa palabra o cadena. Además, en la sucesión, no queremos mostrar todos los detalles como descripción y todo Entonces podemos agregar aquí el método Selec y solo obtenemos underscore ID y propiedad de título También podemos limitar estos datos a diez en el front-end, solo sugerimos diez productos en la parte inferior de la barra de búsqueda. Al final, simplemente respondemos dot Json estos productos. Guarda los cambios y probemos esta API. Abra Cartero, cree una nueva solicitud llamada Obtener sugerencias URL a productos API, sugerencias de barra diagonal, interrogación para pasar parámetro de consulta, búsqueda es igual a IP Asegúrese de seleccionar el método Get y enviar la solicitud. Ver, aquí no conseguimos productos. Veamos qué obtenemos en la terminal. Ver, aquí estamos obteniendo algunos problemas con el ID de objeto. Pero en nuestra API de sugerencia, no tenemos ningún ID de objeto. Entonces, ¿por qué estamos llegando aquí, error de ID de objeto. En realidad, esta llamada a la API no está llegando a la API de sugerencias. Se está moviendo dentro de esta API de obtener un solo producto. Déjame explicarte esto. Aquí está la primera URL API para el producto único. Tenemos productos API slash product ID. Agregamos otros productos API API, sugerencias de barra diagonal. Ahora Express se está confundiendo. Esta cadena de sugerencia es ID de objeto o qué. Debido a eso, nuestra API de producto único se está ejecutando. ¿Cuál es la solución aquí? Nada, solo tenemos que mover nuestra API de sugerencias antes que esta API de producto único. Por eso, Express compara nuestra API con la cadena de sugerencias, y si eso no coincide, solo entonces Express se moverá a la API de un solo producto. Cambios de fase y asegúrese de que el servidor esté funcionando correctamente. En el cartero, enviemos la misma solicitud. Ver, ahora obtenemos sugerencias de productos. Intencionalmente creé este error para mostrarte lo que puede suceder cuando creas proyecto por tu cuenta. Ahora en la siguiente sección, aprenderemos a manejar errores como profesionales. C en la siguiente sección. 131. Sección 11: ¿por qué manejamos los errores?: Actualmente estamos ejecutando nuestra aplicación en el mundo ideal. Todo está funcionando a la perfección. Pero en el mundo real, cualquier cosa puede salir mal. Cualquier error puede ocurrir. Por ejemplo, no se encuentra algún archivo o nuestra conexión con el servidor Mongo Deb no tiene éxito o el usuario no pasa la información válida o cualquier cosa puede salir mal En esos casos, tenemos que manejar errores, y aquí hay algunas razones para manejar el error. En primer lugar, cuando manejamos errores, podemos enviar mensaje de error amigable y podemos mostrar ese error amigable en la página web como servidor tiene algunos problemas, por favor inténtalo de nuevo más tarde, así. Segundo motivo para manejar errores, podemos iniciar sesión o en palabras simples, podemos almacenar los errores en el archivo separado, y luego mirar esos errores, qué errores están ocurriendo muy a menudo, y por eso, podemos resolver esos errores en nuestra aplicación. Por lo que manejar errores también puede mejorar nuestra aplicación. Ahora déjame mostrarte un error. Ejecutemos nuestra aplicación usando nodemon index dot js. Ahora en el cartero, también estamos recibiendo sugerencias del sargento Ahora supongamos que el servidor Mongoib se estrelló. Entonces, para demostrarlo, podemos comentar el código de conexión desde el archivo index dot js. Guarde los cambios, y volvamos al cartero. Enviar de nuevo la misma solicitud. Mira aquí obtenemos cargando, cargando y cargando. Y después de 10 segundos, obtenemos error. Y si revisamos nuestro terminal de aplicación, vea aquí obtenemos productos de operación de error de mangosta punto Find Buffering Tiempo salida después de 10,000 milisegundos Y después de eso, nuestra aplicación podría quedar estrellada. Supongamos que en el mundo real, nuestro servidor Mongo Deb se baja incluso por dos o 3 minutos, entonces nuestra aplicación puede fallar en producción Después de algún tiempo, el servidor Mongo Di B vuelve a entrar en vivo. Incluso si es en vivo, nuestra app permanecerá fallada y no podremos enviar datos al cliente, es importante manejar este tipo de errores Además, manejar errores no significa que el error no suceda. Manejar errores significa que por ese error, nuestro servidor no se estrellará Actualmente, esta aplicación se está ejecutando, pero antes de esta versión del nodo Jaz anteriormente, las aplicaciones de nodo se están estrellando Durante esta sección, veremos cómo manejar los errores y registrarlos. 132. Manejo de las promesas rechazadas: En primer lugar, manejemos los errores que ocurren cuando estamos tratando con promesas de API. En esta API de sugerencias, llamamos aquí a esta colección de productos. Y como sabemos, esta es una operación asíncrona, por eso usamos esperar para la respuesta Entonces tenemos aquí promesa y esa promesa es rechazada. Pero aquí no manejamos errores en el bloque dry and catch, que aprendemos en la sección seis. Recuerda, así que aquí en try and catch block, aquí en el blog de caché, obtenemos objeto de error. Ahora bien, ¿qué queremos hacer en este blog de caché? En el blog de caché en el mundo real, primero registramos el error o excepción en algún lugar del archivo o en la base de datos, y después de eso, devolveremos respuesta con código de estado relevante y mensaje de error. Actualmente, solo estamos registrando el error en la consola. En el futuro, guardaremos ese error o excepción en un archivo separado. Ahora, después de registrar el error, devolvemos la respuesta con el código de estado 500, que es error del servidor. Después de eso, también devolvemos el objeto JSON con la propiedad de mensaje llamada error interno del servidor. O puedes escribir algo que salió mal en el servidor. Podemos escribir cualquier mensaje de error que queramos. Bueno. Ahora podemos mover todo nuestro código en este blog seco. Veamos qué pasa, veamos los cambios, y aquí nuestra aplicación se reinicia. Pero aún así, nuestra base de datos Mongoib no está conectada. Ahora vamos a enviar la solicitud de sugerencias. Déjalo cargar. Después de 10 segundos, vea, aquí obtenemos la respuesta con código de estado 500 y con nuestro mensaje de error. Además, veamos qué obtenemos en la consola. Ver, aquí obtenemos este error de mangosta, igual que antes, y también nuestra aplicación no se bloquee por este error Aún así, nuestra aplicación se está ejecutando, manejamos con éxito nuestro error de promesa rechazada. Aquí no consultamos ni registramos este error, entonces en nuestro terminal, ni siquiera sabemos que obtuvimos error. Ahora bien, si tratamos de acceder a nuestras otras API, por ejemplo, enviamos esta solicitud de todos los productos. Después de 10 segundos, obtenemos aquí error, y en la terminal, nuestra aplicación no se bloquea. Entonces como podemos ver cómo podemos manejar error de rechazo de promesa usando try and catch block. De esta manera, nuestra aplicación no se bloquea, y por eso es importante manejar errores Para todas las rutas, tenemos que envolver todo nuestro código con try y cache block. Pero aquí en nuestra aplicación, tenemos casi de diez a 15 rutas API. Tenemos que envolver todo nuestro código de ruta API en try and catch Blog, que se está repitiendo. Además, si algún día queremos cambiar el mensaje de error o cambiar la lógica de registro, entonces tenemos que actualizarlo en todas nuestras rutas. Ahora podrías preguntar, ¿hay algún atajo para eso? Sí, hay atajo y lo veremos en la siguiente lección. 133. Crear un middleware con errores: En la lección anterior, vimos que tenemos que repetir este error de registro y devolver la respuesta de error en cada ruta API. En esta lección, vamos a crear un middleware común en el que vamos a escribir código para este error de registro y devolver la respuesta de error No te preocupes, es realmente sencillo. primer lugar, en nuestro archivo index dot gs en la parte inferior, después de todas las rutas, agregamos app dot g aquí pasamos función, y como sabemos, aquí obtenemos tres parámetros, request response, y next function. Ahora en esta función, escribiremos toda la lógica para el manejo de errores. En primer lugar, agregamos aquí consola dot log. Error, el middleware se está ejecutando para asegurarse de que esto esté Ahora de vuelta a nuestra ruta, corta este código dentro del bloque de caché y simplemente pégalo en nuestra nueva función de middleware Ahora bien, si queremos cambiar el mensaje de error o cualquier lógica relacionada con el manejo de errores, entonces tenemos que hacer cambios aquí en un solo lugar. Ahora aquí hay una cosa. ¿Cómo podemos obtener este objeto de error en esta función? Obtenemos este objeto de error como primer parámetro en esta función de devolución Asegúrese de que obtenemos el objeto error como primer parámetro. Ahora veamos ¿cómo podemos llamar a este middleware? Así vector hacia fuera y aquí en el bloque de caché para llamar al siguiente middleware, lo que tenemos que hacer Bien, podemos usar la siguiente función. Aquí, obtenemos siguiente función como parámetro y simplemente llamamos a la siguiente función en el bloque de caché, y pasamos objeto de error en esta siguiente función. Si estás un poco confundido, entonces déjame mostrarte el flujo de código de este middleware de error Como sabemos en nuestro back end, solo estamos ejecutando un solo archivo, que es este index dot js. Entonces nodo, empieza a ejecutar este código. Primero, se ejecutará este middleware y código estático. Después de eso, tenemos todas las rutas y después de eso agregamos error middleware Ahora cuando ejecutemos la siguiente función en cualquiera de estas rutas, esa siguiente función ejecutará este middleware de error En todas las rutas, llamaremos a siguiente función, y como primer argumento, pasamos objeto de error del bloque de caché. Si en nuestro triplog algo sale mal, este método case se ejecutará y ese método caché llamó a esta siguiente función, y que ejecutará esta función de middleware de error Tan simple como eso. Ver los cambios, y vamos a comprobar que esto está funcionando o no. Actualmente, nuestra aplicación está funcionando, buena, cartero abierto, y enviar la solicitud de sugerencias Y después de 10 segundos, obtenemos error, y en nuestro terminal, obtenemos ramiddalware se está ejecutando, lo que significa que nuestro ramiddleware está funcionando lo que significa que nuestro ramiddleware Y después de eso, obtenemos error de Mangosta, genial. Entonces, si queremos cambiar algo en el manejo de errores de rutas, entonces tenemos que hacer cambios en un solo lugar. 134. Eliminar los bloqueos de prueba: Ahora nuestra implementación actual es buena. Si estás de acuerdo con esto, entonces puedes usar este enfoque. Pero a muchos desarrolladores no les gusta este enfoque. Puedes ver que tenemos aquí try y cache block, y tenemos que repetir este try cache block en cada manejador de ruta o función de callback, que se ve un poco desordenado En el mundo ideal, debemos escribir sólo esta lógica. Entonces, ¿cómo podemos hacer esto? Es realmente simple. Acabo de revisar esta actualización de Express fi. En esta versión Express five, express maneja automáticamente el error de rechazo de promesa o estos errores que ocurren durante la operación asíncrona Express llama automáticamente a este siguiente middleware con objeto de error, que ejecutará nuestro middleware de error global Déjame mostrarte eso. Entonces ahora aquí no necesitamos este blog seco y caché. Podemos quitarlo. Así que aquí estamos de vuelta a nuestra sintaxis de ruta original. Guarde este archivo, y vamos a comprobarlo. Abrir cartero y enviar la misma solicitud de cugion. Después de 10 segundos, obtenemos este error. Y si comprobamos nuestro terminal de código VS, vea, aquí primero obtenemos el error middleware se está ejecutando, y luego obtenemos nuestro error, lo que significa que nuestro middleware de error global Esto es genial, ¿verdad? En la versión anterior, como Express four, este manejo automático de errores no está funcionando. En eso, tenemos que envolver cada lógica de ruta en bloque seco y caché, pero ahora no necesitamos hacer eso. Express hace esto automáticamente, tenemos que definir middleware de error global en el archivo index dot js . Tan simple como eso. 135. Registro de errores en el archivo: Entonces, en esta lección, registraremos nuestros mensajes de error en un archivo de registro separado como este. Es realmente interesante. Hagámoslo. Por lo que actualmente, solo estamos registrando el mensaje de error en la consola. Ahora es el momento de almacenar esos mensajes de error en un archivo separado. Así que en el futuro, podemos ver los errores que ocurren frecuentemente, podemos encontrarlos y mejorar nuestra aplicación. Entonces, para registrar los errores en un archivo, use otro paquete NPM, que es Winst Esta es una de las bibliotecas más populares para registrar los errores, y también la hace muy simple. Entonces abre terminal y escribe NPM, instala WinSTERNF usando exactamente la misma versión, escribimos en directo 3.17 0.0 y golpeamos Ahora configurar el Winston es realmente sencillo. En primer lugar, importamos Winston, const, Winston es igual a requerir y pasamos nuestro nombre de paquete Ahora bien, este Winston por defecto, danos un registrador Este registrador es suficiente para pequeños y medianos tipos de aplicación. Así podemos personalizar este registrador como queramos para grandes y complejos tipos de aplicaciones. Ahora este Winston o maderero tiene transporte. Este transporte es como un vehículo de reparto para tus registros. Decide a dónde debe ir el tronco. Un transporte toma los mensajes del registrador creados por Winston y los envía a un destino específico Ahora el destino podría ser Consola que imprime el registro en la terminal o línea de comandos. A continuación, tenemos archivo para guardar los logs en un archivo de nuestro sistema, SDTP para enviar el registro a una API y a continuación, tenemos base de datos para almacenar los logs en una base de datos como Mongo DB Por fin tenemos servicios en la nube para enviar logs a servicios como AWS, Datadog, etcétera. Estos son todos los transportes proporcionados por Winston. Déjame mostrarte algunas de ellas. Este paquete Winston por defecto, usa Consultar transporte para imprimir los registros en el terminal, pero aquí queremos guardar también los logs en el archivo separado, y para eso, tenemos que configurarlo Entonces aquí escribimos Winston dot Create Logger. Ahora en esta función, tenemos que pasar objeto de configuración, o podemos decir lo que queremos personalizar. Ahora la primera configuración es de nivel. Esta propiedad de nivel define qué tipos de mensajes queremos almacenar o registrar. Por ejemplo, solo queremos almacenar errores, o queremos registrar advertencias y errores, ambos, o queremos registrar todo tipo de mensajes. Entonces en Minston tenemos muchos niveles de registros. El primero es el error, que es el nivel más alto de registro para problemas graves. Ejemplo, falla en la conexión a la base de datos. A continuación, tenemos guerra por advertencias, información para mensajes informativos como servidor que se ejecuta en puerto o un GTB conectado, etcétera. A continuación, tenemos los verbos SDDP debug, Ci. Este es el nivel máximo a mínimo de registros. error es el nivel más alto y CLI es el nivel más bajo de registros Ahora bien, si en la etiqueta, pasamos info obtenemos mensajes de log de info nivel superior de ese, que es warning y además obtenemos log de errores. Si en etiqueta, pasamos tontos, entonces obtenemos todos los mensajes de niveles superiores. Para una mejor práctica, pasamos aquí info porque no queremos almacenar mensajes tontos en nuestro archivo de registro. Ahora después de la etiqueta, tenemos transportes, y aquí tenemos que pasar todos los transportes que queremos agregar en array En palabras simples, donde queremos enviar nuestros registros. Queremos mostrarlo en la consola o queremos almacenarlo en cualquier archivo. Entonces, antes que nada, para la advertencia de información y los errores, queremos mostrar los registros en la consola. Entonces agregamos aquí nuevos transportes Winstn dot. Asegúrese de que sea transportes, no transporte y punto Consola Por ahora, sólo vamos a consolarlo. Yo solo un minuto, vamos a almacenar estos registros en archivo separado. Ahora para usar este registrador, lo almacenamos en una variable llamada logger. Y ahora podemos usar este registrador en nuestra aplicación. Pero aquí hay una cosa. ¿Cómo puede este registrador saber qué nivel de mensaje estamos enviando? ¿Es una información o advertencia o error? ¿Cuál? Supongamos aquí en la parte inferior, tenemos este sencillo mensaje de consola de servidor de registro de punto en ejecución. Esta es una información. Así que en el lugar de usar registro de puntos de consola, podemos usar logger, que acabamos de crear, y este logger tiene todos los métodos según los niveles. Entonces, si queremos enviar mensaje como info, entonces usamos aquí logger dot info. Si tenemos advertencia, entonces usamos logger punto uno. Ahora queremos logger dot info, y veamos que estamos obteniendo este registro en Consola o no. Ver dónde cambian los cambios. Y si revisamos nuestro terminal, vea aquí obtenemos este nivel de objeto a Info y servidor de mensajes escuchando en el puerto 3,000. Genial. Ahora bien, este no es un buen formato para el registro. En el mundo real, no necesitamos solamente etiqueta y mensaje. Necesitamos mucha más información sobre el registro como marcas de tiempo, etcétera. Entonces en la configuración, tenemos una propiedad más llamada format. Aquí definimos cómo aparecen los mensajes de registro. Aquí escribimos winston formato punto, punto Combinar. Y en esto, podemos pasar algún formato de Winston. Al igual que agregamos Winston formato punto, punto T Stem, y después de eso, winston dot format dot JSON No te preocupes. Tenemos que instalar a Winston una sola vez Después de eso, solo usamos este registrador para imprimir y enviar registros. Comparte los cambios y echa un vistazo. Ver, ahora también obtenemos marca de tiempo. Ahora en nuestro middleware de error, aquí, vea, usamos el registro de puntos de consola para este objeto de error Así que podemos usar aquí ahora, logger dot message. Tenemos que pasar el mensaje de error, que es mensaje de punto de error, y también enviamos todo el objeto de error. Veamos qué obtenemos. Guarde los cambios, y devolvamos a probar esto a Postman. Y enviamos aquí obtener solicitud de sugerencia. Ahora después de diez segundos, vuelta al código Vas, abre terminal. Mira, aquí obtenemos nivel a mensaje de error al mensaje de error, y en la propiedad stack, obtenemos todo el objeto error, que pasamos en el método logger dot error, y al final, obtenemos time stem. Ahora vamos a hacer este registro más avanzado. Aquí solo estamos recibiendo el mensaje de registro y la pila de registros, pero aquí no obtenemos qué ruta causó este error o qué método creó este error. Queremos añadir eso en nuestro registro. Eso nos dará información específica. Es realmente simple. Entonces en el error de punto logger, en el lugar de este segundo argumento, podemos pasar objeto. En este objeto, podemos definir cuáles son las otras propiedades que queremos mostrar. Entonces primero, agregamos stack a error dot stack. A continuación, queremos que el método API, así método para solicitar método punto. A continuación, queremos ruta para solicitar la URL original del punto. Asegúrate aquí de escribir el nombre correcto de la propiedad. También, podemos ordenar estas propiedades. Supongamos que queremos mostrar el ciervo al final, y primero, queremos método y luego camino Entonces en este objeto, también podemos establecer el orden de las propiedades. Pero para eso, en nuestro formato, tenemos que agregar este formato JSN De lo contrario, no va a funcionar. Guarda los ins y echa un vistazo. Vuelva a enviar la solicitud de las sugerencias después de 10 segundos al código VS en el terminal. Ver, aquí obtenemos el método de mensaje de error para obtener ruta a nuestra API, lo que provocó este error, pila completa de este error y marca de tiempo de este Encantadora. Así que terminamos con el formateo de nuestro registro. Ahora, vamos a almacenar el registro en el archivo separado, no sólo en Consola. Entonces aquí en el transporte, agregamos otro transporte nuevo Winston dot transporta archivo Aquí pasamos el objeto dentro de la propiedad, nombre de archivo, logs, smlogs dot log Asegúrate de usar tu extensión de archivo dot log, lo que nos ayudará a entender lo que hay en el archivo. Ahora di los cambios y échale un vistazo. En la terminal, obtenemos esta información de registro, y si verificamos nuestra aplicación, nuestro archivo de registro se crea en logs slamlogs dot Y si abrimos este archivo, vea, obtenemos información agregada en el archivo. Si enviamos de nuevo, obtenemos solicitud del cartero y después de 10 segundos, obtenemos aquí error y si volvemos a nuestro VSCode, entonces obtenemos nuevo nivel de registro Ahora a algunos desarrolladores les gusta registrar solo errores en el archivo, no informaciones y advertencias. Creo que eso es mucho mejor. También podemos hacer eso. Volver a Winston. Aquí después del nombre del archivo, también podemos especificar el nivel a error. Esto significa que solo almacenamos errores en este archivo, y también podemos cambiar el nombre del archivo a errores dot log Entonces, si en alguno de estos transportes, no especificamos el nivel de registro, entonces ese transporte utilizará este nivel de registro global Y si especificamos el nivel de registro en los transportes, entonces anulará este nivel de registro global Supongamos que para el transporte de consola, agregamos nivel de objeto para depurar. Así que ahora para todos los niveles que están a punto de depuración, mostraremos log in Console y solo los errores se almacenarán en el archivo de registro de errores punto. Entonces así es como almacenamos los registros en un archivo separado, y luego podemos mejorar nuestra aplicación de acuerdo a eso. Entonces, para resumir, el registro de puntos de consola no está mal. Pero al usar Winston, podemos almacenar nuestros registros en un archivo separado, lo que hace que nuestra aplicación sea más profesional 136. Registro de errores en mongoDB: Ahora en esta lección, almacenaremos nuestros registros en nuestra base de datos Mongo DB así Es realmente sencillo, hagámoslo. Para almacenar los registros en Mongo DB, necesitamos otro paquete Winston, abrir terminal, y aquí escribir NPM instalar Winston Mongo DB, a la velocidad 6.0 Minimizar esta terminal, genial. Ahora para agregar este paquete en la parte superior, requerimos Winston des Mongo DB Ahora en la configuración de Winston, necesitamos agregar otro transporte para Mongo DB Entonces después de este transporte de archivos, agregamos nuevos Winston dot transporta punto MongoDB Y en este transporte, tenemos que establecer algunas opciones. El primero es DB. Aquí, tenemos que agregar URL de base de datos. Simplemente copiamos esta URL de conexión de Mongo DB y la pegamos aquí Además, podemos pasar el registro nivel por nivel de propiedad a error, y eso es todo. Ver los cambios, y vamos a comprobar simplemente esta implementación. Ejecutemos nuestro servidor si no se está ejecutando y enviemos la misma solicitud de sugerencias. Después de 10 segundos volviendo al código Vas, aquí obtenemos el error en la consola y si revisamos nuestra base de datos, aquí obtenemos nueva colección de registros, y en eso obtenemos nuestro último error. Aquí obtenemos timestamp, log level, que es error, mensaje de error, y por último, obtenemos metadatos Este es el mismo objeto que pasamos al segundo parámetro de error de punto del registrador. Ver, aquí tenemos método, ruta, y pila completa del error. Así de sencillo registrar errores en la base de datos. Si quieres almacenar registros en la base de datos, entonces puedes quedarte con este transporte. Y si quieres almacenar los registros en un archivo separado, entonces podemos quedarnos con este transporte de archivos. Mostrarte las dos vías, puedes usar cualquiera de ellas de acuerdo a tu elección. Realmente depende de ti. 137. Excepciones sin capturar: Así que hasta ahora en este proyecto, hemos manejado errores que ocurren en el manejador de rutas y el manejador de ruta pasará error o excepción al middleware de error global Ahora bien, ¿y si obtenemos error en el resto de la aplicación de nodo? Nosotros no lo manejamos, ¿verdad? Entonces para demostrarlo, elimino el comentario de la conexión de Mongo DB y simplemente lanzo un nuevo error desde aquí Así que lanza nuevo error, y aquí pasamos mensaje de error, algo falla en la aplicación del nodo. Entonces los cambios, y en nuestro terminal, detienen nuestra aplicación, y ejecutamos nuestra aplicación usando node index dot js. Ver, aquí obtenemos error, algo falla en la aplicación de nodo, y además nuestra aplicación se bloquea. Esto se llama excepción no capturada. Una excepción no capturada es como un invitado sorpresa en una fiesta No estás preparado para ello y causa caos porque no hay plan para manejarlo. En palabras simples, cada vez que la aplicación de nodo se un problema o una excepción que no sabe manejar, se llama una excepción no codificada Estos son errores en nuestro código, esos no son agarrados por un intento y captura adecuado o no se manejan correctamente, y como resultado, Node simplemente no sabe qué hacer y nuestra aplicación se estrelló A medida que nuestra aplicación se bloquea, nuestro front-end no obtendrá los datos de nuestro back end Nuestra API no funcionará. Por lo que es importante manejar esas excepciones de descodificación. Ahora la pregunta es, ¿cómo podemos manejar excepciones de descodificación en nuestra aplicación de nodo Porque estas excepciones o errores pueden ocurrir en cualquier lugar. ¿Cómo podemos manejarlo? Entonces para eso, tenemos que agregar oyente para nuestra aplicación de nodo. Déjame mostrarte. Entonces aquí después del Winston, escribimos proceso punto en Esto nos ayudará a agregar oyente para un evento específico. Ahora, en qué evento, queremos escuchar. Escribir, es excepción sin codificar. Asegúrate de escribir el mismo nombre del evento. De lo contrario, no va a funcionar. Ahora ¿qué queremos hacer cuando ocurra una excepción no codificada en nuestra aplicación Que añadimos la función de devolución y tiene error o excepción En la función callback, por ahora, simplemente consultamos un log de este objeto de error Este proceso dot on es como una persona de vigilancia. Está vigilando nuestra aplicación, y si en nuestra aplicación ocurre alguna excepción uncod, ocurre alguna excepción uncod, process dot on ejecutará esta función de devolución de llamada Entonces en el lugar de usar el registro de puntos de la consola, podemos usar el error de punto del registrador. Y en eso, tenemos que pasar primero la excepción de cadena no capturada, y luego pasamos todo el ciervo de error Comprobaremos que esto está funcionando o no. Guarda los cambios, y en el terminal, vamos a tamizar el terminal con el comando CLS, y luego ejecutamos nuestra aplicación usando node index dot js Ver, aquí obtenemos nuestro error en la consola y nuestra aplicación no está grasada por sí misma Pero como podemos ver, tampoco obtenemos la información del servidor que se ejecuta en el puerto 3,000, lo que significa que el servidor no se está ejecutando. Entonces nuestra aplicación está colgando en el medio. El servidor no se está ejecutando y la aplicación no está grassing. Por lo que nuestra aplicación no está en el estado estable. Entonces, lo que queremos hacer ahora tiene que salir de este estado inestable. Entonces después del error del punto del registrador, simplemente escribimos process dot exit, y aquí pasamos uno como código de salida. Uno significa error. Además, tenemos el código de salida cero, que significa que todo está bien, pero aún así queremos salir. Y si pasamos el código de salida uno, lo que significa que se produce algún error, y por eso salimos. Entonces los cambios, y vamos a ejecutar nuestra aplicación una vez más. Nodo, punto índice Js y C, ahora salimos con éxito de nuestra aplicación. Hermoso. Ahora bien, podrías hacer esta pregunta si después de manejar la excepción, aún estamos cerrando nuestra aplicación, entonces ¿cuál es el punto de manejar la excepción no capturada Por lo que manejar la excepción no capturada no se trata de evitar el set down. Se trata de asegurar que el set down ocurra de manera ordenada, segura e informativa Cuando ocurre una excepción no capturada, estado de nuestra aplicación es impredecible Después de un bloqueo no aceptado, posible que partes de nuestra aplicación no funcionen como queremos Por ejemplo, obtuvimos conexiones de base de datos rotas , memoria corrupta, solicitud incompleta, etcétera Reiniciar la aplicación garantiza que comienza de nuevo sin problemas sobrantes Además, en producción, herramientas como PM two, Docker o Kubernets monitorean nuestra app Cuando nuestra aplicación se apaga, estas herramientas reinician automáticamente nuestra aplicación. Manejar el error asegura la salida de la aplicación claramente mediante el uso de process dot exit V, y también facilita que la herramienta de monitoreo reinicie nuestra aplicación sin problemas pendientes. Además, una cosa que encuentro aquí es cuando estamos haciendo proceso de salida de punto, nuestros registros no se están almacenando en el archivo ni en la base de datos, pero se puede ver el registro en la consola. ¿Qué pasa aquí? Entonces, cuando procesamos la salida de punto, nuestra aplicación de nodo se termina de inmediato. No está esperando que se complete una tarea asíncrona como iniciar sesión en un archivo o una base de datos En palabras simples, proceso punto salida uno no espera a que estas operaciones terminen, por lo que la parte del registro se puede omitir parcial o completamente Ahora bien, ¿cómo podemos resolver este problema? Es realmente simple. Tiene que salir del proceso después de nuestro registrador complete su proceso de registro. Entonces después de este error de punto logger, escribimos logger dot on, y lo adivinaste correctamente, esto también es oyente de Winston Aquí, pasamos nuestro nombre de evento, que es finish, y en el segundo argumento, pasamos la función Callback, y en eso, podemos simplemente mover este proceso punto exit one Para una mejor práctica, también registramos punto. Guarda los cambios, y veamos que está funcionando o no. Ejecuta esta aplicación, y si revisamos nuestro archivo logger, vea, aquí obtenemos nuevo registro, por lo que está funcionando. 138. Rechazos de promesas no atendidas: Supongamos que en nuestra aplicación de nodo, tenemos alguna promesa que es rechazada y olvidamos manejar ese error usando try and cache Blog o método cache. Esa promesa rechazada necesita ser manejada. Entonces para demostrarlo, eliminamos esto por error y creamos aquí una nueva promesa. Digamos que la promesa rechazada de costo es igual a la nueva promesa. Como sabemos, aquí, tenemos que pasar la función callback con dos parámetros, disolver y rechazar Ahora para rechazar la promesa, simplemente llamamos aquí método de rechazo, y aquí creamos un nuevo mensaje de error y pasamos error. ¿Qué escribimos por error? Digamos error en la promesa. Perdón por este mensaje de error. Ahora vamos a consumir esta promesa. Rechazar un punto de promesa entonces y en esa función de error y simplemente consultamos dot log, promise está funcionando. Incluso se puede usar aquí OD, pero para eso, tenemos que envolverlo con una función de pecado. Por eso utilizo entonces método, y aquí no manejamos el error usando el método de caché. Ahora veamos qué va a pasar. Guarda los ings y ejecutemos nuestra aplicación con node index dot js. Aquí obtenemos log para este error, y como podemos ver no capturados nuevamente se llama a excepción En las versiones del nodo 15 y superiores a 15, rechazo de promesa no manejado se trata más como una excepción descarada. Si no manejamos el rechazo de la promesa, entonces puede fluir hacia el manejador de excepciones sin cortar Para almacenar por separado el rechazo UnhandlepMise, podemos duplicar este código y simplemente cambiar el evento También en el registrador, pasamos aquí mensaje de error como rechazo de promesa no manejado Vea los cambios y ejecutemos esta aplicación una vez más. Ver, ahora llegamos aquí mensaje de error, rechazo de promesa inmanejable Así es como podemos manejar excepciones no capturadas y rechazo UnhandlepMise y rechazo UnhandlepMise Ahora, en nuestra aplicación, cambiemos este registro de puntos de consola para la conexión Mongo Di B. ¿Qué escribimos aquí? Logger dot info. Y en el método cache, reemplazamos este registro de puntos de consola con error de punto logger. Y además, tras la falla de conexión, podemos salir de nuestra aplicación porque toda nuestra aplicación depende de esta conexión. Entonces envolvemos este código con llaves. Simplemente de los oyentes globales, copie este punto de registrador y punto de registrador, y péguelo aquí Dejará que nuestra aplicación almacene el registro en el archivo y la base de datos. Ahora, también, no necesitamos esta promesa de error y también este método entonces. Así es como manejamos los errores y los registramos para mejorar y mantener el seguimiento de nuestra aplicación. 139. Resumen del manejo y registro de errores: Recapitulemos rápidamente esta sección. Entonces, antes de esta sección en nuestra aplicación, no manejamos errores. Entonces primero, manejamos errores para los manejadores de rutas API. Cualquier error ocurre en el manejador de rutas, ese error se enviará al siguiente middleware por último Express, y después de todas las rutas en el archivo js de punto de índice, y después de todas las rutas en el archivo js de punto de índice, agregará middleware de error que maneja todos los Ahora, después de manejar errores, podemos almacenar esos errores en los archivos o en la base de datos. Entonces, para registrar los errores, utilizamos el paquete Winston y Winston Des Mongo DB Aquí, configuramos el registrador Winston en el que especificamos el formato de etiqueta de registro global de nuestro registro y algunos transportes para enviar nuestro registro a consola, archivo, e incluso en Mango Di Por estos, podemos almacenar errores de los manejadores de ruta. Pero, ¿y si algo sale mal fuera del expreso? Así que definimos dos oyentes globales, uno para excepciones no capturadas, y otro para rechazo no Recuerde, si no agregamos oyente para rechazo no manejado, por defecto, node tratará el rechazo por defecto, node tratará promesa como excepción no capturada Además, en estos oyentes globales, registramos los errores y luego establecemos con gracia Al final, este punto de registro dejará de escribir nuevos registros, terminará cualquier registro pendiente y cerrará flujos de transporte como flujos de archivos, SDDPRquest o conexiones de base de datos para el registrador terminará cualquier registro pendiente y cerrará flujos de transporte como flujos de archivos, y cerrará flujos de transporte como flujos de archivos, SDDPRquest o conexiones de base Eso es todo acerca de manejar y registrar errores. Ahora en la siguiente sección, agregaremos más funciones en nuestra aplicación de comercio electrónico. 140. Sección 12: creación de un modelo de carrito: Bienvenido a otra sección importante del curso definitivo No Jz En esta sección, avanzaremos en nuestro proyecto de comercio electrónico. Primero, agregaremos algunas funciones de la tarjeta, y luego integraremos pasarela de pago en nuestra aplicación, lo cual es realmente importante y divertido de crear. Estoy muy emocionada y espero que tú también. Entonces comencemos esta sección. Hasta ahora en nuestro proyecto, hemos agregado categorías de usuarios y productos API. Ahora, cuando el usuario quiera comprar algún producto, agregará su producto en la tarjeta. Así que la tarjeta funciona como canasta o carro en supermercado. Agregar todos los productos que queremos comprar, y luego pagamos por esos productos. Esto ya lo sabemos, ¿verdad? Por lo que crearemos un nuevo modelo para los datos CAT. Así que en la carpeta de modelos, creamos un nuevo archivo llamado cart dot js. Ahora para definir el esquema, primero Cost Mangoose es igual a requerir mangosta Y después de eso, definimos st esquema CAT es igual al nuevo esquema de punto mangosta Aquí agregamos nuestro esquema de tarjeta. En este modelo de tarjeta, almacenaremos todos los datos de la tarjeta de los usuarios. Así que antes que nada, necesitamos almacenar usuario a tipo de objeto a esquema de punto Mangoose tipos de punto punto punto ID de objeto, ref a usuario y simplemente hacemos que sea necesario para true Ahora después de usuario, queremos qué productos el usuario agregó en su tarjeta. Entonces agregamos productos llenos, y como sabemos en CAT, el usuario puede agregar múltiples productos. Por lo que será la matriz de productos. Ahora para cada producto, almacenamos productos objeto, y en ese objeto, almacenamos el primer ID del producto. Esto vuelve a ser referencia, así que simplemente copio este objeto de esquema para el usuario. Pégalo aquí para obtener el ID del producto y asegúrese de cambiar este usuario de referencia a producto. Ahora, después de la identificación del producto, necesitamos la cantidad de ese producto. Entonces agregamos cantidad al objeto, tipo, al número requerido a true porque eso es necesario. Hombre a, también podemos agregar default a uno por seguridad. Ahora bien, si imaginamos nuestro front-end, queremos mostrar datos como este. Primero, queremos mostrar el nombre o título del producto, luego el precio, luego la cantidad y el total. Si solo almacenamos el ID del producto en los datos de la tarjeta, entonces tenemos que ejecutar poblar para obtener detalles del producto como título, precio, imagen, etcétera, pero tomará más tiempo obtener los datos de la tarjeta Podemos utilizar aquí enfoque híbrido. Si tus necesidades de aplicación son diferentes, entonces tienes que apegarte al único enfoque de referencia. Entonces, si quieres rendimiento, entonces usas híbrido, y si quieres consistencia de los datos donde se titulan tus productos, imágenes de precios están cambiando más a menudo, entonces tienes que usar el enfoque de referencia. Entonces después de la cantidad, agregamos title, type to string, y required to true. Después de eso, necesitamos precio, tipo a número, requerido a true. Después del precio, es posible que necesitemos una imagen que será la imagen de portada del producto, tipo a cadena y requerida para true. Por fin, necesitamos precio total, que es el precio total de este producto actual, tipo a número y requerido a true. Este precio total, contaremos por precio en cantidad, ¿verdad? Esto es todo lo que necesitamos en el objeto productos. Ahora bien, ¿qué necesitamos más en el carrito? Volvamos a ver la página de GRT. En primer lugar, en cualquier sitio web de comercio electrónico, obtenemos la cantidad de productos en el Nepar o en algún lugar Y también para la página CRT, necesitamos mostrar el precio final del producto Entonces necesitamos dos campos más en nuestro esquema de tarjetas. Primero, el total de productos a escribir el número predeterminado es cero. Si en nuestra tarjeta, tenemos dos iPhones y tres relojes inteligentes, entonces nuestros productos totales serán cinco Y después de los productos totales, necesitamos el precio total de la tarjeta. Podemos asociar como precio final, pero el precio total de la tarjeta se ve más cool. Así que el precio total de la tarjeta, tipo a número, y también por defecto a cero. Ahora aquí podría preguntarse ¿por qué necesitamos almacenar el precio total de la tarjeta? ¿Por qué no podemos calcular los valores cuando enviamos datos de tarjetas? La razón por la que almacenamos el precio total de la tarjeta es porque, número uno, una visualización más rápida. Entonces, cuando el usuario ve su tarjeta, el sitio web puede mostrar el precio total al instante sin volver a calcularlo cada vez Esto ahorra tiempo, sobre todo si hay muchos productos en la tarjeta. Segundo, reducir el trabajo para el servidor. Esto se debe a que no necesitamos calcular el precio final varias veces en lugar Así que imagina que nuestro usuario tiene diez productos diferentes en su tarjeta. Sin el precio total de la tarjeta, nuestro servidor tiene que mirar a través los diez productos y sumar sus precios cada vez que abres la página de la tarjeta. Ahora con el precio total de la tarjeta, nuestro servidor solo obtiene el precio total ya en tienda Esto ahorrará tiempo y esfuerzos, y por eso almacenamos aquí precio total de la tarjeta en la base de datos. Ahora tenemos nuestro esquema de tarjetas listo. Si en el futuro, queremos agregar más campos o queremos eliminar algo, entonces también podemos hacer eso. No hay nada de malo en eso. Además, no te apegues a un enfoque. Como desarrollador, tenemos que pensar siempre qué hace que nuestra aplicación o producto sea más útil y rápido para los usuarios finales. Tan simple como eso. Ahora vamos a crear el modelo Cart, seconst card es igual al modelo de punto de mangos Primero, agregamos nombre singular, que es carrito y en segundo argumento, pasamos esquema de carrito. Por último, al final, vamos a hacer módulo dot exportaciones es igual a CAT. 141. Definición de la lista de API para el carrito: Ahora antes de comenzar a construir las APIs para tarjeta, veamos cuáles y cuántas APIs necesitamos crear. Esto nos dará claridad. Entonces aquí está mi proceso para definir la lista de API. Empecé a imaginar el front-end desde la perspectiva del usuario. En palabras sencillas, me pongo en el zapato de usuario normal, lo que el usuario quiere hacer con tarjeta. Primero, simplemente quieren agregar producto en la tarjeta. Entonces esta es nuestra primera API. Después de agregar el producto a la tarjeta, quieren ver su propio carrito, qué productos agregaron y cuánto dinero necesitan para comprar. Entonces necesitamos API para obtener el carrito de usuario actual. Además, en la barra Nuevo, les gusta ver la cantidad de productos disponibles en el carrito. Así podemos crear API separadas para solo números de tarjeta. Después de eso, en la página del carrito, pueden aumentar la cantidad de productos o disminuir la cantidad de los productos, y también pueden eliminar todos los productos de la tarjeta. Aquí necesitamos tres APIs más, una para aumento, segunda para disminución y última para el producto delete. Entonces aquí tenemos la lista de APIs para el carrito. Por supuesto, podemos agregar o eliminar APIs de esta lista. Realmente depende de nosotros. 142. Cómo agregar productos al carrito: Comencemos con nuestra primera API para CAT, que es agregar un solo producto en la tarjeta. Así que en la carpeta rutas, creamos un nuevo archivo llamado card dot js. Bueno. Ahora dentro de este archivo, creamos Router para API. Entonces Const Express es igual a requerir Express, y después de eso, costo Router es igual a express dot Router Y como sabemos, al final, el módulo de puertos punto es igual a Router. Ahora antes de definir la API, vamos a configurar este router en nuestro archivo index dot js. De lo contrario, nuestras API de carrito no funcionarán. Guarde este archivo, muévase al archivo js punto índice y simplemente aquí const rutas CAT es igual a requerir periodos rutas CART Asegúrate de escribir aquí, requieres no requerido. Hace poco, cometo este error. Ahora en la parte inferior, agregamos app dot g. aquí agregamos prefijo API slash CAT Aquí agregamos rutas de tarjetas. Encantadora. Ahora, comencemos con la API de cabeza a carrito. Entonces aquí agregamos Router. Y ¿me puede decir qué método vamos a utilizar? Correcto, usaremos el método post. Así router punto post endpoint es forward slas aquí después de eso, agregamos route callback con request and response Ahora bien, ¿qué queremos de la parte delantera? Principalmente necesitamos dos cosas. Primero, necesitamos el ID del producto que el usuario quiera agregar en la tarjeta. Y segundo, queremos saber la cantidad de su producto. A la vez, el usuario solo puede agregar un producto con su cantidad, y si quiere agregar otro producto, entonces tiene que llamar nuevamente a esta API. Tan simple como eso. Entonces primero, obtenemos detalles en el cuerpo del punto de solicitud. Podemos reestructurarlo aquí y obtener la identificación del producto y la cantidad También para más conveniente, obtenemos el ID del producto en el parámetro de consulta. Así que eliminamos estos de aquí y en el punto final, agregamos dos puntos ID de producto. Y para obtener este ID de producto, agregamos aquí costo ID de producto es igual a solicitar punto PRAM punto ID de producto Bueno. Ahora, después de eso, ¿qué queremos? Sí, también necesitamos ID de usuario. Y como podemos conseguir que si, podemos agregar orthomidalware aquí, y para obtener el usuario, podemos escribir const user id es igual a solicitar punto usuario punto subrayado ID a solicitar punto usuario punto Ahora, aquí viene una parte lógica lo que realmente queremos hacer en la API head to cart. En primer lugar, verificaremos identificación del producto frontal y centavo y la cantidad o no. Siempre comience con la validación. Agregamos si la identificación del producto de condición no está disponible, o la cantidad no está disponible, entonces devolvemos el error. Por lo tanto, devuelva la respuesta, el estado del punto, 400 para los campos faltantes y el objeto JSON de punto con propiedad Menset, faltando los rellenos requeridos Bueno. Ahora, después de eso, verificamos, front end pasar el ID de producto válido o no. ¿Hay algún producto con ese ID en nuestra base de datos? Para eso, escribimos costo, producto es igual a un peso producto punto encontrar Por ID, y aquí pasamos ID de producto. Además, si la entrada automática no funciona, entonces tenemos que ingresar manualmente este modelo de producto. Entonces para usar esperar, tenemos que hacer esta función asíncrona Ahora en la parte inferior, podemos poner aquí si condición, si el producto no está disponible, devolvemos respuesta que estado 404 punto Json. Y en la propiedad messet, pasamos producto no encontrado Ahora de nuevo, estoy preguntando qué queremos hacer en la API Agregar al carrito. Vayamos paso a paso. No te confundas. Nosotros queremos simplemente hacer una cosa. Creamos una nueva tarjeta para el usuario y simplemente agregamos el producto actual en la matriz de productos con los rellenos requeridos. Pero existe la posibilidad de que esa tarjeta de usuario ya esté disponible. Aquí, no queremos crear tarjetas duplicadas, así que comprobamos que la tarjeta const es igual a esperar tarjeta Ver trabajos de entrada automática, tarjeta punto Fine One. Y aquí en el objeto condición, pasamos usuario a ID de usuario. Ahora, como sabemos a la vez, un usuario solo tiene una tarjeta porque si el usuario revisa los productos después del pago con éxito, eliminaremos la tarjeta de usuario de la base de datos. Si este usuario tiene su tarjeta, entonces la obtenemos en la variable de tarjeta. ¿Y si el usuario no tiene carrito? Puede primero producto para tarjeta. Entonces verificamos estado. Si el carrito no está disponible, entonces ¿qué queremos hacer? Bien, crearemos una nueva tarjeta. Así que nueva tarjeta. Y aquí pasamos Object. Primero, agregamos usuario a ID de usuario, producto a matriz vacía por ahora. Total de productos a cero y precio total de la tarjeta a cero. Ahora, esto devolverá el carrito. Aquí podemos simplemente usar esta variable de tarjeta y reemplazar su valor porque si la tarjeta no está disponible, solo entonces crearemos un nuevo CAT. De lo contrario, obtenemos objeto de tarjeta en esta variable de tarjeta. Utilizamos aquí la tarjeta es igual a la nueva cesta. Entonces para reemplazar esta variable de tarjeta, tenemos que definirla usando let. De lo contrario, obtendremos error. ¿Tienes claro hasta este punto? Y además, si estás un poco confundido, entonces no te preocupes. Cuando completemos esta API, recapitularemos esta API desde cero. Por eso, toda tu confusión desaparecería. Entonces tenemos carrito y solo tenemos que empujar producto en la matriz de productos con cantidad y otros campos que definimos en el esquema. Así podemos hacer carrito punto productos dot push. Y aquí pasamos objeto producto, que queremos empujar. Entonces objeto, que son los campos, realmente me olvido. Déjame revisar el modelo CAT. Bien. Entonces primero, ID de producto a ID de producto, cantidad a cantidad. Después de eso, tenemos título. Ahora aquí, ¿cómo podemos obtener el título del producto? Porque el front-end solo pasará el ID del producto. Piénsalo. Por lo que obtenemos los detalles del producto de esta variable de producto. Consulta aquí también comprobamos que el producto es válido o no. Si el producto es válido, entonces obtenemos su detalle en la variable producto. Entonces ahora esto tiene sentido por qué encontramos producto. Validará el ID del producto, y también obtendremos otros detalles también. Así título al título del punto del producto. Precio a producto precio punto, que es el precio actual del producto, imagen, que es la imagen de portada, por lo que producto punto Imagen, que es matriz, y simplemente establecemos la primera imagen. Ahora podrías preguntar por qué no obtenemos estos detalles del front end. Imagina que obtenemos este detalle de precio desde el front end. Si sobrepasas el cero para cualquier producto, el precio se almacenará como cero para su auto Por lo que claramente no podemos confiar en los datos de front-end. Es mejor que obtengamos datos reales de la base de datos. Ahora, después de esa imagen, tenemos el precio total de ese producto, que es el precio actual en cantidad. Así que el precio del punto del producto en cantidad. Y eso es todo lo que necesitamos en la matriz de productos. Ahora tenemos que hacer sólo dos cosas. Tenemos que contar los productos totales de la tarjeta y luego el precio total de la tarjeta. Estos dos son muy sencillos. Y ¿sabes qué método usaremos para contar la suma? Bien, usaremos método reducido. Escribimos cart dot total products es igual a cart dot products, que es array dot reduce, como sabemos, tenemos que pasar dos argumentos en el método reducido. La primera es la función de devolución de llamada en la que calcularemos la cantidad de productos y luego valor predeterminado de la cantidad que es cero Ahora en la devolución de llamada, obtenemos dos parámetros, total y producto, que es un solo objeto de producto A partir de la devolución de llamada, simplemente devolvemos total más la cantidad de puntos del producto En definitiva, este método reducido ejecuta el bucle para cada producto y nos da la suma de la cantidad del producto. Genial. Ahora tenemos que simplemente calcular el precio total de la tarjeta y volveremos a utilizar el método reduce para eso. precio total de la tarjeta del punto de la tarjeta es igual al carrito de productos dot, dot reduce. Aquí nuevamente pasamos dos argumentos. primera es la función callbeck con función flecha de objeto total y producto Y después de eso, simplemente en valor por defecto de este total, que es cero. Lo que devolvemos de esta función de devolución de llamada. Simplemente devolvemos el total más el precio del punto del producto en la cantidad del producto. O por simplicidad, podemos devolver el total más el precio total, que calculamos aquí. Además, creo que no necesitamos este campo de precio total. En realidad no está haciendo impacto. ¿Qué opinas? Sí, así que vamos a eliminarlo del método push, y también tenemos que eliminar eso del esquema. Pasar al esquema del auto y eliminar este precio total llenado del objeto products. Tan simple como eso. Ahora tenemos todos los rellenos de tarjetas llenos de detalles, así que simplemente podemos guardar la tarjeta. Esperar tarjeta punto C. Después de guardar la tarjeta, simplemente devolvemos respuesta, estado de punto, 201 y 200 porque aquí podríamos crear una nueva tarjeta o simplemente agregar los productos. Además, punto Json objeto con mensaje, producto agregado a la tarjeta con éxito. Y después de eso, simplemente devolvemos carrito completo en la respuesta. Si no necesitas enviar, entonces puedes eliminar esto también. Ahora probemos esta implementación de API porque las pruebas son realmente importantes. Ver los cambios, y volvamos al cartero. Aquí en nuestro proyecto, creamos una nueva colección llamada CAT. Y en la colección CAT, creamos una nueva solicitud llamada productos ED a CAT. Primero, cambiamos el método para publicar APIURL al host local, Columna 3,000 API slash CART SLS y aquí tenemos que pasar el ID del producto, que queremos agregar en Por ahora, solo paso uno y envío la solicitud. Ver, aquí obtenemos token de autorización es obligatorio porque en nuestra API, agregamos orth middleware Vamos a generar token fresco, enviar la solicitud de inicio de sesión, y aquí obtenemos el token. Copia esto. Ahora en la API de la tarjeta, vamos a encabezados y agregamos aquí autorización en el valor, agregamos espacio de cerveza y pegamos nuestro token sin ningún código doble. Ahora envía la solicitud. Ver, aquí obtenemos error interno del servidor. Y si comprobamos nuestro terminal de código VS, aquí no podemos desestructurar propiedad, cantidad de solicitud cuerpo punto Esto sucede porque no pasamos cantidad en el cuerpo del punto de solicitud. Así que dirígete a Mongoi B Compass. En la colección de productos, simplemente copia este ID de iPhone 14 nuevo a Cartero aquí en el lugar de este, pegamos el ID del objeto Y en el cuerpo, déjame quitar estas dos propiedades. Ahora vemos crudo y simplemente pasamos tu objeto con una propiedad, que es cantidad a dos. Y enviemos esta solicitud. Ver, aquí obtenemos producto agregado a la tarjeta con éxito. Y aquí podemos ver tarjeta también. Permítanme aumentar esto. Ver, aquí conseguimos usuario, productos totales a dos porque pasamos cantidad a dos, precio total de la tarjeta a 2598, lo cual también es correcto También obtenemos aquí matriz de productos con todos los objetos de producto. Aquí podemos ver que obtenemos la cantidad actual, título, el precio y la imagen también. Ahora probemos algo más. Cambiemos la cantidad a uno y simplemente almacenemos el mismo producto. Ver, aquí conseguimos producto muerto con éxito, productos totales y precio total del carrito, ambos también son correctos. Pero si revisamos nuestra matriz de productos, vea, aquí obtenemos otro objeto de producto, incluso ese mismo producto ya está disponible en la matriz de productos. En nuestra API, tenemos un problema. Como podemos ver aquí, colocamos directamente el producto en la matriz de productos. ¿Y si este producto ya está disponible en la matriz de productos? En ese caso, solo tenemos que aumentar la cantidad de su producto. Entonces aquí, antes de que los productos de tarjeta dot push, tenemos que verificar los productos que estamos agregando ya están disponibles en la matriz de productos o no. Es realmente simple. Entonces para encontrar el producto, agregamos productos CRT dot, dot Find index Aquí, obtenemos un solo objeto de producto, función de flecha, y aquí pasamos la condición, producto, ID de producto punto, punto dos cadena es igual a ID de producto punto toString Ahora como sabemos, este método de índice fino devolverá el valor de índice de ese producto que pasó esta condición. Así que almacenamos eso en la variable llamada índice de producto existente. Y si el producto no se encuentra en la matriz de productos, entonces devuelve menos uno como índice. Entonces podemos usar eso en si condición. Así que el índice de producto existente no es igual a menos uno, lo que significa que el producto ya está disponible en la matriz de productos. En ese caso, solo aumentaremos la cantidad de ese producto, y ¿cómo podemos encontrar ese objeto de producto? Correcto, al usar este índice de productos existente, así que los productos de punto de carrito entre corchetes, agregamos el índice de productos existente. Por esto, obtenemos la cantidad de punto del objeto del producto. Más es igual a la cantidad actual. Eso es. Y si el producto no se encuentra en la matriz de productos, solo entonces empujamos todo el objeto de producto en la matriz. Entonces nos adherimos y movemos este método push en el blog s, y eso es todo. Ver los cambios. Y ahora, antes de la prueba final, eliminemos la tarjeta completa de la base y creemos una tarjeta nueva. Volver a Cartero, enviar la solicitud. Bonito, conseguimos un producto. Ahora cambiemos la cantidad a dos y simplemente enviemos la solicitud. Ver, ahora nuestra cantidad solo obtiene aumento, y además los productos totales y el precio total de la tarjeta es correcto. Ahora hay un pequeño tema en esta implementación. El producto podría tener suficiente stock o no. Tenemos que verificarlo antes de agregar producto a GAT. Entonces aquí, después de que conseguimos producto, pasamos condición como esta. I producto, punto stock menor que cantidad, luego simplemente devolvemos el estado del punto de respuesta, objeto Json de 400 puntos con propiedad de mensaje. El stock no es suficiente. Ahora aquí hay un caso más. Supongamos que nuestro stock de producto es cuatro y queremos agregar el producto en el carrito con la cantidad tres. Esto pasará esto si condición. Ahora bien, y si este producto, que es solo cuatro en stock, ya agregamos dos cantidad de producto anteriormente y ahora queremos agregar tres cantidades más para el mismo producto. En ese caso, tenemos que evitar que nuestra cantidad de producto aumente. Entonces dime donde escribimos nuestra condición. Escribir, en la condición de índice existente. Yo carro productos punto en corchete, productos existentes, índice de cantidad de punto más cantidad que queremos agregar es mayor o igual a producto punto stock. Si es cierto, entonces devolvemos la misma respuesta con el código de estado 400 y en el método Jasen, objeto con propiedad de mensaje, stock no es suficiente Y finalmente, hemos completado nuestra API cabeza a carrito. Así que recapitulemos rápidamente esta API. En primer lugar, comprobamos si el ID del producto es la cantidad se pasa por front end o no, cual podemos decirlo como validar entradas. Después de eso, verifique que el producto esté disponible en nuestra base de datos o no. Si no está disponible, entonces devolvemos error en la respuesta, producto no encontrado. Después de eso, verifique que el producto tenga stock o no. Si no tiene stock o menos stock que nuestra cantidad, entonces devolvemos respuesta con mensaje, stock no es suficiente. Después de eso, verifique que el usuario tenga tarjeta o no. Si no tiene carrito, solo entonces crearemos nuevo carrito. Después de eso, verificamos el producto que queremos agregar ya está disponible en el carrito o no. Si está disponible, entonces nuevamente verificamos el stock inal. Si también está disponible, entonces solo aumentamos la cantidad. Además, si el producto no está disponible, sólo entonces ponemos el objeto del producto con los detalles del producto. Y finalmente, contamos el total de productos y precio total del carrito utilizando método reducido y guardamos el carrito simple como eso. Así es como creamos API head to cart. 143. Cómo llegar al carrito del usuario: Ahora es tiempo de ejercicio. Quiero que crees una nueva API para obtener los datos actuales de la tarjeta del usuario de inicio de sesión. Es realmente simple. Sé que puedes hacer esto. Ahora, veamos la solución. Así router punto gt y punto hacia adelante slash. Después de eso, agregamos función de devolución de llamada asíncrona con solicitud y respuesta Ahora en la función de devolución de llamada, tarjeta const es igual a esperar tarjeta punto encontrar uno Aquí pasamos Object con usuario para solicitar punto usuario punto subrayado ID, y al final, simplemente respuesta dot json, esta tarjeta Además, para conseguir al usuario en la respuesta, tenemos que agregar middleware Orth Y eso es todo. Vamos a probar esta API, abrir cartero en la tarjeta, crear una nueva solicitud llamada Obtener la tarjeta de usuario URL a SDP, Columna doble diagonal hacia adelante, Host local, Columna 3,000 slash API slash CAT slash Y ahora aquí tenemos que pasar token. Así que ve a encabezados y aquí agregamos autorización. En el valor, pasamos espacio portador. Ahora ve a la API de inicio de sesión, envía la solicitud, consigue aquí el nuevo token, copia esto y simplemente en nuestra API, pegamos este token. Ahora vamos a enviar la solicitud. Ver, aquí obtenemos los datos de la tarjeta. Suena sencillo. Además, es posible que el usuario actual no tenga la tarjeta porque nunca tuvo ningún producto en la tarjeta. Si ese es el caso, entonces tenemos que devolver diferente respuesta. Escribimos si la tarjeta no está disponible, luego devolvemos el estado del punto de respuesta 404 no se encontraron el objeto dot Json con la propiedad del mensaje, tarjeta de usuario está vacía. Al final, si encontramos la tarjeta, entonces enviamos esa tarjeta tal como está. 144. Aumenta la cantidad de productos: Ahora, como sabemos, en la página de la tarjeta, podríamos necesitar aumentar y disminuir la cantidad del producto en uno. Así que definamos API para esta característica. Entonces Router dot, qué método usaremos. Entonces, como sabemos, en los datos de nuestra tarjeta, solo necesitamos actualizar una pequeña parte de los datos que son la cantidad, productos totales y el precio total de la tarjeta. Entonces para actualizar pocos datos, qué método usaremos, correcto, usaremos el método patch 0.2 aumentar y aquí necesitamos el producto que el usuario quiere aumentar la cantidad en el carrito. También agregaremos aquí ID de producto como parámetro de ruta, igual que antes. Además, necesitamos artículos ortomidales porque solo el usuario de inicio de sesión puede aumentar la cantidad en la tarjeta Después de eso, agregamos la función de devolución de llamada ACN con la función de flecha de solicitud y respuesta En primer lugar, obtenemos el ID del producto de la solicitud punto PRMs, ID del producto Ahora, vamos a llegar a la parte lógica de la consulta. Muchos alumnos me preguntan, ¿cómo puedo entender la lógica de la consulta o alguna característica? Déjame darte mi truco. Siempre que se quiera aplicar alguna lógica, entonces antes que nada, describa esa lógica en un lenguaje humano sencillo. Por ejemplo, aquí queremos encontrar la lógica de aumentar la cantidad en uno para este ID de producto dado. Simplemente significa que primero necesitamos encontrar la tarjeta de usuario actual porque queremos actualizar. Después de eso, encontraremos ese producto en la matriz de productos de tarjeta. Y luego después de que encontremos el producto, simplemente aumentamos el campo de cantidad del producto. También podemos incrementar los productos totales uno y aumentar el precio total de la tarjeta por el precio actual del producto. Por fin, simplemente guardamos esa tarjeta actualizada. Vea lo sencillo que se vuelve esto después de escribir los pasos lógicos. Primero, encontramos la tarjeta de usuario actual. Const cart es igual a un peso carrito punto Fino uno. En el objeto de comparación, agregamos usuario para solicitar punto usuario punto subrayado ID Ahora es posible que no encontremos la tarjeta, así que es mejor devolver respuesta con error. I carrito no está disponible, entonces devolvemos respuesta punto estado 404 punto JSON, Objeto con tarjeta de mensaje no encontrado. Bueno. Ahora pasemos al siguiente paso, que es encontrar el producto en la matriz de productos CAT. Ya lo hicimos en la API cabeza a carrito. Recuerda, sí, aquí usamos el método de índice fino. Escribimos productos de punto CAT punto índice fino. Aquí obtenemos un solo objeto de producto, función de flecha, y aquí devolvemos el estado, product dot product ID. Este es un ID de objeto, por lo que tenemos que convertirlo en cadena es igual al ID del producto, que obtenemos del parámetro de consulta. Esta expresión devolverá el índice del producto que queremos actualizar. Así que almacenamos eso en la variable llamada index. Ahora obtenemos el índice. A continuación, necesitamos incrementar la cantidad de ese producto índice. Así carrito de productos punto entre corchetes, pasamos índice punto cantidad plus es igual a uno. Esto significa aumentar uno en la cantidad actual. Después de eso, también aumentaremos el carrito dot total de productos, plus es igual a uno, y también card dot total card price, plus is equal to cart dot products in square bracket, index dot Price. Y al final, vamos a esperar tarjeta punto CV. Y por último, respuesta punto Json pasar Objeto con propiedad de mensaje, producto, cantidad incrementada con éxito. Además, enviamos la tarjeta solo para pruebas, y eso es todo. Vea lo simple y limpia que se ve nuestra API. Ahora probemos esta API, veamos los cambios, y abramos post Van. Aquí creamos un duplicado de este método de postal y rem su nombre para aumentar la cantidad de producto en uno. Ahora podemos agregarHecrt aumentar, reducir el ID del producto, que desea actualizar Además, aquí tenemos autorización de encabezado, y también cambiamos el método para parchear. Ahora simplemente enviemos la solicitud. Ver, aquí obtengo token no válido porque mi token se ha caducado. Así que ve a iniciar sesión API, generar un nuevo token. Bueno. Copia este token. Simplemente en el aumento API, paga el token en el encabezado. Ahora vamos a enviar esta solicitud. Mira, aquí recibimos mensaje de éxito, y anteriormente tenemos tres iPhones en nuestra tarjeta, y ahora tenemos cuatro, así que está funcionando Además, los productos totales y precio total de la tarjeta también están funcionando. Déjame hacerte una pregunta. ¿Qué pasa si pasamos el ID de productos, que no está disponible en la matriz de productos? Nosotros no manejamos eso. Entonces aquí, después de obtener el índice, pasamos la condición I índice es igual a menos uno, lo que significa que no podemos encontrar el índice en los productos de la tarjeta. Entonces devolvemos respuesta punto status 404 punto Json Object con mensaje producto no encontrado en Tarjeta. Vamos a probar esto. Entonces en el lugar de este ID de producto, solo pasamos uno y enviamos la solicitud. Ver, aquí obtenemos producto no encontrado en el carrito. Genial. Ahora, qué cosa puede salir mal en la API. Vamos a pensarlo. Cuando aumentamos la cantidad del producto, idealmente, ese producto debería estar en stock. Por ejemplo, si el iPhone 14 solo tiene seis en stock, y ya tenemos seis iPhones en el carrito e intentamos aumentar uno más iPhone 14 idealmente, podemos hacerlo No podemos aumentar la cantidad de iPhone a siete porque solo tenemos seis iPhones en stock También podemos poner una condición más antes de actualizar los datos de la tarjeta. Si productos de punto de tarjeta en paquete cuadrado, índice de cantidad de punto, igual a producto, stock de puntos. Después devolvemos respuesta punto estado, 400 punto JCN Object con mensaje, producto, agotado Gant aumentar producto Ahora la pregunta es, ¿cómo podemos obtener este producto en stock punto? Bien, necesitamos encontrar un producto de la colección de productos. En la parte superior, después de este ID de producto, podemos const producto es igual a en el punto del producto Fine By ID, y aquí pasamos el ID del producto Ahora bien, esto podría suceder este ID de producto no es válido, por lo que podemos poner aquí también condición. Ya lo hicimos en el post API. Ver aquí. Entonces copiemos esta condición y péguela en nuestra API de aumento. A en el comando antes del método find, verifique si el producto existe. Ahora, probemos esta implementación. Entonces ve a Cartero, envía la solicitud. Ver, ahora obtenemos error interno del servidor. Ahora seleccione el punto final y presione Control más D o Comando más D. Obteniendo el ID del producto original. Enviar la solicitud, C, aumento de cantidad en uno. Nuevamente, envíe la solicitud. C, obtenemos seis iPhone, nuestro stock es ocho, por lo que enviamos la solicitud dos veces más. Mira, ahora tenemos ocho iPhones y enviemos la solicitud una vez más Ver, aquí obtenemos error, producto agotado, no podemos aumentar producto en uno. Ahora nuestra API está funcionando bien. 145. Disminuye la cantidad de producto: Ahora definamos rápidamente una API o disminuyamos la cantidad de producto. También será lo mismo. Vamos a copiar esta API incrementada y pegarla en la parte inferior. Ahora, antes que nada, agregamos aquí comentario superior, disminuir la cantidad del producto. Además, aquí cambiamos el punto final para disminuir el ID del producto. Ahora vamos a revisar esta API paso a paso, así nos aseguramos de no olvidar nada. Primero, obtenemos el producto que también necesitamos. Después de eso, encontramos el carrito bueno. Después de eso, encontramos el índice, bueno ahora aquí hay una cosa para disminuir la cantidad del producto a uno, no necesitamos verificar el stock. Pero también, tenemos que revisar una cosa más. Si actualmente en nuestra tarjeta, solo tenemos una cantidad de producto e intentamos disminuir esa cantidad de producto a uno. En ese caso, tenemos que eliminar el objeto de producto completo de la matriz de productos. No te preocupes, escribiremos lógica para esto después de completar la actualización. Solo recuerda, estoy agregando aquí comentario, consulta condición para la cantidad uno. Después de eso, tenemos que disminuir la cantidad del producto a menos es igual a uno. También para el total de productos, menos es igual a uno, y aquí también, precio total del carrito menos es igual a, aquí menos el precio del total. Después guardamos una tarjeta y cambiamos este mensaje a disminución de la cantidad del producto con éxito. Ahora tenemos que hacer poco cambio en esta API. Pasemos a nuestro comentario. Aquí agregamos I condición, carrito punto productos, corchete, índice la cantidad es mayor que el bollo entonces disminuimos la cantidad en uno. Movemos esta línea en el bloque I y después de eso, lo contrario, tenemos que eliminar objeto de producto completo que está disponible en este índice. Para eliminar el elemento de la matriz en JavaScript, utilizamos el método Plis Así tarjeta punto productos punto índice Slic que es índice que queremos eliminar Y luego en el segundo argumento, pasamos uno, lo que significa que solo queremos eliminar un elemento. Mediante esta expresión, ese objeto de producto completo se eliminará de la matriz de productos. Ahora aquí hay una cosa. Después de eliminar todo el objeto del producto de la matriz de productos, no podemos tabla para menos este precio total de la tarjeta porque aquí necesitamos el precio del producto. Entonces tenemos que hacer algo así. precio total de la tarjeta menos es igual al precio del punto del producto. Este precio del producto lo obtendremos de la colección de productos. Entonces en la API incrementada, cambiamos esta tarjeta punto precio total de la tarjeta plus es igual al precio del punto del producto. Por lo que el precio original del producto se sumará en el total. Guarda los cambios, vamos a esta API. Duplicar esta API de producto incrementada y cambiar su nombre para disminuir A cambiar el punto final de la API a disminuir la tarjeta y enviar la solicitud. Ver, ahora solo tenemos siete iPhones. Vamos a disminuirlo dos veces más. Ver, ahora tenemos cinco iPhones y total de productos y precio también está funcionando Así es como disminuimos la cantidad del producto. 146. Eliminar un producto individual del carrito: Ahora en nuestra página de tarjeta, podríamos tener la opción de eliminar el producto completo de la tarjeta. No queremos disminuir la cantidad de producto uno por uno. Así que definamos API para eliminar el producto de la tarjeta. Entonces comenzamos con la página de punto del enrutador, punto final para cortar eliminar barra diagonal ID del producto de la columna Además, necesitamos los datos actuales del usuario, por lo que agregamos middleware Orth y luego una función de devolución de llamada con solicitud Ahora hay pasos muy similares a nuestra API de disminución. Veamos la API, qué necesitamos en el producto remove. Ver primero, necesitamos obtener un producto, luego carrito. Entonces también, necesitamos encontrar el índice del producto, y también necesitamos esta condición. Copia este código hasta aquí y pégalo en la API remove. Ahora volvemos a disminuir API, y como podemos ver para eliminar todo el producto, solo necesitamos esta línea. Copiamos esto y lo pegamos en nuestra API. Bueno. Ahora después de eso, tenemos que actualizar cart dot total products y cart dot total cart price. Vamos uno por uno. Carrito punto total productos menos es igual a, aquí necesitamos la cantidad de ese producto que tenemos en el objeto producto. Supongamos que tenemos siete productos totales y tenemos cuatro iPhones en la matriz de productos Ahora bien, si tratamos de eliminar los datos completos del teléfono del carrito, entonces para el total de productos, tenemos que menos siete menos cuatro es igual a tres. Así que tenemos que encontrar la cantidad que está disponible en la matriz de productos. Entonces antes de este método de empalme, podemos hacer algo como esto. El total del carrito de productos, menos es igual al carrito de productos punto. Aquí, accedemos a ese objeto de producto que queremos eliminar, corchete, índice, y luego agarramos la cantidad de ese producto. Lo adivinaste correctamente. Podemos hacer lo mismo para el punto CAT precio total CAT menos es igual a productos de punto de tarjeta, corchete cuadrado, cantidad de punto índice en carrito punto productos en corchete cuadrado, punto índice PCE La razón por la que eliminamos todo el objeto producto al final porque si eliminamos ese objeto antes, ¿cómo podemos acceder a la cantidad y precio del producto? Ahora, por fin, simplemente esperamos tarjeta punto C y después de eso, respuesta punto Json objeto con propiedad de mensaje a producto eliminado con éxito, y también enviar la tarjeta con él. Ahora antes de probar esta API, podemos agregar una condición más en esta API. Así que imagina que solo tenemos un producto en el carrito y también retiramos ese producto. Ahora, en lugar de almacenar la tarjeta en blanco en la base de datos, es mejor quitar esa tarjeta para ese usuario. usuario quiere agregar nuevo artículo en el carrito, luego en la API head to cart, ya ponemos código para crear el nuevo carrito. Podemos verificar si ese producto es el único producto o no en el carrito. Aquí, después de esta condición de índice, podemos agregar una condición más if. Aquí comprobamos si los productos del punto del carrito la longitud del punto es igual a uno, y los productos de punto CAT en corchete cuadrado, índice, ID del producto es igual al ID del producto, que obtenemos de las permanente. Si esta condición es cierta, entonces podemos eliminar el CAT completo. Así que espera CAT dot Fine By ID y DLT y passe GAT dot guión bajo Después volvemos, respuesta, asegúrate de agregar aquí devolución. De lo contrario, también se ejecutará el código inferior. Así que asegúrate de agregar aquí devolución. Respuesta punto Json objeto con propiedad de mensaje, carrito eliminado con éxito. Además, tienes que convertir esta tarjeta ID de producto, punto a cadena De lo contrario, nuestra condición no va a funcionar, y eso es todo. Degustemos nuestra implementación, veamos los cambios, y abramos cartero Duplica esta API de disminución, cambia su nombre para eliminar el producto del carrito. Bueno. Ahora vamos a enviar el punto final de la API para cortar el carrito eliminar el ID del producto, y enviar la solicitud Y debido a que solo tenemos un producto en nuestro carrito, obtenemos el carrito eliminado con éxito. Entonces como puedes ver, definir la API no es tan difícil. Simplemente da pasos uno por uno, y si te confundes, entonces escribe comentarios para cada paso que despejen muchas de tus dudas. 147. Crear modelo de pedidos: Ahora antes de agregar la pasarela de pago, vamos a crear una nueva colección de pedidos para almacenar la información sobre todos los pedidos y con su estado. Entonces en la carpeta models, creamos un nuevo archivo llamado orders dot js. Bueno. Ahora, antes que nada, importamos mangos const es igual a requerir de Después de eso, el esquema de orden de costo es igual al esquema de punto nu Mongoose Y aquí definimos nuestro esquema de cobranza. Esto ya lo sabemos, ¿verdad? Creamos esquema muchas veces. Ahora en la colección de pedidos, necesitamos todas las cosas que agregamos en la colección de tarjetas. Entonces copiamos el esquema completo del carrito. En el esquema de orden, pegamos nuestro esquema. Tenemos usuario que ordena productos, productos totales, y también precio total de la tarjeta. Ahora podría preguntarse ¿por qué necesitamos estos datos de todos los productos? Necesitamos estos datos de productos para almacenar el historial del pedido del usuario. Si el usuario quiere ver qué productos pidió anteriormente, tenemos que mostrarles esta lista de productos. Entonces tarjeta y orden son dos cosas separadas. En la colección de tarjetas, almacenamos todos los productos que el usuario quiera adquirir. Los productos de la tarjeta pueden agregarse, actualizarse o eliminarse. Pero una vez que el usuario realiza el pago y realiza el pago, los datos de la tarjeta se convierten en un pedido, y eliminamos esos datos de la tarjeta de la colección de tarjetas. En la recolección de pedidos, almacenamos datos permanentes para transacciones completadas. Y por eso, los usuarios pueden ver sus pedidos anteriores. Ahora en esta colección, tenemos que añadir algunos rellenos más. Primero, hacemos este precio total de la tarjeta al precio total. A continuación, necesitamos ID de pago, tipo cadena y requerido a true. Esta es la identificación del pago. Obtendremos esta identificación de la pasarela de pago. Y por esta identificación, podemos ver qué método de pago utiliza el usuario para el pago, UPI o tarjeta o banca neta o algo más A continuación, estado de pago a objeto, tipo a cadena requerida para true. Y en este estado, podemos mencionar pago pagado o llenado. A continuación, lo que queremos es dirección de envío, tipo a cadena, y requerido a true. medida que nos movemos esto por debajo del precio total por conveniencia. No importa. Ahora, después de eso, queremos estado de orden, escriba a cadena, y aquí podemos agregar posibles valores para este campo, que es enum a array El primer valor puede estar pendiente. A continuación, podemos tramitar a continuación, CB También se puede entregar o se puede cancelar por defecto, haremos nuestro estado de pedido a pendiente. Aquí no es estado de pago, es estado de pedido. Ahora a continuación, podemos almacenar la fecha en la que el usuario realiza este pedido, creado en el tipo de objeto a la fecha y el valor predeterminado a la fecha punto ahora. Como queremos fecha en la que se entrega este pedido, entregado en tipo de objeto a la fecha. Por ahora, estos campos son suficientes. Si en el futuro necesitamos más campos, entonces como sabemos, podemos agregar fácilmente rellenos en esta colección. Ahora vamos a crear colección. Por lo tanto, el orden de costo es igual al modelo de punto Mangosta. Aquí, pasamos nombre singular, que es orden, y aquí pasamos esquema de orden. Después de eso, por fin, vamos a módulo de exportaciones de punto es igual a la colección de pedidos, y eso es todo. 148. Flujo de trabajo de pagos: Anteriormente, hemos terminado agregar y actualizar las funciones de la tarjeta. Ahora, cuando nuestro usuario quiere comprar las cosas disponibles en la tarjeta, necesitamos integrar el pago en nuestra aplicación. Entonces, antes de sumergirse en el código, directamente, primero entendamos el flujo de trabajo completo del pago. Así que imagina que este es nuestro usuario, ve productos agregados a la tarjeta, y desde la página de la tarjeta, haz clic en el botón de pago o pago. paso número uno es, llamaremos a nuestra API de checkout en esta pulsación de botón, como sabemos, tenemos los datos de nuestra tarjeta en nuestra base de datos, por lo que obtenemos el monto total del precio de su tarjeta. También, podemos pasar en qué moneda quiere pagar. Ahora en el paso dos, los detalles, precio y moneda, enviaremos a Pasarela de Pago. Ahora paso número tres, Payment Gateway creará un formulario de pago y lo mostrará en su navegador o teléfono. Paso número cuatro, vea ingrese sus datos de pago como tarjeta o UPI o billetera vea quiera usar, vea ingrese esos datos en el formulario de pago y haga clic en pagar Recuerda, los datos de pago del usuario van a la pasarela de pago, no al back end, y por eso es seguro. Ahora paso, pasarela de pago, enviar los datos de pago al banco, banco validar los datos de pago. Si es cierto, el banco devolverá el éxito, y si es falso o nuestro usuario no tiene saldo suficiente o algo sale mal, banco devolverá fallará. Por lo que el banco enviará este estado de éxito o fracaso a Payment Gateway. Ahora paso número seis, pasarela de pago, enviar el estado de éxito o fracaso a nuestro back end. Si es un éxito, entonces realizaremos alguna tarea en el back end que queremos realizar como agregar datos de la tarjeta a la recolección de pedidos, establecer el estado de pago a pagado o cualquier cosa que queramos hacer. Ahora después de completar el proceso de todo en el paso siete, desde el back end, mostramos que el pago del usuario es exitoso o el pago se falla, así de simple como eso. Entonces, la pasarela de pago es como un intermediario que se encarga de los pagos seguros, de pago y transferencia directa de dinero a nuestra cuenta Ahora hay muchas pasarelas de pago disponibles como raya, papel, pago de maquinilla de afeitar y mucho más Pero estos tres son de arriba. Ahora bien, ¿cómo podemos decidir qué pasarela de pago queremos utilizar? Entonces, si estamos apuntando a la audiencia global, entonces stripe es una buena opción porque permite pagos internacionales, y también permite UPI Ahora, la gente también permite el pago internacional, y la gente también es una buena opción. Ahora bien, si nuestro negocio se basa en la India, entonces sorpay es lo mejor para nosotros. Resorpay también puede manejar pagos internacionales, pero solo es adecuado para negocios con sede en India transacción extranjera En palabras simples, en palabras simples, negocios están registrados en la India y también quieren obtener transacción extranjera. Para las empresas internacionales a nivel mundial, las pasarelas como rayas o papel podrían ser una mejor opción Entonces en este curso, les mostraré tanto reser p para negocios indios, y si su negocio está fuera de la India, entonces también le mostraré la integración en papel El motivo por el que no puedo mostrarte la raya porque para Demos, stripe no permite cuenta en algunos países, pero no importa qué pasarela de pago te muestre. Si entiendes la lógica de la pasarela de pago, entonces puedes aplicar cualquier pasarela de pago por tu cuenta. Y ese es mi enfoque principal. Entonces solo mira estas lecciones. Voy a aclarar la lógica detrás de la pasarela de pago. 149. Implementar la pasarela de pago Razorpay: Vamos a configurar resupe para nuestra aplicación de nodo Cardwig. Crearemos y probaremos pagos así. Será divertido. Además, si estás fuera de la India, entonces puedes saltarte esta lección porque solo puedes registrarte en resupe si estás en la India o tu negocio registrado en India Después de esta lección, aplicaremos el pago en papel en el que cualquier usuario del país puede crear una cuenta. Ahora veamos más o menos cómo funcionará este pago. Entonces, cuando el usuario hace clic en el botón PayNW, el front-end llamará a una API. Vamos a echarle un vistazo. En esa API, crearemos orden para AserPay dando alguna información sobre nuestro Como la cantidad que queremos cobrar del usuario y en qué moneda queremos recibir el pago. Ahora cuando RSR PE obtiene esta información, genera orden, que es el objeto de información con ID de objeto único Y luego tenemos que pasar este ID de objeto al front-end. Ese es el trabajo de la primera API. Ahora cuando front end obtiene el ID del objeto, front-end abrirá la ventana de pago sor P. Pase el ID del objeto y algunos detalles. Ahora podrías preguntar por qué necesitamos pasar el ID del objeto. Por este objeto ID solo reser PA obtiene la información sobre el pago También nos ayudará en la verificación de pagos y muchos más beneficios. Ahora el usuario ingresará los datos de pago y dará clic en pagar ahora. Si ese es un pago exitoso, entonces reer Pay genera una identificación de pago con firma única, y luego llamaremos a nuestra segunda API, que verificará nuestro pago En la segunda API, verificaremos el pago. Razón por la que necesitamos verificarlo porque esa API está llamando desde el front-end. Cualquiera puede manipular fácilmente esa información y hacer que el pago sea exitoso. Por lo que verificaremos el pago de una manera muy segura, que también implementaremos en esta lección. Solo después del proceso de verificación, si es exitoso, entonces crearemos un nuevo pedido en nuestra colección de pedidos, y luego eliminaremos esa tarjeta de usuario. Piense en sor pagar es como un mostrador de boletos de cine. Para API uno, vas al mostrador, que es pago de navaja, les dices qué película quieres ver diciéndoles cantidad y moneda, y luego te dan boleto, que es un ID de pedido único. Ahora, para API dos, después de mostrar el boleto a seguridad, ves la película, El contador verifica que el boleto se usó correctamente y actualiza los registros Entonces, para el pago de la maquinilla de afeitar en el backend, necesitamos crear dos APIs Primero, para crear orden de pago de maquinilla de afeitar, y la segunda API es para verificar el pago de razor pay. Si verificamos con éxito el pago, después de eso, en el último paso, crearemos un nuevo pedido en el cobro del pedido y retiraremos nuestra tarjeta. Ahora comencemos con la creación de la primera API, que es para crear ser pay order. En la carpeta de ruta, creará un nuevo archivo llamado orders dot gs. Ahora para agregar rápidamente el router, abrimos la tarjeta Route file, movemos esta línea del router en la parte superior, y copiamos estas dos primeras líneas. En nuestros pedidos dot archivo JS, lo pegamos aquí. Ahora en la parte inferior, tenemos que hacer puertos de punto del módulo es igual a Router. Ahora vamos a este router en el archivo JS punto índice. Entonces en la cima, const, orden, Rowe es igual a exigir Aquí vamos a la carpeta de rutas y pedidos. Y en la parte inferior, después de las rutas de la tarjeta, agregamos app.us slash API slash Ordenar y pasar aquí Ordenar y pasar aquí Bueno. Ahora podemos enfocarnos en construir APIs. Así router punto post, punto a barra de pago Además, necesitamos moth middleware porque queremos que solo los usuarios puedan iniciar sesión, y por fin acing callback función con solicitud Aquí en esta API, queremos crear ser pay order. Y para eso, necesitamos ser pay instancia. Entonces en la terminal, instalamos reser pay package, NPM install ser pay a la tasa, 2.9 0.5, que es la última versión mientras estoy grabando estas puntuaciones Bueno. Ahora en la parte superior, ingresamos costo ser P es igual a requerir ser P. ¿Me puedes decir por qué doy esta letra mayúscula? Correcto porque es clase. Ahora en nuestra API, creamos Cast reserp Instance is equal to New reserp inside this, necesitamos pasar objeto con dos propiedades ID de subrayado clave. Esta es la identificación clave de nuestra aplicación de pago de reser. En nuestra aplicación, almacenaremos esa clave en el archivo punto ENV porque necesitamos mantenerla privada Así proceso punto nv punto reser py subrayado clave subrayado No te preocupes, los definiremos en algún tiempo. Después de clave ID, necesitamos clave subrayado secreto para procesar punto nv punto ser pay, underscore, key, underscore Ahora, vamos a establecer estas dos variables en el archivo punto ENV. Sor pay, underscore, key, underscore ID es igual a dejarlo Y siguiente ReserPunerScore, clave, subrayado secreto. Los agregaremos cuando creamos la cuenta resorpay. Por ahora, completemos nuestra API de pago y después de eso, crearemos una cuenta de pago de reser Después de crear la instancia, podemos crear orden. Orden de costo es igual a esperar reserpy instancia órdenes punto punto Crear aquí tenemos que pasar opciones objeto para este pedido El primero es la cantidad. Digamos que pasaremos aquí 500. Después de eso, tenemos que pasar la propiedad de moneda. Esto especificará en qué moneda queremos proceder al pago. Supongamos que queremos hacer el pago en la rupia india, entonces pasamos aquí INR, y si queremos hacer el pago en el dólar estadounidense, entonces pasamos aquí USD. Pero asegúrese de que si usa la moneda de otro país, entonces el pago interno de sus cuentas de pago de reserva debería estar activo. Por ahora, simplemente pasamos INR. Y por último, tenemos que pasar Recibo único. Esto es como una etiqueta con el nombre para el pedido. No afecta el pago, sino que ayuda a desarrolladores o empresas a reconocer qué orden es cuál. Por ejemplo, si tenemos varios pedidos, podemos usar este ID de recibo para encontrar un pedido específico en el panel de RSR Pi o en nuestra base Por lo que pasamos aquí los backticks recibieron subrayado dólar Calibackets, fecha punto ahora para generar recibos únicos Esto generará orden para nosotros. Aquí simplemente devolvemos respuesta punto Json aquí pasamos objeto con pocas propiedades. Primero, el éxito a la verdad, lo que significa que creamos el orden con éxito. Segundo, ID de pedido para ordenar ID de punto. Siguiente cantidad a la cantidad del punto del pedido y moneda a la moneda del punto del pedido. Eso es todo para la primera API. Esta no es la API final, la mejoraremos más adelante. Ahora antes de ir a probar esta API, también vamos a crear una segunda API para que no te confundas cuando hacemos pruebas. Sé que tienes muchas preguntas, pero no te preocupes al final de esta lección, todo quedará claro. Después de esta API, creamos una nueva API post y punto a barra pago verificar también necesitamos os middleware para esta API y por fin, función ASN con Ahora en esta API, necesitamos tres cosas del cuerpo de la solicitud. El segundo objeto es igual a solicitar el cuerpo del punto. El primero es ser pay, orden de subrayado, ID de subrayado A continuación, ser pay, underscore payment, underscore ID y last ser pay underscore Con la ayuda de este ID de pedido e ID de pago, tenemos que crear un tipo de firma. Si esa firma y ser P subrayado la firma será igual cuando consideremos que nuestro pago está verificado. No te confundas. Es realmente simple. La firma generada por Secst es igual a aquí, tenemos que usar un módulo nodejs incorporado que En la parte superior, importamos const crypto es igual a cripto requerido En la parte inferior de nuestra segunda API crypto dot crear HMAC. Este es el método Nojs para crear tiene código de autenticación de mensaje base, HMAC Ahora en el primer parámetro, tenemos que escribir el algoritmo para crear el HMAC, que es un 256 de este tipo En el segundo parámetro, tenemos que pasar resorp secret Así proceso punto Env punto ResorpunderScore , K, subrayado Ahora, después de este método create HMAC, agregamos otro método llamado update Esto toma qué datos queremos tener. Aquí pasamos de vuelta ticks, dólar en paquetes de Cali, reser p guión bajo, orden, guión bajo ID Aquí agregamos símbolo de barra, dólar, paquetes Cully, sor pe, guión bajo, pago, guión bajo ID Después de eso, agregamos otro método punto digest y aquí pasamos X. Obtengo este código de la documentación reser P. Puedes leer la documentación para más detalles. Este código generará una firma. Ahora podemos compararlo con esta firma de subrayado reser He generado firma no es igual a ser pagar subrayado firma Si no son iguales, entonces aquí, devolvemos estado de punto de respuesta, 400 puntos GSN con Object, éxito a false y mensaje a firma de pago inválida Y después de eso, simplemente respons dot Json success to true y message to payment verify successfully Entonces si desde el front-end, alguien pasa el ID de pedido falso o el ID de pago, entonces por este proceso, podemos verificarlo. Si no se verifica el pago, entonces devolvemos respuesta con mensaje lleno. Y si se verifica, entonces devolvemos respuesta con mensaje de éxito. Entonces este no es un código completo. Lo actualizaremos después de la degustación. Ahora antes de probar esta API, necesitamos clave ID y clave secreta de reser pay Recuerda, dejamos variables vacías en el archivo dart NV. Vamos a crear una cuenta de ser pay y generar esta clave ID y clave secreta. Estos son muy similares al ID y la clave secreta que generamos al implementar la autenticación de Google y Facebook. Ir a la página web reserp.com. Y como puede ver aquí, solo tenemos la opción de India, Malasia y Singapur, lo que significa que solo estas empresas con sede en el país pueden establecer el pago de reser Pero también, podemos aceptar pagos desde cualquier país. Entonces glicon regístrate, ingresa tu dirección de correo electrónico. Después crea contraseña. Asegúrate de seguir estos patrones de contraseña y haz clic en Continuar. Esto enviará OTP al correo electrónico, así que rápidamente agrego la OTP aquí y doy clic en Verificar Ahora, aquí está la cosa. Seleccione el país, su negocio está incorporado, que es la India. Puede continuar, y ahora tenemos que seguir algunos pasos más. Obvio, estamos aceptando el pago. No es una configuración simple ya que estamos llamando a otra API de sitio web. Tenemos que proporcionar nuestros datos. Además, estas plataformas de pago pueden cambiar su interfaz muy a menudo. Entonces si en el futuro, no obtienes la misma interfaz como yo, entonces no te confundas. Simplemente proporcione los detalles que están pidiendo y cree una cuenta en el pago de reser Después de crear una cuenta, podemos crear ID de clave y secreto de clave. Aquí lo está pidiendo, ¿dónde le gustaría aceptar el pago? Por ahora, seleccione en línea y comience a embarcar. Ahora, siguiente, ¿desde dónde pagan tus clientes? Si tus clientes son de la India, entonces selecciona India. Pero aquí, selecciono fuera de la India y empiezo a abordar. Tomará algún tiempo Ahora escribimos nuestro nombre. Asegúrate de escribir tu nombre legal. Continuar. A continuación, verifica tus datos de contacto, escribe tu número de celular, y enviará ODP, escribirá ese ODP, y da clic en Continuar Ahora acepta pago aquí selecciono en mi página web. Si quieres para app o cualquier cosa, entonces también puedes seleccionarlos y continuar. Aquí, tenemos que agregar nuestro enlace a la página web. Además, ser pagar verificar este sitio web. ¿Es legal o no? Entonces si tienes tu sitio web, entonces agrégalo aquí. Por ahora, no tengo, así que da clic en agregar Carta y agrega Carta. Ahora selecciona tu tipo de negocio. Selecciono no registrado. Además, si seleccionas el tipo de negocio no registrado, entonces no puedes aceptar pagos internacionales en el modo en vivo Para eso, necesitas un negocio registrado. Actualmente, no tenemos ningún negocio registrado, pero si tienes entonces selecciona registrado. Además, no te preocupes por aceptar pagos internacionales. No necesitamos hacer algún trabajo extra. Solo necesitamos un negocio registrado, y Reserpy te permitirá aceptar pagos internacionales Ahora agrega tu número personal de Pan, que todos tenemos edita aquí y haz clic en Continuar. Aquí, me sale error a mi nombre, así que escribo mi nombre legal, que tengo en la tarjeta Pun y continúo Ahora sube tu tarjeta PN personal, selecciona, carga, selecciona tu documento y ábrelo. Tomará algún tiempo. Y continuar. Ahora nos están sugiriendo completar el QIC. Selecciona tu categoría de negocio, yo selecciono tu educación. Si tienes otra categoría, entonces selecciona de acuerdo a esa. A continuación, selecciona tu subcategoría, selecciona lo que quieras. A continuación, ¿cuál es su modelo de negocio? También, seleccione esto de acuerdo a sus necesidades y continúe. Después de eso, tenemos que agregar datos bancarios. Aquí, necesitamos el número de cuenta y el código IFSE de su sucursal de cuenta Ambos te metes en tu libreta. Asegúrate de escribir el número de cuenta en el que quieres aceptar el pago. Relleno estos datos y doy clic en Continuar. Se verificarán estos detalles. Y hecho. A continuación, tenemos que seleccionar el código de propósito. Permítanme tratar de continuar directamente. Está dando error. Tenemos que seleccionar el código de propósito. Podemos buscarlo por el grupo. Pero para probar, simplemente selecciono este p00 14 y continúo A continuación, ¿tienes un código importador exportador? No, no he aceptado los términos y doy clic en Continuar. Ahora es el momento de la política empresarial. Aquí piden muchas preguntas importantes como cancelación y tiempo de reembolso. Selecciono estos a siete días, puedes seleccionar de acuerdo a tus necesidades, tiempo de procesamiento de reembolso a tres a cinco días, lo cual es bueno, pero de nueve a 15 por seguridad. También, saltarse el tiempo, de ocho a 14 días. Ahora tenemos que proporcionar también el número de contacto de soporte. También trato de saltarme esto, pero está dando error. Entonces escribo mi número y también escribo mi dirección de correo electrónico y hago clic en Crear páginas de políticas. Aquí puedes ver las páginas, haz clic en Continuar. Aquí tenemos enlaces de políticas. Continuar. Envíe su solicitud. Aquí, trato de completar el proceso de video KYC, pero aquí me sale error, así que intento varias veces, pero no pasa nada Decido saltarme esto. Cierro todas las páginas e intento abrir serpy.com. E intenta iniciar sesión con la cuenta que acabo de crear, pero se está cargando y cargando. Así abre ventana de incógnito y openerp.com. Si te gusta el inicio de sesión, ingresa el correo electrónico, continúa e ingresa tu contraseña. Bueno. Aquí obtenemos el tablero de SRP Por ahora, estamos en el modo sabor. Podemos cambiarlo a partir de aquí, pero no lo cambies por ahora. Ahora para obtener la ApiKey, vamos a la opción de cuenta y configuración Y aquí, en la configuración del sitio web y aplicación, vamos por claves API y generamos clave Taste, nos enviará OTP, escribimos la OTP y simplemente damos clic en Ver, aquí obtenemos el ID de clave y el secreto clave. Ahora, primero, volvemos a copiar el ID de clave al código VS, y en el archivo ENV, pegamos el ID de clave para esta variable Nuevamente, copie el secreto clave y péguelo en la variable secreta de archivo ANV Guarde este archivo, y desde el sitio web, simplemente puede hacer clic en Descargar para copia de seguridad. Ahora, probemos nuestras dos APIs. Está funcionando o no. Entonces como sabemos, necesitamos front-end para probar estas APIs, porque en el front end, abriremos la página de RSRPEPayment Así que aquí creé una página SDML simple llamada RSRPFront end Obtendrás esta página debajo de esta lección, y también está disponible en la carpeta Recursos proyecto a carpeta. Descárgalo y simplemente dalo en tu proyecto actual. Ahora, vamos a ejecutar este archivo STML. Así que haga clic derecho sobre esto y haga clic en Copiar ruta. En nuestro navegador, el ritmo de este camino. Ver, aquí obtenemos el título y un simple botón. Si quieres ver qué pasó cuando hacemos clic en este botón, entonces puedes ver el archivo STML, es realmente sencillo Déjame mostrarte también, tenemos que cambiar algunos valores. Entonces aquí en la parte inferior, en la etiqueta script, agregué alguna variable que puedes pasar por tus datos. Primero, tenemos order endpoint, que es el punto final de nuestra primera API. Y segundo, tenemos punto final de verificación. Tienes diferentes puntos finales, luego puedes reemplazarlos de acuerdo a tu punto final A continuación, tenemos dirección de envío. Aquí puedes escribir tu dirección. Después de eso, moneda de usuario, que configuré en INR, pero también puedes pasar USD o Euro, etcétera, si tu ser pay tiene pago internacional on Después de eso, tenemos ID de clave SRP. Aquí, tienes que escribir tu identificación clave. Copio mi ID de clave del archivo ENV y lo pego aquí. Asegúrese de escribir su propia identificación de clave. De lo contrario, esto no funcionará. A continuación, tenemos togon. Aquí, tienes que pasar tu token JWT. Ahora, actualmente, en nuestra aplicación, establecemos solo 2 horas de caducidad, lo cual es poco molesto para la degustación. Porque tenemos que crear el token JWT una y otra vez. Para que podamos eliminar el vencimiento del inicio de sesión y simplemente agregar caducidad en la etapa final del proyecto. Abrir rutas de usuario, y en la parte inferior, eliminamos este objeto con propiedad caducada. Ahora vamos a generar token que nunca expiró. Abra Postman y abra la API de inicio de sesión y simplemente envíe la solicitud Aquí, copiamos este token y en el archivo SDML, simplemente lo pegamos aquí A continuación, agregué este evento on click para este botón de pago. En esto, antes que nada, llamamos a esta API de orden usando el método fetch y con este token Como sabemos por la API de pedidos, obtendremos los datos del pedido. Eso lo conseguimos aquí. Si los datos no tienen éxito, entonces mostramos alerta con mensaje de falla. Ahora bien, ¿y si obtenemos orden de pago de reser con éxito desde el back-end Entonces abriremos ventana de pago de resorb. Aquí, desde el front end, tenemos que pasar estas opciones con reserp Ver, aquí tenemos cantidad clave, moneda, nombre, ID de pedido, y por fin, tenemos manejador Este manejador es realmente importante, que es la función. RSR P ejecuta esta función de manejador cuando el usuario ingresa la información correcta y el pago gira Entonces después de un pago exitoso, llamamos a nuestra segunda API para verificar el pago. Si esa verificación es exitosa, entonces mostramos alerta de éxito, y si falla, entonces mostramos error de campo. Y por fin para abrir resorpe, creamos nueva instancia reserp y pasamos opciones enteras aquí Entonces simplemente usando reserp dot Open, abrimos la página ReserpPayment Por fin, tenemos este campo de punto de pago que se ejecutará cuando el usuario ingrese datos de pago incorrectos o si no tienen saldo suficiente, entonces esta función se ejecutará simple como esa. Ahora simplemente probemos nuestra implementación. Estoy muy entusiasmado con ello. Guarde este archivo y vuelva a nuestro navegador, actualice la página y simplemente haga clic en el botón Degustar pago. La cosa pasa, eso no es justo. Comprobemos qué pasa. Así que al inspeccionar usando F 12 aquí en la consola, podemos ver que obtenemos error, acceso a fechTo checkout API desde origin null ha sido bloqueado por la política del curso Este es un error muy popular para los desarrolladores de pila completa. Sucede porque por defecto, nuestra aplicación Express no puede aceptar llamadas API desde ningún origen. Tienes que habilitar el curso en nuestra app Express. Así que volvamos al código VS, abre una nueva terminal y escribe, NPM instala el curso y pulsa Enter Ahora en el archivo JS punto índice en la parte superior, importamos costo curso es igual a requerir curso. Entonces en la parte inferior, antes de este punto express JS y medio donde agregamos app dot Ug aquí llamamos a esta función de curso, y eso es todo. Guarde los cambios y asegúrese de que nuestro servidor esté funcionando. Bueno. Ahora actualiza la página y volvamos a hacer clic en el botón de pago. Ver, la ventana de pago RSR P está aquí. Aquí obtenemos este tipo de métodos de pago como tarjetas, banca neta, billetera, carta de factura, etcétera Creo que UPI no está aquí porque mi negocio no está verificado Ahora en el lado izquierdo, obtenemos el resumen de precios, que son cinco rupias en el back-end en la cantidad, pasamos 500 aquí estamos consiguiendo pi rupia. ¿Por qué? Entonces en la cantidad llenada, tenemos que pasar cantidad en la unidad más pequeña de la moneda. Y cuál es la unidad más pequeña de nuestro país PSA, que es 100 PSA es igual a una rupia. Y aquí pasamos 500 PSA, que convierte a Pi rupia. Entonces, si cambiamos esto a, digamos, 50,000, guarda los cambios y actualiza la página. Y si volvemos a hacer clic en el botón de pago, vea, aquí obtenemos 500 rupias. Así que asegúrate del monto del pago. Por eso creé esta plantilla de front end, para que puedas entender todo el proceso con mucha claridad. Además, en la parte superior derecha, podemos ver que estamos en el modo degustación porque creamos clave ID y clave secreta para el modo degustación. Ahora, probemos el pago. Entonces para probar el pago, primero, vamos a las tarjetas. Aquí, para fines de degustación, ser pay proporciona algunos detalles de la tarjeta. Además, proporcionaron detalles completos sobre la documentación. Te daré este enlace de página en el lado derecho a continuación de esta lección. Entonces aquí vamos a las tarjetas. Probemos la tarjeta india, copiemos este número de tarjeta, y en nuestra página, péguela aquí. Ahora pasa aquí cualquier fecha futura de caducidad, como 12 barra 30 y número CVV, pasemos 111, hagamos el pago, asegure la tarjeta, tal vez Es el procesamiento y qué escenario primero queremos probar, el éxito o el fracaso, vamos por el fracaso. Se está cargando. Y ver, el pago falló, y también obtenemos Alert pago fallido. Ahora probemos el éxito. Nuevamente, en ese número de tarjeta, vea que se está cargando, seleccione éxito. Y aquí conseguimos esta hermosa animación, y luego conseguimos el pago exitoso. Y además, obtenemos aquí el pago verificado con éxito, que obtenemos de nuestra segunda API. Entonces nuestra API ambas está funcionando bien. Si quieres probar otro método de pago, entonces también puedes hacerlo. Simplemente revise la documentación para ese método de prueba. Ahora actualicemos nuestra API para un uso real. Entonces como sabemos, nuestro pago está funcionando. Ahora podemos mejorar nuestras APIs y hacerla realista. Es realmente simple. Déjame mostrarte. Entonces, ¿qué quieres cambiar en la API de pedidos? Número uno, actualmente estamos pasando cantidad estática aquí, pero eso no es correcto. Tenemos que pasar el precio total de la tarjeta del usuario. Segundo, también estamos pasando tu moneda IR pero el usuario puede decidir en qué moneda quiere pagar. Por lo que queremos hacer estos dos cambios solamente. Empecemos por obtener el monto de la tarjeta. Entonces antes de esta instancia reser, escribimos const, cart y esperamos cart C, autoiput Entonces en la parte superior, costo, carrito es igual a requerir vamos una carpeta arriba modelos y en ese carro. Ahora en nuestro carrito API punto Fino uno, y aquí en el objeto, pasamos usuario a solicitar punto usuario punto subrayado ID Ahora, esto va a devolver carrito Objeto, pero tenemos que pasar condición si CAT no está disponible o CAT punto productos punto Longitud es igual a cero, entonces devolvemos respuesta con estado 404 punto JCN mensaje a CRT no encontrado Ahora en el lugar de esta cantidad, tenemos que pasar el precio total del CRT del carrito punto a cien porque tenemos que pasar cantidad en la unidad más pequeña de la moneda Degustemos esto, guardemos los cambios y actualicemos la página y hagamos clic en Taste Payment. Si revisamos la consola, vea, aquí obtenemos el error. Es el error 404, lo que significa que no se encuentra la tarjeta. Oh, recuerda, en la lección de quitar carrito, eliminamos el carrito eliminando el último producto de la matriz de productos, así que tenemos que agregar un producto en nuestro carrito, ir a Cartero, abrir en al carrito API Aquí tenemos que actualizar Togan, copiarlo desde la API de inicio de sesión, y pegarlo en el encabezado de autorización Bueno. Ahora envía la solicitud, producto agregado. Es iPhone, bonito. Ahora vuelve al navegador y actualiza la página, y otra vez, prueba el pago. Ver, aquí obtenemos nuestro precio de tarjeta. Ahora, como sabemos, en base de datos, almacenamos el precio de todos los productos en valor en dólares estadounidenses, y por eso estamos obteniendo dos iPhones en este precio Pero si estás usando el pago por maquinilla de afeitar, tu negocio estará en la India y lo más probable es que tus usuarios objetivo también sean indios. Entonces en ese caso, en la base de datos, hay que almacenar el precio en la moneda india. Ahora, supongamos que quieres apuntar a audiencia global y almacenar el precio en el dólar estadounidense. En ese caso, hay que convertir ese precio del dólar a moneda india y luego pasarlo en la cantidad déjame mostrarte cómo podemos hacerlo. Entonces, para convertir el valor del dólar en la moneda india, necesitamos el tipo de cambio actual. No podemos confiar en el tipo de cambio estático. Entonces llamaremos a una API para obtener el tipo de cambio exacto. Así que dirígete a novio y busca tipo de cambio api.com. Esta es la API de tipo de cambio popular. Ahora para obtener el tipo de cambio, necesitamos la clave API para eso. Entonces aquí ingresamos nuestro correo electrónico y simplemente damos clic en GetVree Key Aquí, tenemos que crear contraseña, aceptar términos y generar ApiKey. ¿Qué es esto? Completa la verificación, y luego te enviarán la clave de activación de API en tu correo electrónico. Abre ese enlace, y aquí obtenemos la clave API. Podemos ver que podemos enviar 1,500 solicitudes de cambio. Si quieres obtener más solicitud, entonces tienes que pagar por eso. Cómo funcionan todas las API de tipo de cambio. Por ahora, no te preocupes por eso. Simplemente copie esta clave y en nuestro archivo ENV, agregamos la API de puntaje de tipo de cambio, clave de subrayado es igual a pegar su clave API aquí Guarde este archivo y vuelva a la página de tipos de cambio. Aquí, tenemos que encontrar la API, ir a la descripción general de Doc's. Aquí tenemos APIs, una para obtener todo el tipo de cambio, y otra para obtener el par. Vamos a conversación de pareja. Aquí, obtenemos la API, así que copia esto, y en nuestra API, vamos a crear una función separada para obtener el tipo de cambio. Entonces Const, el tipo de cambio de reloj es igual a la función de flecha. Ahora en esta función, llamaremos a ese tipo de cambio API. Entonces la respuesta const es igual a wedge, y aquí en los backticks, simplemente pasamos el IIURL Ahora tenemos que cambiar un par de cosas. Aquí en el lugar de su APIE, tenemos que escribir corchetes de dólar Cully, procesar punto nw dot Exchange, tasa de subrayado, subrayado clave de subrayado API Asegúrese de escribir el nombre de variable ENV correcto. Ahora por fin, tenemos dos divisas. primera es la moneda base, que es la moneda en que agregamos el precio en nuestra base de datos, y la segunda es la moneda de destino en la que queremos convertir. Entonces nuestra moneda base es el USD porque en la base de datos, agregamos el precio de los productos en USD y queremos convertir esa moneda en INR. Entonces nuestra moneda objetivo es INR. También en el lugar de pasar valor estático de la moneda objetivo, podemos hacerla variable. Entonces en el parámetro, obtenemos moneda objetivo y pasamos ese dólar calibrar la moneda objetivo Ahora, como sabemos, la búsqueda de API es una tarea runosa asíncrona. Tenemos que esperar aquí la respuesta. Y para usar esperar, tenemos que hacer esta función asíncrona. Luly Ahora esta respuesta devolverá datos como estos. Aquí necesitamos esta tasa de conversación. Después de obtener la respuesta, tenemos que convertir esos datos en JSON. Los datos de costo son iguales a esperar respuesta punto JSON. Ahora a partir de esta función, podemos simplemente devolver datos punto conversación subrayado tasa Bueno. Ahora en nuestro OrderYPI simplemente contamos aquí cantidad, recuento de cambio, tasa de subrayado es igual al peso, parche, tipo de cambio, función, y como argumento, pasamos nuestra moneda objetivo, que Ahora después de obtener el tipo de cambio, creamos el monto const es igual al precio total de la tarjeta de punto de la tarjeta en el tipo de subrayado de cambio, y tenemos que redondear este Así que envuelva esta expresión con paréntesis y simplemente agregue punto a fijo y pase aquí dos Ahora en la cantidad, pasamos cantidad a 100. Ahora vamos a revisar esta implementación. Guarde este archivo de nuevo en el navegador, actualice la página y haga clic en Degustar el pago. Ver, ahora obtenemos el valor en la moneda india. Genial. Ahora, supongamos que queremos que nuestro usuario pueda pasar el valor objetivo. Entonces obtenemos el valor objetivo del usuario en el cuerpo del punto de solicitud. El objeto Secst es igual a solicitar el cuerpo del punto, y aquí obtenemos la moneda Y para el valor predeterminado, pasamos aquí nuestra moneda de base de datos, que es USD. Ahora en el lugar de esta moneda objetivo codificada, pasamos nuestra variable de moneda, que nuestro usuario pasa en el cuerpo del punto de solicitud. Además, aquí está la única cosa. Si nuestra moneda base y la divisa objetivo son las mismas, entonces no necesitamos obtener el tipo de cambio, ¿verdad Entonces hagamos modificación en nuestro código. Antes de este tipo de cambio, pasamos I condición moneda es igual al USD, que es nuestro valor de precio en la base de datos. Si ambos son iguales, entonces tenemos que hacer cantidad es igual al precio total de la tarjeta punto de la tarjeta. De lo contrario podemos calcular cantidad así. Entonces simplemente movemos estas dos líneas aquí, quitamos esta const, y en la parte superior, definimos let cantidad es igual a cero Por lo que reemplazamos este valor de cantidad acuerdo a nuestra condición. Y también en las opciones de pedido, tenemos que pasar esta moneda, guardar las chinges y probemos nuestra implementación Refiéranos la página, da click en probar pago ver, aquí obtenemos INR porque desde front end, estamos enviando moneda como INR. Si quieres cambiar eso, entonces abre stmlFle scroll a Aquí, en moneda de usuario, pasamos CAD por dólar canadiense. Guarde este archivo, actualice la página y envíe la solicitud. Consulta aquí obtenemos valor en el dólar canadiense. Además, si no pasamos su campo de moneda en la llamada EPI, guarde esto, actualice la página y envíe nuevamente la solicitud Ver, por defecto, alcanza su pico en USD. Genial. Además, si su cuenta de pago de maquinilla de afeitar no tiene función de pago internacional, entonces no puede realizar pagos internacionales. Es la política del ser pay. Si desea verificar la función de pago internacional de su cuenta, luego vaya a sus cuentas y opción de configuración de su cuenta de ser Bay. Asegúrate de estar en el modo en vivo. Aquí, no puedo pasar al modo e porque esta cuenta no está verificada. Si puedes ir en modo vivo, entonces ve a los pagos internacionales en el blog de pagos. Que puedas ver que tu función de pago internacional está activada o no. Actualmente, estamos en el modo de prueba y también testará campo en nuestro pago internacional. Así que mejoramos nuestra primera API. Ahora pasemos al segundo. Ahora vamos a mejorar nuestra segunda API. No te preocupes en que no tenemos que hacer mucha cosa. Simplemente crearemos nuevos datos de pedido en la base de datos y eliminaremos la tarjeta de usuario si el pago es exitoso. Si no se verifica el pago, entonces estamos ejecutando este bloque de código. Yo pago es exitoso, entonces podemos escribir código aquí antes de que devolvamos respuesta de éxito. Aquí creamos costo, nuevo orden es igual a nuevo orden. Asegúrese de que ingresamos este modelo de pedido. Entonces en la parte superior, el orden de costo es igual a requerir que vayamos uno más completo hasta modelos y en esos pedidos Bueno. Ahora en la parte inferior, tenemos que pasar nuevo objeto de orden aquí. En primer lugar, en este orden, agregamos usuario para solicitar punto usuario punto subrayado ID Después de eso, necesitamos productos, y en eso, almacenaremos todos los productos que ordenemos, ¿cómo podemos obtener esta información? Bien, podemos conseguirlo desde la parte de atrás. Antes de este pedido, encontramos costo, carrito es igual a ocho carrito punto Fino Vn. Aquí en el objeto, pasamos condición usuario para solicitar punto usuario punto guión bajo ID Simplemente en los productos del pedido, pasamos los productos a los productos CAT dot. Siguiente, productos totales a CRT Total Products. A continuación, tenemos precio total a CRT Precio total CRT. A continuación, tenemos la dirección de envío, que tenemos que obtener del front end. Por ahora, déjalo como está. A continuación, agregamos estado de pago a pagado, ID de pago para reservar pago, guión bajo, pago, ID de guión bajo Y como información extra, podemos almacenar RESERPEOder ID, para reservar guión bajo, ordenar ID de guión bajo Pero tenemos que agregar este campo en nuestro esquema de pedidos. Después de este campo, agregamos el ID de ReserpeOder a la cadena. Y eso es todo. Pasamos toda la información que necesitábamos. Ahora podemos almacenar este nuevo pedido, así que aguardan nuevo pedido punto CV. Y después de guardar el nuevo pedido, podemos eliminar nuestra tarjeta de la base de datos. Así que espera tarjeta punto deleteB aquí ya tenemos tarjeta. Es por eso que utilizamos directamente card dot delete one. Si no llegamos aquí tarjeta, entonces tenemos que usar CRT dot Fine one y eliminar método así, y eso es todo Ahora solo tenemos que pasar dirección de envío en la propiedad del pedido. Entonces dime de donde sacamos la dirección de envío. Bien, lo conseguimos de la parte delantera. En el cuerpo de solicitud de verificación de pago, podemos obtener la dirección de envío porque desde el front-end, ya pasamos la dirección de envío. Ver aquí paso la dirección de envío. Ahora déjame darte una situación. Imagina que el usuario olvidó pasar la dirección de envío. Ahora bien, ¿cómo podemos entregar el producto a ese usuario? Tenemos que asegurarnos de que el usuario pase esta dirección de envío. Entonces aquí podemos escribir si la dirección de envío no está disponible, luego devolvemos respuesta con el Código de Estado 400 para solicitud de apuesta, y en el objeto JSON, pasamos mensaje para por favor proporcione su dirección de entrega. Ahora aquí hay una cosa más. Sabemos que esta API de verificación de pago se ejecutará después de que se realice el pago. No podemos decir ahora usuario, no proporcionan dirección de sorbo, así que podemos hacer una cosa más Simplemente podemos poner esta condición al comienzo de nuestra primera API. Y aquí obtenemos dirección de zipping del cuerpo del punto de solicitud Por lo tanto, nuestro front-end necesita pasar dirección de Zipping en estas dos API Además, en nuestros datos de pedido, establecemos la dirección de zipping a la dirección de sorbo, y eso es todo. Aquí, nuestra parte de implementación ha terminado. Veamos que estamos pasando dirección de zipping en ambas API o no Entonces en el archivo de plantilla ser P, podemos ver aquí en la segunda API, estamos pasando dirección de zipping como dirección de zipping, y también en nuestra primera API, también estamos pasando dirección de 150. Pago internacional con Paypal: Veamos cómo podemos implementar pasarela de pago internacional en nuestra aplicación de nodo. Entonces como sabemos, para el pago global, tenemos dos opciones muy populares. Tenemos raya y tenemos papel. En esta lección, implementaremos papel como este. Lo implementaremos en nuestro back end, lo probaremos con el front end, y también aquí podemos ver los pagos de sabor. Entonces será divertido. Este video es para cualquier gente del país. Empecemos con esto. Además, actualmente, stripe es única opción de solicitar para mi país, por lo que puedo mostrarles la demostración de Stripe. Si en el futuro, lo permiten, entonces voy a crear lección sobre eso también. Ahora entendamos el flujo de trabajo de la pasarela de pago Paper. Entonces, cuando el usuario haga clic en el botón Checkout , crearemos una API , digamos, crear orden. API creará orden para el pago en papel con algunos detalles como la cantidad que queremos recibir pagar, en qué moneda queremos que el usuario pague USD o Euro. Recuerda, este pedido es un pedido en papel, no nuestra colección de pedidos. Ahora, esta API generará ID de pedido usando papel y simplemente devolverá ese ID de pedido al front-end. Al usar ese ID de pedido, papel abrirá la página de pago donde el usuario puede ingresar detalles sobre el pago. Ahora, después de que el usuario ingrese los datos de pago, llamaremos a otra API para capturar ese pago. Básicamente, mediante esta API, permitiremos a los usuarios el pago, agregaremos en nuestra cuenta comercial en papel, y luego creamos los datos del pedido, y después del pago exitoso, creamos los datos del pedido y confirmamos el pedido del usuario. Entonces, para implementar el pago en papel, tenemos que crear dos APIs en nuestro revés de nodejs Primero para crear orden, y el segundo es para capturar el pago en nuestra cuenta. Sé que tienes muchas preguntas, pero no te preocupes. Después de completar esta lección, comprenderá mejor todo el flujo de trabajo. Así que vamos a crear estas dos APIs. Además, si implementas pasarela de pago SRP de la lección anterior, entonces tienes que repetir pequeñas cosas como eliminar la caducidad del token, etcétera Tengo que repetir para que todos nos pongamos en una página. Perdón por eso. Espero que lo entiendas. Ahora en la carpeta rutas, tienes que crear un nuevo archivo llamado orders dot js. He creado este archivo con dos APIs porque en la lección anterior, muestro la integración SRP, pero esas dos APIs separadas de esta integración de pago Eso se puede ignorar totalmente. Ahora para agregar rápidamente la ruta, simplemente puede copiar las dos primeras líneas de código de las rutas de la tarjeta y pegarla en el archivo de ruta de Pedidos. Al final, hay que hacer módulo punto Xbards es igual a Además, hay que agregar este enrutador en el archivo index dot js, por lo que Const Order routes es igual a requerir carpeta Got routes y Orders En la parte inferior, después de las rutas de la tarjeta, puedes agregar app.us slash API slash Order y pasar Order Ahora puedes enfocarte en construir APIs. Así que en nuestro archivo, router punto post y punto para cortar La gente barra Crear orden Aquí también necesitamos middleware Os porque queremos que solo los usuarios conectados puedan acceder a esta API También asegúrese de ingresar Osmddleware en la parte superior y después de eso, está en devolución de llamada Ahora en esta función, sabemos que queremos crear Pedido de papel. Para eso, primero, tenemos que configurar P. En la carpeta de configuración, tenemos que crear un nuevo archivo llamado paper dot js. En primer lugar, definiremos variable para algunos detalles. Entonces el papel const es igual a objeto. En primer lugar, el ID de cliente, que es nuestro ID de cliente de aplicación, luego el secreto del cliente, que es la clave secreta de nuestra aplicación en papel, y por fin, también necesitamos URL base. Esta es la URL base de la API en papel. Todos estos detalles los almacenaremos en el archivo NNV porque por razones de seguridad Así que aquí pasamos proceso punto w punto papel, subrayado cliente subrayado ID Y en la segunda propiedad, escribimos process.nw punto papel, subrayado secreto Y por fin, escribimos proceso punto E y papel, , base, subrayado URL Ahora, vamos a establecer estas tres variables en el archivo ENV. Entonces PPL subrayado cliente subrayado ID es igual a dejarlo en blanco, y siguiente, subrayado papel, secreto es igual a, secreto es igual a La URL del guión bajo de la base del guión bajo en papel es igual a. Los agregaremos cuando registremos la cuenta comercial en papel. ¿Bien? Por ahora, déjalo como está. Ahora en papel cuando queremos crear un pedido en papel o queremos capturar el pago en bootstep necesitamos crear un token único como JWT Entonces, para generar ese token, podemos crear una función para eso. Const G Xs token es igual a la función de flecha. Ahora para generar el token, usaremos API de personas oficiales. Entonces para llamar a API usaremos AXOS. Axios es el paquete para llamar a API en JavaScript. Es mucho más fácil que usar el método fetch. Terminal de pluma, NPM, instalar Axios. Bueno. Ahora para usar este paquete Axios en la parte superior, importamos costo Axios es igual a requerir Ahora, en nuestra Puerta ases para confundir, esperamos axios punto aquí, tenemos que agregar el método SDDP, que Y en este método, en la primera posición, añadir punto final API en backticks, dólar Cali Brackets, punto BRL V uno, O oth, dos, slash token Ahora en el segundo lugar, que es el cuerpo, tenemos que pasar códigos dobles. Conceder, el tipo de subrayado es igual a las credenciales de subrayado del cliente Y en el tercer lugar, pasamos Configure Object. Primero, Oh, para objetar, usa un nombre P punto ID de cliente. Y a continuación tenemos contraseña al secreto del cliente ppt. Ahora después de Oath, agregamos encabezados al objeto en códigos dobles tipo de contenido, dos en códigos dobles, dos en códigos dobles, aplicaciones codificadas por URL xWWWfm Y eso es todo para esta API. Esta API generará un exceso de token para nosotros, por lo que almacenamos eso en respuesta variable. Y luego simplemente devolvemos respuesta, punto de datos punto Xs y como token de código. Ahora por usar esperar, hacemos esta función asíncrona y también tal vez este código nos pueda dar error. Así que es mejor envolver este código en try and cache block. Así que un bloque try and catch y mueve este código en el blog Try. Y en la caché, nos consola dot log, error en la obtención de token de acceso Y escribimos este mensaje de punto de error. Simplemente al final, hacemos módulo de exportaciones de punto es igual a objeto. Y aquí agregamos papel a papel, o podemos escribir solo papel y obtener token de acceso para obtener acessTken Guarde este archivo y vuelva a nuestra ruta de pedidos. Ahora para crear un nuevo pedido en papel, usaremos otra API P. Puedes obtener todas estas APIs en la documentación en papel. No te preocupes por eso. Entonces costo respuesta es igual a esperar Axios para el envío de solicitudes, y qué solicitud queremos enviar post Así post en el primer argumento, tenemos que pasar y señalar Batis dólar Cali Brackets, papel punto arllasv Slash checkout slash Órdenes. Además, para usar esta variable de papel, que definimos en el archivo de configuración de papel, tenemos que importarla en la parte superior. Const ciBacketsPaper, y también necesitamos gat access token es igual a requerir que vayamos una carpeta arriba Además, importamos const Axios es igual a requerir Axos. Ahora en nuestra API en Axios en el segundo parámetro, podemos pasar el cuerpo de la solicitud Aquí pasamos objeto con algunas propiedades. El primero es la intención. Esto establece la intención de la orden de captura. Esto le dice a la gente que el pago será capturado inmediatamente cuando el usuario lo apruebe. Debido a esto, capturaremos de inmediato el pago en segunda API. Siguiente propiedad que agregamos es comprar unidades de subrayado. A la matriz. Esto representa los artículos o servicios que el usuario está comprando y cuánto cuesta. Por ahora, solo pasamos un objeto, y en eso pasamos descripción al pedido del carrito de compras, y otra propiedad por cantidad a objeto. Dentro de esto, tenemos que pasar en qué moneda queremos aceptar el pago. Entonces código de moneda a USD y luego valor a diez. Queremos del usuario tenue valor D. Ahora, después de comprar unidades, pasamos aplicación, subrayamos contextos. Esto proporciona en papel instrucciones sobre qué hacer después de que el usuario haya hecho con el formulario de pago en papel. Entonces en este objeto, tenemos que pasar dos propiedades. El primero está escrito subrayado URL. Esta es la URL en la que queremos redirigir a nuestro usuario después del pago verificado con éxito por papel. Y segunda propiedad es cancelar guión bajo URL, esta es la URL en la que queremos redirigir al usuario después de que el pago sea rechazado o cancelado Por ahora, deja este campo tal como está. Llenaremos esto cuando probemos esta implementación. Ahora, después del cuerpo de la solicitud, podemos pasar otras configuraciones como encabezado a objeto, tipo de contenido a aplicación, ZSN y también tenemos que pasar encabezado de autorización a cerveza Batis, espacio, y aquí agregaremos token ¿Se puede decir cómo podemos generar ese token? Podemos usar GXSSTKenFunction. En la parte superior const token es igual a un peso porque esta es una función AN, obtener el exceso de token en el encabezado de autorización, pasaremos el token Calibrakets dólar, y eso es todo para esta Ahora esta API creará un nuevo orden como datos escritos, como ID de pedido y algunos enlaces. Aquí solo necesitamos devolver el enlace, que es el enlace de papel. Si abrimos ese enlace en el navegador, entonces obtendremos la página de pago en papel. Así que simplemente devolvemos respons dot Json Object approval URL, dos respons dot theta dot Links dot find Aquí obtenemos la función de flecha de enlace único, punto de enlace L es igual a los códigos, aprobamos el punto exterior HRF, y eso es todo Nuestra primera API está completa. Ahora definamos rápidamente nuestra segunda API para capturar el pago, y luego probaremos esta implementación. Así router, punto post, y punto para cortar papel de captura Orden Después de eso está en devolución de llamada con solicitud y respuesta. Ahora, capturar el pago es muy sencillo. En primer lugar, obtendremos el ID de pedido del cuerpo del punto de solicitud porque desde el front-end, tenemos que enviarlo y necesitamos este ID de pedido para capturar el pago. Además, para la verificación, podemos poner condición aquí, si el número de pedido no está disponible, entonces simplemente devolvemos el estado del punto de respuesta, objeto Json de 400 puntos con propiedad del mensaje, por favor envíe el ID del pedido o proporcione el ID del pedido. Proporcionar sonidos buenos. ¿Qué dices? Sí. Ahora bien, si tenemos ID de pedido, entonces necesitamos token para la API de captura PL. Entonces Gs token es igual a esperar, G exceso de token, y al final, simplemente llamaremos a una API. Esperan axios punto post para punto final, pasamos impuestos bc, dólar clacketSP punto BRL dos, barra de cajas Órdenes dólar Cali corchetes, barra de cajas Órdenes dólar Cali corchetes Como captura. Ahora en el segundo parámetro, tenemos que pasar cuerpo. Para esta API, no necesitamos pasar nada, así que pasamos objeto vacío. Ahora obtenemos el estado y algunos detalles sobre la captura de esta API. Entonces podemos almacenar eso en respuesta, y al final, simplemente devolvemos el simplemente devolvemos estado del objeto Json del punto de respuesta a la respuesta, los datos de punto, el estado del punto. Este estado indicará que el pago capturó correctamente o no, y eso es todo. Se puede ver lo sencillo que es. Solo tenemos que llamar a People API. Ahora podría preguntarse, ¿por qué no podemos llamar a estas API desde el front-end? Supongamos que llamamos directamente a esta API de orden de creación desde el front-end. Ahora, como sabemos, el usuario tiene exceso del front-end. Simplemente pueden modificar este valor de cantidad y convertirlo en cero o 0.5. Imagínese cuánto dinero perderá la compañía, y también algunas personas harán mal uso de alguna información. Entonces es por eso que tenemos que implementar estas funciones de pago en nuestro back end. Aquí completamos nuestras dos APIs para p. no te preocupes, esto es solo una implementación básica. Mejoraremos estas API después pruebas porque en la segunda API, después de capturar el pago con éxito, tenemos que crear un nuevo pedido para ese usuario y eliminar los datos de la tarjeta. Por ahora, no queremos esa complejidad, entonces lo haremos más adelante en esta lección, ¿verdad? Antes de probar estas API, necesitamos una clave de cliente en papel, Secreto de personas y URL base de personas. Recuerda, usamos variables vacías en el archivo ENV, necesitamos agregar estos tres campos primero, y para eso, tenemos que configurar la cuenta de People Business Ahora vamos a configurar la cuenta Paper Business. Creemos una nueva cuenta en papel y probemos esta implementación. En este proceso, es posible que necesites algunos documentos legales y tus datos bancarios. Así que dirígete a la página de desarrollador de papel, que es developer.paper.com Si ya tienes una cuenta comercial en papel, entonces es buena, pero la mayoría de los estudiantes no tienen una cuenta comercial en papel. Aquí estoy hablando de cuenta comercial, no personal. También puede convertir su cuenta personal en cuenta comercial desde esta configuración. Aquí hacemos clic en C registrarse para crear nueva cuenta. Asegúrese aquí de seleccionar la cuenta comercial y comenzar. Ingrese su correo electrónico aquí y envíelo. Ahora aquí, crea tu contraseña. Asegúrese de seguir esta instrucción y enviarla. Ahora, describe tu tipo de negocio, selecciono tu particular, y aquí tenemos que dar también esta información. Producto o servicio, digamos, mercados. Estoy escribiendo detalles aleatorios, pero en el mundo real, tienes que escribir tus datos originales. Código de propósito, déjame ver lo que tienen. Selecciona tus servicios de entretenimiento. Después de eso, tengo que escribir mi número de cédula de identidad. Para tu país, podría ser otra cosa, así que tienes que escribir esos datos correctos. Nombre de la declaración a, digamos, que Dios los bendiga y envíe el formulario. Ahora aquí, tenemos que llenar los datos sobre personales y comerciales, así que rápidamente llené estos datos. Por lo que estas plataformas de pago cambian su interfaz muy a menudo. Entonces si en el futuro, no obtienes la misma interfaz como yo, entonces no te confundas. Simplemente proporcione los detalles que están pidiendo y cree una cuenta comercial en papel. Después de crear una cuenta, podemos crear ID de cliente y secreto de cliente. Además, aquí selecciono moneda primaria a dólar estadounidense. Puedes elegir lo que quieras acordar y continuar. Aquí están pidiendo verificar tu identidad. Si estás planeando realizar tus pagos en el modo en vivo, entonces completa este proceso lo antes posible. Por ahora, solo quiero probar, seleccionar, hacerlo después. Esto nos moverá en la página de cartón. Ahora en la parte superior, haz clic en desarrolladores, y como puedes ver, ahora estamos en el modo Sandbox, lo que significa modo de prueba Ahora para crear ID de cliente y secreto de cliente, vamos a aplicaciones y credenciales. Haga clic en Crear aplicación. Escribe el nombre de tu app, cualquier cosa. Digamos nodo Cardwish. Estamos creando una cuenta para comerciante y simplemente creamos una aplicación. Se está cargando y ver, aquí obtenemos ID de cliente y secreto. Entonces primero, copia el ID de cliente y pegarlo en nuestro ID de cliente de archivo ENV Ahora, copia la clave secreta y también pégala a valor secreto. Para URL basada en papel, pasamos TDP, dos puntos, doble barra hacia adelante Bueno. Guarde este archivo. Ahora para probar con pago, también necesitamos cuenta de prueba sandbox para enviar el pago Entonces vamos a probar herramientas y se como cuentas sandbox ver, aquí tenemos dos cuentas de prueba, una para negocios y otra para personal En este momento, no necesitamos crear una nueva cuenta. Si necesitamos, entonces crearemos. Ahora, como sabemos, necesitamos front-end para probar esta API porque en el front end, abriremos la página de pago en papel. Ahora, como sabemos, necesitamos front-end para probar estas APIs porque en el front end, abriremos la página de pago en papel. Así que aquí creé una simple página SDML llamada p degustación punto SDML Obtendrá esta página debajo de esta lección, y también está disponible en los recursos proyecto a carpeta. Descárgalo y simplemente agrégalo en tu proyecto actual. Ahora, vamos a ejecutar este SDMLFle en Browser. Así que ve a sdmlfle en el Explorador de archivos o Finder y simplemente ábrelo en el Chrome Aquí obtenemos el título y un simple botón. Si quiere ver lo que pasó al hacer clic en este botón, entonces podrá ver el archivo SDML Es realmente simple. Ver, actualmente se está ejecutando desde archivos locales de nuestra máquina. Ahora, aquí está la única cosa. Recuerda, en el orden API, tenemos que pasar los contactos de la aplicación. Ver, aquí. Básicamente, tenemos que pasar la página de Éxito y cancelar la página. En el orden API, no podemos pasar la ruta de la carpeta Local, tenemos que pasar URL. Entonces, ¿cuál es la solución aquí? Podemos alojar nuestro archivo SDML en el servidor Local, y luego pasaremos esa ruta aquí Déjame mostrarte que es realmente sencillo. Entonces, en la pestaña de extensión, busca Live Server. E instala esta extensión. Mediante el uso de esta extensión, podemos ejecutar nuestra aplicación en el servidor local. Volver a archivos y enlace derecho en el papel degustación sdmlfle y seleccione abrir con Y ver que está abierto en el navegador, pero ahora se está ejecutando en este puerto. Simplemente copie esta URL, vuelva al código Vas, y simplemente pégala en la URL escrita y también en la URL Cancelar, pega la misma URL. Pero para verificar, esto está funcionando o no, pasamos aquí cancelar. En el mundo real para preguntar desarrollador front-end qué página quieren mostrar sobre el éxito y cancelar y cambiar el camino de acuerdo a eso. Paso este camino solo para probar. Guarde este archivo y asegúrese de que el servidor esté funcionando. Aquí, me sale error, parámetros duplicados. Oh, aquí paso respuesta en el lugar de solicitud. Y también, déjame revisar otra API. Sí, aquí también solicitamos. Guarde este archivo y asegúrese de que nuestro servidor esté funcionando. Bueno. Está funcionando. Ahora de vuelta a la habitación y simplemente haga clic en pagar con papal. No pasa nada. Eso no es justo. Comprobemos qué pasa. Así que pan inspecciona usando FL, ve a Consola, y aquí podemos ver que obtenemos error. El acceso a la API de búsqueda o creación de pedidos desde origen Nulo ha sido bloqueado por la política del curso Este es un error muy popular para los desarrolladores de pila completa. Sucede porque por defecto, nuestra aplicación Express no puede aceptar llamadas API desde ningún origen. Tenemos que habilitar el curso en nuestra app Express. Así que volvamos a la terminal y escribimos NPM instalar CRE. Y dale a Enter. Ahora en el archivo index js en la parte superior, importamos costo. Curso es igual a requerir curso. Entonces en la parte inferior, antes de este express DJs y middleware, agregamos app dot g course, y eso es todo Ver los cambios. Asegúrese de que nuestro servidor esté funcionando. Bueno. Ahora simplemente haz clic en botón de pagar con papel. Aquí obtengo error en la creación del orden, lo que significa que estamos obteniendo error en API uno. Comprobemos lo que está pasando aquí. Así que abre Consola. Aquí me dan 400 mal pedido. Así que volvamos al código VS en el terminal, C, obtenemos token como portador. Ingresa tu token JWT, lo que significa que pasamos token incorrecto desde el front-end Así que abra paper testing dot sdmlfle aquí tenemos que ingresar a Abrir cartero, abrir API de inicio de sesión, generar un nuevo token Bien, copia este token, y en nuestro archivo STML, pasa este token Guarde este archivo, menos esto. Haga clic en pagar con papel. Tomará algún tiempo y ver, aquí obtenemos la página de inicio de sesión de papel, lo que significa que nuestra primera API de orden de creación está funcionando bien. Ahora antes de iniciar sesión, cancelemos el pago. Ver, redireccionamos para cancelar URL. Ahora retrocede dos veces para nuestras rutas de front-end y haz clic en Pagar con Paper. Obtenemos la página de inicio de sesión de Paper. Aquí en el mundo real, nuestro cliente ingresará con su ID y contraseña en papel. Pero aquí para degustar, usaremos la cuenta Sandbox Piense en papel Sandbox cuenta es como Dummi cuenta para degustación Así que vamos a nuestro Panel de Papel. Aquí tenemos cuenta personal. Haga clic en eso. Aquí, vea, obtenemos información de inicio de sesión copiar correo electrónico y en nuestro front-end, agregue ese correo electrónico. Ahora vuelve a Dashboard y copia la contraseña y pégala en la contraseña y da clic en Iniciar sesión. Aquí nos escriben al error del comerciante. No podemos procesar su pago usando su cuenta en papel en este momento. Por favor, vuelve al comerciante e intenta usar un método de pago diferente. Así que déjame intentarlo de nuevo. Ver, aún así, estamos recibiendo el mismo error. Ahora déjame probar otra cosa. Actualmente, mi solicitud se basa en cuenta india, y aquí estoy tratando de pagar por India a India. El papel no permite pagos nacionales dentro de la India a través de billeteras de papel. Incluso en la cuenta sandbox, intentamos una transacción entre dos cuentas indias, entonces también nos dará error para que el pago de la India a la India tenga otra pasarela de pago como el raiser pay Vamos a crear una cuenta de prueba para otro país. Tipo de cuenta a personal y aquí, seleccione cualquier país pero no seleccione el mismo país que esa cuenta comercial. Crear cuenta. Ahora intentemos iniciar sesión con esta nueva cuenta. De vuelta a nuestra parte delantera. Aquí, estoy recibiendo el mismo error porque mi cuenta ha iniciado sesión. Entonces abramos este front end en pestaña de incógnito y paguemos con papel Aquí, obtengo la página de inicio de sesión. Asegúrate de iniciar sesión con otra cuenta de país, correo electrónico de Addhe, y también agrega aquí la contraseña e inicia sesión con esta cuenta Ver, aquí obtenemos la página de pago en papel. En la parte superior, obtenemos la cuenta de usuario, y aquí obtenemos precio a pagar. Además, aquí en la parte inferior, obtenemos varios métodos de pago como saldo en papel, Cooperativa de crédito usando tarjeta, Un crédito en papel, y también puedes agregar tu propia tarjeta. Esto es cuenta de prueba, y por eso no hacemos nada. Además, aquí obtenemos la dirección de esta cuenta. Estos son detalles de la cuenta de degustación. Ahora hagamos clic en Continuar para revisar el pedido. S, aquí obtenemos el pago fallido. Déjame comprobar lo que está mal. Abra la consola usando bien F y vea, aquí obtenemos error en la API de orden de captura. Entonces en nuestro código VS en la terminal, aquí me sale este largo error, así que rápidamente desplázate hacia arriba. Aquí obtenemos error, no se pueden leer propiedades de estado de lectura indefinido. Entonces en nuestra segunda API, no estamos obteniendo estatus. Déjame comprobar lo que está mal. Oh, lo siento. Aquí, me olvidé de escribir. Guarde este archivo y vuelva a nuestro front-end. Permítanme intentar eliminar este token y el ID de par de la URL y ejecutar este sencillo archivo SGML Ahora haz clic en Pagar con Papel. Ver obtenemos el pago papal, simplemente haga clic en Continuar para revisar pedido Aquí vuelvo a recibir llenado de pago. Recuerda, cada vez que aplicamos alguna característica nueva, definitivamente vendrán errores. No se frustre, concéntrese en las soluciones, no en los problemas. Ver, aquí me sale error interno del servidor. Permítanme verificar la solicitud de terminal llena con Código de Estado 400 en nuestra API de orden de captura, lo que significa que no estamos obteniendo el ID del pedido. Oh, aquí solo escribo solicitud punto cuerpo. Hay que agregar ID de pedido por puntos, guardar los cambios, y en nuestro front end, pagar con papel. Continuar con la revisión del pedido. Mira, pasamos a nuestra página de éxito, y aquí también obtenemos el pago exitoso, lo que significa que nuestra segunda API captura el pago también está funcionando. Ver, en nuestra URL, también obtenemos Token, que es el ID de pedido, y vamos a buscar este parámetro en nuestro front-end, y luego llamamos a la segunda API de captura de pago y pasamos ese ID de pedido en el cuerpo Y por eso capturamos el pago en cuenta de papel. Comprobemos nuestra cuenta comercial, obtengamos el pago de $10 o no. Para eso, tenemos que ir al tablero de Papanicolaou. En las herramientas de prueba, vaya a las notificaciones de sandbox Ahora desde este menú desplegable, seleccionamos nuestra cuenta comercial y hacemos clic en buscar. Y en la parte inferior, obtenemos el pago. Si no obtienes aquí el pago, asegúrate de esperar de dos a 3 minutos porque a veces lleva tiempo mostrar el pago aquí. Ahora bien, si abrimos esto, entonces podemos ver que recibió el pago $10 de John, que es probar el nombre de la cuenta. Aquí podemos ver la fecha de la transacción. Este es el formato PST, que es el tiempo estándar específico. No te confundas con eso. Ahora podrías preguntar por qué obtenemos pago en esta cuenta comercial. La razón por la que obtenemos el pago en esta cuenta comercial porque al usar esta cuenta, creamos nuestra aplicación y luego obtenemos ID de cliente y secreto en papel. Es por eso que obtenemos el pago en esta cuenta comercial. Ahora aquí probamos el pago para usuario estadounidense. Ver, aquí obtenemos el código del país. Ahora para probar otro pago de país, podemos crear una nueva cuenta. Seleccione aquí personal, que es la cuenta del comprador, y aquí podemos seleccionar el país. Digamos que selecciono aquí país, Canadá, puedes seleccionar cualquier país y crear cuenta. Esto es muy divertido. Ver, en la parte superior, obtenemos la nueva cuenta para usuario canadiense. Abra ese usuario y simplemente copie el ID de correo electrónico. Ahora volvemos a nuestro front-end y aquí vamos a simple URL de pruebas en papel. Asegúrate de que eliminamos este token porque es la página posterior del pago exitoso. Ahora da clic en pagar con papel. Aquí nuevamente obtenemos la cuenta anterior porque hemos iniciado sesión con ella. Entonces, para eliminar esta cuenta, damos clic aquí en este ícono de JD Ver en la parte inferior, obtenemos Cerrar sesión. Haga clic en eso. Ahora, da clic en este cambio de correo electrónico de usuario y pega aquí este nuevo correo electrónico de cuenta. Ahora de vuelta a deskbard, copia la contraseña y pégala aquí e inicia sesión con ella. Bueno. Ahora, vea aquí en la parte superior, me sale el monto en orden, pero aquí desde mi cuenta, puedo pagar en moneda canadiense, que es CAD. Además, obtenemos métodos de pago limitados, y vea aquí obtenemos la tasa de conversación de la gente un CAD equivale a 0.6 9549 USD Aquí, la gente a sus tarifas de transacción, pero podemos pagar en la moneda de nuestro país. Sigamos revisando el orden. Ver, aquí conseguimos pagos exitosos. Y si revisamos nuestras notificaciones de sandbox, busca aquí la cuenta comercial Puede tomar poco tiempo, y aquí obtenemos otro pago de $10. En la parte inferior, como podemos ver, obtenemos la ubicación de Canadá. Además, esta cuenta comercial obtiene su pago en el USD, incluso el cliente paga en otra moneda. Ese cliente necesita pagar la tarifa de transacción papal. Entonces como sabemos, nuestro pago está funcionando. Ahora podemos mejorar nuestras APIs y hacerla realista. Es realmente simple. Déjame mostrarte. Entonces lo que queremos cambiar en la API de orden, por lo que actualmente estamos pasando cantidad estática aquí, pero eso no es correcto. Tenemos que pasar el precio total de la tarjeta del usuario. Así que vamos a conseguir este precio total de la tarjeta. Entonces antes de esto obtener token de acceso, escribimos costo, carrito es igual a un peso, carrito Asegúrate de ingresar esta tarjeta modelo punto Fino uno. Y aquí en el objeto, pasamos usuario para solicitar punto usuario punto guión bajo ID Y también, para este ID de usuario, necesitamos agregar Osmidalware Asegúrate de ingresar esto también. Esto devolverá el objeto de la tarjeta, pero tenemos que pasar su condición si el carrito no está disponible o la longitud del punto de los productos de la tarjeta es igual a cero, entonces devolvemos la respuesta con código de estado 404 punto Json Object, message property to cart not found. Ahora en el lugar de esta cantidad, tenemos que pasar tarjeta punto precio total de la tarjeta. Y aquí no cambiamos la moneda porque queremos obtener el pago en el USD. Si quieres recibir el pago en otra moneda, entonces puedes pasar ese código de moneda en este código de moneda. Pero hay que verificar que la moneda sea aceptada por papel o no. Por ahora, probemos esto. Guarda los cambios y ve a Paper tasting dot sdmlfle déjame explicarte este código Entonces aquí pasamos el token JWT para lo cual agregamos producto. Actualmente, en nuestra aplicación, establecemos solo 2 horas de caducidad, lo cual es un poco molesto para la degustación porque aquí tenemos que crear el token JWT una y otra vez Para que podamos eliminar el vencimiento del inicio de sesión y simplemente agregar caducidad en la etapa final del proyecto. Entonces en las rutas de usuario y en la parte inferior, eliminamos este objeto con propiedad caducada. Ahora vamos a generar un nuevo token que nunca caduque. Abra Bostman y abra la API de inicio de sesión y simplemente envíe la solicitud Bueno. Aquí copiamos este token en el archivo SDML, simplemente lo pegamos aquí Además, puedes pasar aquí tu dirección de envío. Ahora, después de eso, aquí agregué este evento on click para este botón de pago. En eso, antes que nada, llamamos a nuestra API de pedidos usando el método fetch y con este token Y como sabemos por la API del pedido, obtendremos la URL de aprobación. Entonces lo conseguimos aquí. Si esos datos no tienen éxito, entonces mostramos alerta con error en la creación del orden. ¿Qué pasa si obtenemos la URL de aprobación con éxito desde el back end? Después redireccionaremos al usuario a esa página. Ahora el usuario ingresa la información correcta y el pago se realiza con éxito. Ahora la gente pasa token en los parámetros de URL, que es nuestro ID de pedido. Entonces después de un pago exitoso, obtenemos el token en los parámetros de URL. Después de eso, llamamos a nuestra segunda API para capturar el pago. Y si ese pago capta con éxito, entonces desde el back-end, pasamos estado en la respuesta. Aquí comprobamos que el estado está terminado, después mostramos alerta de éxito y si falla, entonces mostramos error fallido, simple como eso. Ahora, simplemente probemos nuestra implementación. Estoy muy entusiasmado con ello. Guarde este archivo y ahora actualice la página, y volvamos a hacer clic en el botón de pago. Obtenemos error en la creación del orden si revisamos la consola. Ver, aquí obtenemos error. Se trata de 400 errores, lo que significa que no se encuentra el carrito. O, recuerde, en la lección de quitar carrito, retiramos la tarjeta eliminando los últimos productos de la matriz de productos. Tenemos que agregar un producto en nuestra tarjeta, ir a Cartero abrir cabeza a carrito API Aquí, tenemos que actualizar el token, copiarlo de la API de inicio de sesión y simplemente pegarlo en el encabezado de autorización. Bueno. Ahora vamos a enviar la solicitud. C, productos añadidos. Es iPhone, bonito. Ahora refresquemos la página, y nuevamente, probemos el pago. Ver, aquí obtenemos nuestro precio de tarjeta. Encantadora. Ahora aquí simplemente cancelamos el pago, y pasamos a papel degustación punto stmlPage Bueno. Ahora vamos a mejorar nuestro segundo EPI No te preocupes en que no tenemos que hacer muchas cosas. Simplemente crearemos un nuevo dato de orden en la base de datos. Retire la tarjeta actual del usuario si el pago es exitoso. Entonces aquí pasamos condición I pago se captura con éxito, así que los datos de punto de respuesta estado punto, que obtenemos de esta API de captura, si el pago es igual a completado, escribimos código aquí en el bloque I. Entonces aquí creamos costo. El nuevo orden es igual al nuevo orden. Asegúrese de que ingresamos este modelo de pedido. Bueno. Ahora tenemos que pasar objeto nuevo orden aquí. Así que antes que nada, en este orden, agregamos usuario para solicitar punto usuario punto guión bajo ID Pero aquí para obtener los datos del usuario, tenemos que adde o middleware Bueno Ahora, después de eso, necesitamos productos, y en eso almacenaremos todos los productos que ordenemos. ¿Y cómo podemos obtener esa información? Bien, lo conseguimos de la parte de atrás. Entonces antes de este pedido, encontramos const, Tarjeta es igual a esperar carrito punto encontrar uno Y aquí en el objeto, pasamos condición usuario para solicitar punto usuario punto guión bajo ID Simplemente en los productos del pedido, pasamos productos cart dot. Después de eso, los productos totales al carrito puntean productos totales. A continuación, tenemos precio total, al carrito punto precio total del carrito. A continuación tenemos la dirección de envío, que necesitamos obtener del front end. Por ahora, déjalo como está. A continuación, agregamos estado de pago a pago, ID de pago a los datos de punto de respuesta ID de punto. Y si quieres guardar alguna información extra, entonces puedes evaluar a que realmente depende de ti. Además, si quieres agregar un nuevo campo, entonces tienes que agregar ese campo en nuestro esquema de pedidos. Por ahora, pasamos toda la información que se necesita. Ahora podemos guardar este nuevo pedido, así que espera nuevo pedido dot save y después de guardar el nuevo pedido, podemos eliminar nuestra tarjeta de la base de datos. Así que espera tarjeta dot Dilto Aquí ya tenemos tarjeta. Es por eso que usamos directamente card dot Eliminar uno. Si no llegamos aquí tarjeta, entonces tenemos que usar cart dot Fine one y eliminar método como este. En la parte inferior, movemos esta respuesta en este blog y devolvemos esta respuesta. Esto es realmente importante. Ahora para el lado más seguro, agregamos condición y simplemente devolvemos aquí respuesta con código de estado, 400 SN Object, estado propiedad para no completar, y el mensaje al pago no se captura con éxito. Inténtalo de nuevo más tarde, y eso es todo. Sólo tenemos que pasar dirección de compresión en este objeto de orden De donde obtenemos la dirección zipping. Lo conseguimos de la parte delantera. En el cuerpo de solicitud de API de pedido de captura, podemos obtener dirección de zipping, segundos dirección de envío es igual a solicitar cuerpo de punto, dirección de envío de punto Aquí estamos recibiendo dirección zipping porque desde el front-end, ya pasamos la dirección zipping en el cuerpo de la solicitud Ver, aquí paso la dirección de zipping. Ahora, en nuestro pedido, podemos establecer la dirección de envío a la dirección de compresión. Bueno. Ahora déjame darte una situación. Imagine que el usuario olvidó pasar esta dirección de envío. ¿Cómo podemos entregar el producto a ese usuario? Así que tenemos que asegurarnos de que el usuario pase la dirección de zipping. Entonces aquí podemos escribir I condición, dirección de envío no está disponible, luego devolvemos respuesta con código de estado 400 para solicitud de apuesta, y en el objeto JSON, pasamos propiedad de Mensaje para por favor proporcione su dirección de entrega. Ahora aquí hay una cosa. Sabemos que esta API de pago de captura se ejecutará después de que el usuario pague con papel. No podemos decir ahora al usuario, no proporcionan dirección de envío. Aquí podemos hacer una cosa. También podemos simplemente poner esta condición al comienzo de nuestra primera API antes de cortarnos. 151. Cómo obtener el historial de pedidos: Ahora definamos rápidamente otras API para los pedidos. Busquemos el historial de todos los pedidos del usuario actual. Después de esta API papal, agregamos router dot Get y apuntamos a reenviar slash Además, para encontrar la información del usuario, agregamos os middleware, y luego usamos la función de devolución de llamada con solicitud Ahora aquí obtenemos directamente const pedidos es igual a un peso, orden punto encontrar, y aquí pasamos comparación Object, usuario para solicitar punto usuario punto subrayado ID Además, necesitamos abreviar estos datos por fecha. Método de punto corto, y aquí en el objeto, pasamos creado en dos menos uno para orden descendente. Aquí de la colección de pedidos, no queremos mostrar todos los rellenos. Seleccionar punto, menos usuario, menos dirección de zipping, menos ID de pago, y al final, podemos enviar respuesta, punto JSN y pasar aquí estos pedidos Probemos esta API. Entonces en Cartero aquí en el CardWZPject, creamos una En la carpeta Pedidos, agregamos una nueva solicitud llamada Historial de pedidos. Ahora punto final a SCTP, Columna doble para nuestra slash Host Local, Columna 3,000 API slash Ordenar y enviar Lo sentimos, olvidamos pasar el token JWT. Así que ve a encabezados. Primero, pasamos autorización al portador, y aquí pasamos token. Entonces volvemos a iniciar sesión. Aquí obtenemos token, copiamos este token y lo pegamos en esta API y enviamos la solicitud. Ver, aquí obtenemos los datos de los pedidos encantadores. Ahora en la siguiente lección, definiremos nuestra última API para este proyecto. 152. Actualizar el estado por el administrador: Vamos a crear API para admin. Mediante esta API, él o ella puede cambiar el estado del pedido a procesamiento, C entregado o lo que quieran. Así router punto página porque queremos cambiar sólo una propiedad, no todo el documento, y señalar a la orden de corte D estado aquí también necesitamos el ID de orden, por lo que pasamos Columna ID de orden Entonces agregamos middleware Os para token JWT. Y aquí también necesitamos verificar la regla de usuario. ¿Es admin o no? Entonces agregamos aquí la regla Jack, middleware, la entrada automática C no funcionó Y dentro de esto, tenemos que pasar rol, que es admin. Ahora en la parte superior, vamos a introducir este middleware. Const, check role es igual a requerir que vayamos una carpeta arriba, middleware, y en ese Ya usamos esto en la ruta de productos. Si lo olvidaste, entonces puedes ver el código de ruta. Ahora simplemente pasamos función acing con solicitud y respuesta. Genial. Ahora primero, obtenemos el pedido de la colección de pedidos. Secctudado orden es igual a esperar orden punto encontrar Por ID. Además, en lugar de esto, podemos usar bien por ID y actualizar. Aquí en el primer argumento, tenemos que pasar el ID de orden, que es request dot params dot order ID Y en el segundo argumento, pasamos el objeto de valores actualizados. Entonces Estado de orden de objetos a cualquier valor en el pase medio. Y ¿cómo podemos obtener ese valor directamente del órgano de solicitud? Aquí antes del pedido actualizado, teníamos estado de costo es igual a solicitar cuerpo de punto, estado de punto. Y aquí pasamos el estado de la orden al estado. Y después de eso, en el tercer argumento, pasamos objeto con nuevo a verdadero. Le dirá a los mangos que devuelvan nuevos datos actualizados en este valor de orden Ya lo vimos en la sección Mongo DB. Ahora podría ser posible que no encontráramos orden. Actualicé el pedido no está disponibleetiqueta, entonces devolvemos respuesta, estado de punto 404 punto Json Object, propiedad de mensaje para ordenar no encontrado Por fin, simplemente pasamos response dot json, Object, message property to order status updated successfully, and after that, updated order to updated order. O también podemos quitar eso y hecho. Si quieres cambiar algo, entonces puedes hacer esos cambios de acuerdo a tus necesidades. Probemos esta API, abramos Postman, agreguemos una nueva solicitud en la colección de pedidos llamada actualizar estado del pedido, seleccionar solicitud a página, punto final para cortar API, También seleccione página, estado del pedido, y aquí agregamos el ID de pedido. De la llamada API anterior, simplemente copio este ID de pedido y lo pego en el punto final. Ahora en nuestra API, pasamos el encabezado a autorización, y también copiamos el valor de la API anterior y lo pegamos aquí. Enviar la solicitud. Aquí, me sale error. Déjame revisar la terminal. Sé comprobar error de rol. Entonces en la parte superior, tengo error tipográfico, así que cambio esto para verificar rol Los cambios y enviar la solicitud. Ver, aquí obtenemos 403 error prohibido, acceso denegado Admin solamente. Tenemos que cambiar la regla de usuario para esta cuenta. Ve a MongoivCompass, abre la colección del usuario y encuentra tu cuenta por la que ingresaste Menos esto, simplemente cambio la regla para que admin la actualice. Ahora necesitamos volver a generar el token web JSN. Vaya a iniciar sesión y envíe la solicitud, copie este token y reemplace nuestro token con este nuevo token. Ahora en body raw, también necesitamos pasar Objeto JSON con estado de campo a IB y enviar la solicitud. Ver, aquí obtenemos mensaje de éxito y también datos de pedidos actualizados. Encantadora. 153. Limpieza del código para el archivo índice: Por lo que actualmente nuestra aplicación está limpia. Simplemente se equivoque con el archivo JS de punto índice. Podemos ver que esto no se ve limpio. En la parte superior, muchos, muchos requieren funciones para la entrada. Después de eso, tenemos código para crear registradores y controladores de errores globales Después de eso, tenemos conexión a MongoDB luego aplicamos algunos middlewares y algunas rutas, y por fin escuchamos nuestro servidor Están sucediendo muchas cosas en este archivo de puntos de índice. Podemos hacerlo limpio y almacenar cada lógica en el archivo separado. No es obligatorio, pero muchos desarrolladores hacen eso, pero eso puede confundirte Entonces hay otra manera que es en lugar de separar el código, podemos hacerlo limpio agregando comandos y separándolos entre sí. Puede elegir de todos modos, depende totalmente de ti. Déjame mostrarte mi camino. En la parte superior, tenemos algunos config, así que adhiérase, comando global config. Después de eso, tenemos este Express, Mangoose, Winston, y Addre comando, módulos de terceros. Que tenemos esta app. No queremos tocarlo ahora. En la parte superior, sumamos todos nuestros insumos. Algunas de estas todas las importaciones de ruta sobre esta app y adde comentario, módulos personalizados, o puedes decir módulo rutas No hay reglas para el comentario. Puedes escribir el comentario, como quieras llamar. Solo ten en cuenta que este comentario será visto por ti en el futuro. Entonces en ese momento, no te confundes. Ahora, después de eso, podemos agregar comando para esta app, inicializar express Ahora aquí tenemos este logger y también en la parte inferior, tenemos este puerto, así podemos moverlo aquí y podemos llamarlo constante. Después de eso, para esta excepción no capturada, agregamos catch, unhandle errores sincrónicos que no fueron capturados en los bloques try catch Para el rechazo no manejado, agregamos los rechazos catch unhandlepMise Por estos comentarios, podemos recordar por qué agregamos el código incluso después del largo tiempo Después de eso, aquí tenemos conexión a base de datos. Entonces tenemos estos dos middlewares, entonces middleware, luego para archivos estáticos, agregamos serve archivos estáticos agregamos Después para las rutas, agregamos rutas API. Después de eso, tenemos el middleware de error, así que agregamos el manejador de errores personalizado, y por fin iniciamos el servidor Ahora bien, si revisamos nuestro archivo index dot js, mira, ahora se ve un poco más limpio. Sí, la separación del código hará que esto sea más limpio, pero puede confundirnos también. También puedes separar el código. Yo depende totalmente de ti. Así que aquí, nuestro proyecto de comercio electrónico ha terminado. Ahora, a partir de la siguiente sección, saltaremos sobre nuestro proyecto tres, que es la aplicación de redes sociales. 154. Sección 13: introducción al proyecto 03: Bienvenido a la nueva sección del curso Node JS definitivo. A partir de esta sección, vamos a construir un proyecto completamente nuevo. ¿Puedes adivinar? Sí, vamos a construir aplicaciones de redes sociales back end usando NodeJS Llamaremos a este proyecto nuestro Linky Pi. Este proyecto es uno de mis proyectos favoritos. Déjame explicarte qué vamos a cubrir en este proyecto. En este proyecto, crearemos API para seguidores siguientes, incluyendo el envío de solicitudes a cuentas privadas, envío de correo electrónico desde nuestra aplicación. Además, crearemos APIs para publicar con me gusta y comentarios. Después crearemos API para chat, chat personal y chat grupal. Además, aplicaremos experiencias de chat en tiempo real con socket y muchas cosas más. Si realmente entiendes y construyes este proyecto, entonces tu cartera realmente mejorará. Esto va a ser divertido. ¿Estás emocionado? Estoy muy emocionada y espero que tú también. Entonces comencemos a construir este increíble proyecto. 155. Configuración del proyecto 03: Ahora vamos a montar nuestro nuevo proyecto. Entonces en la carpeta de proyectos, creo una nueva carpeta llamada nuestro Linky File Ahora, vamos a abrir esta carpeta en el código VS. Bueno. En el terminal, escribimos NPM en Y para la inicialización y para crear el paquete Además, vamos a crear el archivo de perros índice, que es nuestro archivo principal. Ahora, como sabemos, configuraremos nuestra aplicación en este archivo. Y para eso, necesitamos algunos paquetes. Entonces en la terminal, escribimos NPM, install, Express, Mongos para Mongo DB, cours para Además, agregamos Dt NV, necesitamos eso y golpeamos Enter. Tomará algún tiempo. Bueno. Ahora, configuremos rápidamente nuestra aplicación. En primer lugar, Const Express es igual a requerir de Express Después de eso, st app es igual a, aquí llamamos Express para escuchar esta app, agregamos aquí punto LISN Aquí en el primer argumento, tenemos que pasar el puerto. Después de const app, definimos otro puerto const es igual a procesar nw dot port o 3,000 o 5,000, lo que quieras En la producción, nuestra aplicación tomará puerto de la variable de puerto ENV En el segundo argumento, tenemos que pasar la función de devolución de llamada que simplemente consola dot log En tis, el servidor se está ejecutando en el puerto, y aquí imprimimos nuestro port dollar calibracets Además, tenemos que agregar algunos productos intermedios de aplicaciones. En el curso superior es igual a requerir curso. Y aquí agregamos app punto g, simplemente llama aquí curso. Y después de eso, para pasar datos en JSON, usamos app.us, express dot JSON Sin este middleware, no podemos obtener datos en la solicitud del cuerpo Ahora veamos esta implementación. Ver los cambios y en el terminal, nodemon index dot js C, el servidor se está ejecutando. Genial. Ahora conectemos también esta aplicación con base de datos. Para eso, necesitamos mangos. Entonces en la parte superior, costo mangos es igual a requerir de mangosta Ahora, después de esta variable, agregamos Mongoose dot connect Aquí, tenemos que pasar la cadena de conexión de nuestra base de datos. Anteriormente, pasamos directamente la cuerda aquí, pero eso es poco arriesgado. Hagamos esto seguro. En nuestro proyecto, creamos un nuevo archivo llamado punto ENV. En este archivo, creamos una nueva variable llamada DVes igual do, Mongo DB, columna, double for slash, host local, columna 27017, columna 27017, que es nuestra cadena de conexión local Mongo Se puede obtener eso del Mongo Divi Compass, y después de eso, hacia adelante menos Y aquí ingresamos nuestro nombre de proyecto, nuestro Slinky Pi. Ahora para usar esta variable de entorno, necesitamos configurar D E y V. Así que en el archivo índice Gs, en la parte superior, requerimos punto Env dot config En el método mangos dot Connect, ¿qué pasaremos? Correcto, pasamos proceso punto w punto d. podemos ver lo sencillo que se vuelve esto después solo crear una o dos aplicaciones de nodo. Esto va a mejorar poco a poco y te vas a poner más cómodo con nodo. Ahora, como sabemos, este mangos dot connect devuelve una promesa, así que tenemos que manejar esa promesa Dot entonces método, función de devolución de llamada, y aquí simplemente consultamos dot log, Mango Div conectado con éxito. También después del método entonces, agregamos el método catch para manejar el rechazo de promesa, y aquí obtenemos error, función de error, y nos consola dot log, conexión Mongo Di falló y simplemente adherimos este error Comprobemos también esta implementación. Guarde este archivo, y en la terminal, vea, aquí conseguimos que Mongo Di B se conecte con éxito Por ahora, esto está bien. Añadiremos Winston y Lager al final de este proyecto ya que los necesitamos Ahora en la siguiente lección, crearemos nuestro modelo de usuario. 156. Crear modelo de usuario: Ahora es tiempo de ejercicio. Entonces esta es la pequeña muestra de documento de usuario. En base a estos, hay que crear un esquema de usuario. También puedes ver el código del proyecto anterior. No te preocupes por eso. Así que dedique algo de tiempo y complete este ejercicio. Y después de eso, mira la solución. Ahora veamos la solución. Entonces en nuestro proyecto, creamos una nueva carpeta llamada models, y en eso, creamos un nuevo archivo llamado users dot js. Bueno. Ahora, antes que nada, importamos costo, mangos es igual a requerir de mangos Y después de eso, definimos const, el esquema de usuario es igual al nuevo esquema de punto de mangos y aquí pasamos el esquema en el objeto Ahora, antes que nada, para nuestra aplicación de redes sociales, necesitamos nombre de usuario para objetar, escribir, para cadena requerida, a true. Además, no queremos espacios en blanco en el nombre de usuario. Entonces para eso, pasamos stream a true. También significa longitud a tres, y longitud máxima, digamos 30 o 40, lo que quieras tomar. Después del nombre de usuario, agregamos correo electrónico al objeto, tipo a cadena, requerido a verdadero, único a verdadero, soñamos con verdadero porque no necesitamos espacio en el correo electrónico también. Y siempre convertimos nuestro correo electrónico a minúsculas, así que minúsculas a verdadero también Después de eso, necesitamos contraseña para objetar, escribir a cadena, y requerido para true. También queremos almacenar algunos detalles de perfil del usuario, y estos datos el usuario puede agregar desde la configuración como Instagram. No debe ser obligatorio. Entonces podemos obtener un nombre de perfil simple, que es tipo a cadena, y no necesitamos que sea único y tampoco lo necesitamos obligatorio, así que no agregamos aquí ningún validador. Ahora bio a objeto, escriba a cadena. Y longitud máxima a 150. A continuación, agregamos cuentas, estado, tipo a cadena, um, a matriz. Aquí, pasamos valores, active, next, desactive y bend. Establecimos el valor predeterminado en activo. A continuación, lo que podemos agregar, se verifica para objetar, escribir a bullian y valor predeterminado a false También, después de eso, agregamos es private, object, type to bullian y default to false A continuación, el usuario puede agregar el tipo de género a la cadena, um a la matriz, y aquí pasamos masculino, femenino, no binario, o el usuario puede decir prefiero no decir. A continuación, también tomamos el número de teléfono para objetar, escribir a cadena porque el usuario puede agregar código de país en este. Y aquí también recortamos a verdad. Ahora lo que podemos añadir, creo que esto es suficiente por ahora. Si en el futuro, necesitamos más detalles, entonces podemos agregar más campos en el futuro. Aquí tenemos nuestro esquema. Ahora vamos a crear modelos de usuarios. Así costo usuario es igual al modelo punto Mongos. Aquí, pasamos nombre singular, que es usuario. Y segundo, pasamos el esquema, que es el esquema de usuario. Ahora, para interactuar con este modelo de usuario, necesitamos exportar este. Por lo tanto, las exportaciones de módulos son iguales a usuario y hechas. Ahora en la siguiente lección, crearemos API para registrar un nuevo usuario. 157. Registrar un nuevo usuario: Vamos a crear nuestro primer EPI para esta aplicación. Aquí, creamos una nueva carpeta llamada Routes, y dentro de esta carpeta, creamos un nuevo archivo llamado users dot js. Bueno. Ahora, antes que nada, necesitamos crear Router. Importamos Express es igual a requerir Express, y después de eso, costo Router es igual a express dot Router. Al final, simplemente el módulo exportaciones de punto es igual a Router. Ahora agreguemos esta ruta en nuestro archivo principal index dot js. Después de estas entradas, ingresamos rutas de usuario de costo es igual a requerir. Aquí vamos a Routes folder slash users. Ahora, después de los middlewares, agregamos app dot U. Aquí en la primera posición, agregamos prefijo para esa ruta Así que slash usuario de la API. Y aquí simplemente agregamos rutas de usuario. Ahora vamos a crear API de registro. Así que de vuelta al archivo de ruta de los usuarios. Aquí agregamos Router punto post y punto para reenviar slash, y luego función de devolución de llamada asincrónica con solicitud Ahora, antes que nada, necesitamos obtener rellenos de la solicitud del cuerpo. Pero la pregunta es, que llena necesitamos para registrar un nuevo usuario. Entonces, para las aplicaciones de redes sociales, las empresas en su mayoría toman datos mínimos para registrar un nuevo usuario. Porque si tomamos diez a 15 rellenos como primer paso del proceso, entonces no mucha gente creará una cuenta en nuestra aplicación de redes sociales. Entonces es mejor que solo tomemos esos datos que se requieren para nuestro esquema. Además, el usuario puede rellenar fácilmente esos datos, y es por eso que si te das cuenta, casi todas las aplicaciones de redes sociales solo toman nombre, ID de correo electrónico del usuario y contraseña. Sólo estos rellenos. Toman otros rellenos más tarde de la configuración del usuario. Es por eso que abrir una cuenta en aplicaciones de redes sociales es realmente sencillo. Aquí tomaremos solo tres rellenos del usuario. El objeto de costo es igual a solicitar el cuerpo del punto, y aquí obtenemos el nombre de usuario, correo electrónico y contraseña. Ahora bien, si no obtenemos estos rellenos, entonces devolvemos error. Así que el nombre de usuario no es válido o el correo electrónico no está disponible, o la contraseña no está disponible, luego devolvemos respuesta con estado 400 y pasamos objeto Json con mensaje de error faltantes campos de formulario requeridos. Después de eso, también pasamos el éxito a las caídas. Este campo de éxito ayudará al front-end a mostrar errores. Ahora, también, aquí encontramos usuario ya está disponible en nuestra base de datos o no. El usuario de Const es igual a un peso. Aquí agregamos modelo de usuario, C, auto Input works dot Fine one Object. Y aquí necesitamos dólar u operador para matriz, y aquí pasamos múltiples condiciones en objetos separados. Entonces nuestra primera condición es nombre de usuario a nombre de usuario, y segundo, correo electrónico a correo electrónico. Si alguna de esta condición es cierta, entonces obtenemos a ese usuario. Entonces aquí pasamos condición. Si el usuario está disponible, luego devolvemos la respuesta con código de estado 400 punto Json objeto mensaje a aquí pasamos condición. El nombre de usuario del punto de usuario es igual a nuestro nombre de usuario. Si esto es cierto, el signo de interrogación, usuario ya está tomado, lo contrario el correo electrónico ya está registrado. Y después de eso, pasamos el éxito a las caídas. Ahora, si el usuario no está ya registrado, entonces simplemente creamos un nuevo usuario. Entonces costo nuevo usuario es igual a nuevo usuario. Aquí pasamos objeto de usuario, nombre de usuario a usuario, o simplemente podemos eliminar este correo electrónico a correo electrónico y contraseña a contraseña. Ahora, como sabemos, no pasamos aquí contraseña en texto normal, necesitamos cifrarla Y para eso, qué paquete usamos, trata de recordarlo. Sí, es cripta. Entonces NPM instala, cripta y presiona Enter. Bueno, minimizar la terminal, y en nuestro archivo de rutas en la parte superior, const, crypt es igual a requerir cripta Ahora en nuestra API, creamos Cost het pass es igual a esperar, creamos punto s. y aquí en el primer argumento, tenemos que pasar nuestra contraseña, y en el segundo argumento, pasamos el número salt, que es diez. Ahora podemos simplemente establecer contraseña a st contraseña. Y después de esto, simplemente podemos esperar nuevo usuario punto c. ¿Qué queremos hacer después de crear nuevo usuario? Bien, generamos token JWT para ese usuario, y para eso, necesitamos el paquete de token web JSN Entonces NPM instala el token web JSON, a la tasa 9.0 0.2, y presiona Enter Bueno. Ahora minimice este terminal, e ingresemos este token web JSN en la parte superior Sacst JWT es igual a requerir btgon JSN. Ahora, como hicimos anteriormente, creamos función para generar JSN WebTGon porque también necesitamos que en nuestra API de inicio de sesión SACSTGenerate, token es igual a aquí obtenemos datos como función de error de parámetro Y en esto, simplemente devolvemos el signo de punto JWT. Al principio, pasamos los datos, y después de eso, necesitamos pasar la clave secreta JWTs Así proceso punto nw punto JWT subrayado clave. Ahora necesitamos agregar esta variable clave en nuestro archivo ENV. clave de subrayado JWT es igual a aquí, podemos pasar cualquier clave que sea segura Por ejemplo, la clave de seguridad JWT. No utilices esto para la producción. Lo paso al azar. Tienes que crear tu propia clave de seguridad. Además, aquí no agrego caducidad para nuestro token porque para la aplicación de redes sociales, la caducidad del token no es buena. Los usuarios quieren acceder rápidamente a nuestro sitio web. Además, imagina que visitas Instagram todos los días y todos los días, tienes que iniciar sesión. En caso de que usaras esa app durante mucho tiempo, no. Entonces, como desarrollador, tenemos que pensar siempre desde la perspectiva del usuario. Ahora, en nuestra ruta API callback, simplemente const token es igual a generar Aquí en la parte inferior, elimino Typo de mi nombre de función Ahora en nuestra función generar token, tenemos que pasar los datos del usuario que queremos agregar en nuestra carga de pago de token. Así Objeto, subrayado ID a nuevo usuario punto subrayado ID, y nombre de usuario a newser dot nombre Y al final, simplemente devolvemos estado del punto de respuesta a 01 para la creación de nuevos datos punto GSN, y pasamos directamente este token Ahora, probemos esta API. Entonces abre Cartero. Aquí creamos una nueva colección, creamos colección en blanco para nuestro nuevo proyecto llamado Our Linky Fi Y en esta carpeta, agregamos una nueva carpeta llamada users, y en esta carpeta, agregamos una nueva solicitud, llamada register, un nuevo usuario. Bueno. Ahora solicite el tipo para publicar, y señale a SDDP, Columna doble slash host local, Columna 3,000 slash API slash user Y enviar la solicitud. Ver, aquí obtenemos error, 500 no pueden desestructurar los rellenos faltantes Pasemos todos los rellenos de formularios que sean necesarios. Selecciona body, raw, y aquí pasamos nuestro Objeto JSON. Nombre de usuario para codificar, subrayado, bendecir. Por cierto, este es mi nombre de usuario de Instagram. Siguiente correo electrónico a código en el gmail.com rojo. Y por último, enviamos la contraseña 212-34-5678 y Ver, aquí obtenemos token como respuesta. Y si revisamos nuestra base de datos, aquí obtenemos nuestra base de datos linkifed, y en la colección del usuario, vea, aquí obtenemos también nuevos datos de usuario Además, conseguimos que el estado de la cuenta esté activo es verificado y es privado, ambos son falsos. Establecemos todos estos valores como predeterminados en nuestro esquema de usuarios. Además, aquí olvidé agregar unique a true para este nombre de usuario porque aquí queremos que este nombre de usuario sea único para todos nuestros usuarios. 158. Ejercicio: API de inicio de sesión del usuario: Ahora hagamos otro ejercicio. En este ejercicio, se tiene que crear una API de inicio de sesión, que verificará el nombre de usuario y la contraseña del usuario. Ya lo hicimos en nuestro proyecto anterior, pero quiero que lo hagas por tu cuenta. Puedes ver este código de contraseña de verificación, pero el resto de la API, tienes que crear por tu cuenta. Sé que puedes hacer eso, así que completa este ejercicio, y luego cuál es la solución. 159. Solución: API de inicio de sesión del usuario: Espero que completes el ejercicio o intentes resolverlo. Ahora veamos la solución. Entonces Enrutador, punto de publicación, y punto para reducir el inicio de sesión Y aquí pasamos función asíncrona con solicitud y respuesta Ahora, antes que nada, en esta función de devolución de llamada, obtenemos los datos del cuerpo de la solicitud Por lo tanto, el objeto costo es igual a solicitar el cuerpo del punto. Y aquí llegamos a nombre de usuario y contraseña. Ahora podemos pasar condición si el nombre de usuario no está disponible o la contraseña no está disponible, entonces devolvemos error. Entonces devuelve respuesta, estado, 400 Json. Aquí pasamos Object success a false y message para por favor proporcionar nombre de usuario y contraseña. Ahora después de eso, encontraremos al usuario con este nombre de usuario. Costo usuario es igual a esperar usuario punto Fine one. Aquí en el objeto, pasamos nombre de usuario a nombre de usuario, o también podemos eliminar este. Ahora es posible que no encontremos ningún usuario con el nombre de usuario dado. Si el usuario no está disponible, entonces devolvemos el estado del punto de respuesta, objeto Json de 400 puntos con éxito a false y el mensaje a las credenciales no válidas. Ahora si encontramos al usuario, entonces necesitamos comparar la contraseña usando Biblioteca BCRP Segundo, contraseña válida es igual a esperar, B crypt punto comparar. Primero, pasamos contraseña de entrada, que son front ensend en el cuerpo de la solicitud, y en el segundo argumento, pasamos contraseña de punto de usuario Simplemente pasamos aquí otra condición que la contraseña válida es falsa o no está disponible, luego devolvemos el código de estado del punto de respuesta 401, que significa token de autenticación inválido o faltante. Además, enviamos objeto Json con éxito a false y message a credenciales inválidas. Aquí, si especificamos contraseña no coincidente, entonces significa que encontramos usuario y simplemente contraseña no coincide. Además, aquí creo que tenemos que pasar el mismo código de estado para usuario no encontrado. Cambia este 400 con 401 y el mensaje también es credenciales inválidas. Ahora, si se verifica la contraseña, entonces podemos generar token fresco y enviarlo en la respuesta. Entonces const token es igual a generar token. Aquí pasamos el objeto de datos con subrayado al ID de subrayado de punto de usuario, y el nombre de usuario al nombre de usuario de punto de usuario Al último punto de respuesta Json enviar este token. Eso es. Ahora probemos esta API. En el cartero, creamos una nueva solicitud llamada Login a user Aquí seleccionamos el método SDTP para publicar endpoint a SDTP, Column double for or slash, host local, Column 3,000, slash API, slash user slash login, user slash login Column double for or slash, host local, Column 3,000, slash API, slash user slash login, y enviamos la solicitud. Ver, aquí obtenemos error, no se puede desestructurar propiedad nombre de usuario Entonces aquí tenemos que pasar datos en cuerpo. Selecciona cuerpo, crudo, aquí pasamos objeto con username a code, bless y password al 12345678 y mandamos Ver, aquí nos sale el mensaje, credenciales inválidas porque paso un nombre de usuario incorrecto. Cambio mi nombre de usuario a código original subrayado bendecir, y enviar la solicitud Mira, aquí obtenemos el token, lo que significa que nuestra API está funcionando bien. 160. Implementar token de acceso y actualizar token [ACTUALIZACIÓN]: Ahora como hemos visto en nuestro proyecto anterior sobre el registro y el inicio de sesión, volvemos a tokens, 14 token de acceso, que es sort leaf o caducidad SOT, y otro es refresh token, que es long leaf o long expire token. En resumen, cuando el token de acceso caduca, front-end envía la solicitud a algún punto final como reprimir En la reprensa verificamos el token de actualización, y luego devolvemos un nuevo token de acceso Esta es la lógica. Ahora vamos a implementar esto rápidamente en nuestro tercer proyecto. Entonces en la parte inferior, tenemos generar función token. Podemos renombrar esto para generar tokens. Ahora tenemos que volver a fichas a partir de aquí. Entonces almacenamos este primer token en la variable llamada token de exceso, y luego aquí lo configuramos caduca en propiedad para digamos 1 hora. En producción, podemos agregar el exceso de caducidad de token a tres o 4 horas. Pero para probar fácilmente esta aplicación, no estoy configurando el tiempo de caducidad para el exceso de token. De nuevo, te lo estoy diciendo solo para las pruebas, así que no necesitamos generar otro exceso de token nuestras próximas APIs. Ahora duplicar esta línea, cambiarla variable para refrescar token, ta, la cambiamos a objeto, subrayamos ID a datos punto subrayado Y aquí agregamos escena de caducidad a 30 días porque esta es una aplicación de redes sociales por fin, simplemente volvemos un objeto con acceso y token de actualización. Además, establecemos diferentes claves secretas para token de acceso y token de actualización. No es necesario, pero es mejor que lo hagamos. Pt NV en el lugar de la clave JWT, agregamos token de acceso, clave y después de eso, definimos otra variable, reprimimos token, key es igual a nuestra clave secreta Guarde esto y vuelva a nuestro archivo de salida de usuario. Aquí, cambiamos la clave secreta para acceder a la clave de token. Y para el token de actualización, lo cambiamos para refrescar la clave de token. Ahora en la API de inicio de sesión, cambie el nombre de esta función para generar tokens. En el lugar de obtener token, obtenemos object y desestructuramos el exceso de token y refrescamos token de esta función Bueno. Ahora aquí estamos un exceso de token en la respuesta. Además, ¿ me puede decir qué tenemos que hacer antes de enviar el token sobrante en la respuesta? Derecha. Tenemos que almacenar token de actualización en la colección del usuario, y luego vender token de actualización en la cookie SDTP solamente Entonces aquí esperamos Bcrt punto s. aquí, pasamos token de actualización, coma pasamos aquí sal a diez Esta expresión devuelve el token. Entonces lo almacenamos en variable llamada Nu he repres token. Después de eso, el token de represión de punto de usuario es igual a New has repress Entonces tenemos que esperar al usuario punto C. Ahora solo tenemos que configurar token de actualización en la cookie para recordar cómo usamos response dot Cookie. Aquí, pasamos el nombre de la cookie, que es token de actualización. Aquí agregamos token de actualización y en el tercer parámetro, necesitamos pasar objeto de configuración. Aquí, la primera propiedad es solo SDDP, que establecemos en true, secure a false, pero asegúrate de que para la producción, tú la haces verdad Mismo sitio para rayar para el mismo dominio, pero actualmente, lo configuramos en ninguno, y por fin, podemos pasar mensaje a 30 días en 24 horas en 60 minutos en 60 segundos en 1,000 milisegundos y Ahora tenemos que simplemente copiar esta lógica desde la generación de token hasta enviar respuesta y pegarla aquí en esta API. Y aquí, tenemos que cambiar solo ID de subrayado de punto de usuario a ID de subrayado de punto de usuario nuevo, nombre de usuario de punto de nuevo usuario, token de actualización de punto, y también Nwuser dot Por fin en la respuesta, también agregamos estatus a 201. 161. Ruta de actualización y cierre de sesión [ACTUALIZACIÓN]: Ahora, vamos a crear ruta para refrescar, así que Route dot post slash refresh y aquí agregamos función de devolución de llamada ASN con solicitud Ahora, antes que nada, necesitamos obtener el token de actualización de la Cookie. Entonces const user refresh token es igual a request dot Cookie, dot refresh token Aquí no obtenemos esta cookie porque en nuestro middleware Express, no ddt Cookie parser middleware, y para eso, necesitamos paquete Cookie parser, abrir terminal, y aquí escribimos NPM install Cookies parser y pulsamos Enter esta cookie porque en nuestro middleware Express, no ddt Cookie parser middleware, y para eso, necesitamos paquete Cookie parser, abrir terminal, y aquí escribimos NPM install Cookies parser y pulsamos Enter. Bueno. Ahora abre el archivo index dot gs. En la parte superior, entramos const Cookie parser es igual a requerir Cookie En la parte inferior, agregamos app dot g, Cookie parser. Asegúrate de llamar a esta función aquí. Guarda este archivo y vuelve a nuestra ruta. Aquí, pasamos condición. Si el token de actualización de usuario no está disponible, entonces devolvemos el estado del punto de respuesta 401 punto Json, y aquí pasamos el mensaje. No, se proporciona token de actualización. Después de eso, necesitamos el ID de usuario que envíe la solicitud de token de acceso y cómo lo obtendremos del token de actualización, tenemos que decodificar este token de actualización Costo decodificado usuario es igual a JWT dot Verify aquí pasamos user refresh token y después de eso, pasamos el proceso de clave secreta de actualización punto ENV dot refresh token, Ahora bien, esta expresión podría devolver error, así que agregamos aquí, intenta y gatchblog simplemente mueve esta línea en el blog seco Y en el blog de caché, devolvemos response dot status 403, 44 PDN dot JSON, y pasamos tu mensaje a token de actualización no válido También, como sabemos, cuando definimos variable usando costo, solo será accesible en este blog seco. Entonces tenemos que definirlo antes del blog seco. Y quitar costo de aquí. Ahora, después de eso, costo usuario es igual a un peso, usuario punto fino BYD Y aquí pasamos descodificado usuario punto subrayado ID. Y luego si el usuario no está disponible, entonces devolvemos el estado del punto de respuesta 404 punto Json. Y aquí agregamos propiedad de mensaje al usuario no encontrado. Ahora, si encontramos usuario, entonces tenemos que comparar tokens, y para eso, simplemente usamos paquete BCRP Así que espera, comparación de puntos BCRP. Pasamos token de actualización de usuario, que obtenemos de la cookie y lo comparamos con el token de actualización de punto de usuario. Esta expresión devuelve el resultado para la comparación. Secons es válido. Y ademas aqui pasamos otra condicion I es valida es falsa, entonces volvemos a devolver respuesta punto status 403 punto Json con mensaje para refrescar token no es valido. Ahora bien, si los tokens son válidos, entonces ¿qué vamos a hacer? Crearemos nuevos tokens, almacenaremos el token de actualización en la colección del usuario, estableceremos el token de actualización en la cookie SDDPoly y luego devolveremos el token en exceso Estos pasos ya los hicimos en la API de registro e inicio de sesión. Copia el simplemente lo pegamos para actualizar la API y listo. Ahora definamos rápidamente API para cerrar sesión también. Entonces probaremos juntos estos dos APIs. Ruta, poste de dardo, punto a corte Cerrar sesión. Recuerda para este proyecto en front end, tenemos que golpear API para slash API, slash user, slash refresh o logout point porque los agregamos en Aquí, agregamos devolución de llamada ASN con solicitud y respuesta. Ahora bien, ¿me puede decir qué debemos hacer en el cierre? Cierto, es realmente sencillo. Tenemos que eliminar el token de actualización de la cookie, y luego simplemente eliminamos el token de la colección del usuario también. Además, al hablar contigo sobre la colección del usuario, recuerdo que no agregamos token de actualización rellenado en la colección del usuario. Entonces hagamos eso primero, y luego completaremos esta ruta de bloqueo. Entonces el modelo de un usuario, y en la parte inferior, agregamos astken relleno al objeto, al tipo, a la cadena No nos adherimos requeridos porque cuando nuestro usuario se bloquea, entonces tenemos que quitar el astken Si agregamos requerido, entonces no nos permitirá hacer eso. Tan simple como eso. Ahora en la API de cierre de sesión, iniciar tarea es muy similar a actualizar API Por ejemplo, también necesitamos obtener el token de la cookie, buscar el token de actualización del usuario y luego convertirlo en nulo. Así que vamos a copiar el código de la API de actualización y pegarlo aquí. Bueno. Ahora vamos a revisar este código desde el inicio. Esto es bueno. Esto también es bueno hasta que consigamos al usuario. Aquí, no necesitamos crear tokens, así que podemos eliminar esto. Además, no necesitamos hacerlo como el token, así podemos eliminar esta línea, y luego aquí almacenamos null en el token de repress Ahora en el lugar de respuesta, dardo Cookie, usamos response, dot clear Cookie. Al principio, pasamos el nombre de la cookie que está bien. Después de eso, aquí no necesitamos pasar esta variable token de actualización, sino que necesitamos este objeto de configuración, y por fin, simplemente devolvemos mensaje en el lugar de token de acceso, bloqueado con éxito y hecho. Ahora probemos rápidamente estas API. Entonces, un cartero en la carpeta del usuario, creamos una nueva solicitud llamada repress access token Necesitamos postsolicitud. Punto a SDD P, Columna doble diagonal hacia adelante, host local Columna 3,000, slash APIs usuario, slash reprime y envía Ver, aquí obtenemos error porque no tenemos Cookie, vaya a Iniciar sesión Ruta, enviar la solicitud con los datos de escritura. Ver aquí obtenemos token y también reprimir token se establece en Cookie Ahora de vuelta a reprimir API, enviar la solicitud de nuevo. Mira, aquí tenemos el nuevo token. Genial. Ahora probemos Logout API. Simplemente duplique este gusto de solicitud y cambiamos el nombre de la solicitud para digamos cerrar la sesión de un usuario, y también cambiamos el punto final de la API para reducir el usuario, reducir el cierre de sesión y enviar Verás, obtenemos mensaje de éxito, y si comprobamos la cookie, mira, aquí no obtenemos un token de actualización, ambas API están funcionando bien. Además, quiero decirles que esta lección actual y anterior son lecciones actualizadas. Si en el futuro, no ves este código en mi grabación de pantalla, entonces no te preocupes, puedes seguir absolutamente esas lecciones. Yo sólo quiero que las coures estén lo más actualizadas posible. También aprenderás las mejores prácticas actuales para Node jazz. 162. Detalles de usuario registrados actuales: Vamos a crear otra API para enviar los datos de los usuarios conectados. Entonces aquí agregamos otro punto de enrutador Obtener punto para reenviar barra diagonal y simplemente pasar aquí función de devolución de llamada ASN con solicitud Bueno. Ahora en esta función, costo usuario es igual a esperar usuario punto encontrar Por ID. Y aquí simplemente pasamos ID de usuario. Pero, ¿cómo podemos obtener esa identificación? Sí, necesitamos extraer ese ID del token JWT. Y para eso, necesitamos crear Osmddalware. Por ahora, completamos esta API, y luego agregaremos Othmidalware Aquí pasamos solicitud punto usuario punto subrayado ID. Ahora, no queremos enviar contraseña con estos datos. Agregamos aquí el método de selección de punto, y en la cadena, agregamos menos contraseña. Después de eso, si no obtenemos el usuario, entonces pasamos la condición I, el usuario no está disponible, usuario no está disponible, entonces devolvemos el estado del punto de respuesta 404. También pasa punto GSN Object con éxito a caídas y mensaje al usuario, no encontrado Si encontramos al usuario, entonces simplemente lo devolvemos en respuesta dot Json user. Ahora muchos estudiantes podrían preguntar, ¿podemos ver el código de proyectos anterior mientras lo aplicamos en nuestro nuevo proyecto? Sí, claro, se puede ver ese código. Solo piensa, ¿hay algo que puedas mejorar en ese código? En caso afirmativo, entonces mejorarlo, y si no, entonces quédate con ese código. No hay nada de malo en eso. Vamos a crear middleware de Os. Entonces en nuestro proyecto, creamos una nueva carpeta llamada middleware Y en esa carpeta, creamos un nuevo archivo middleware llamado oth dot js Ahora, antes que nada, aquí creamos una función llamada OT y sabemos que esta es la función middleware Entonces llegaremos aquí tres parámetros, request, response, y next. Ahora en esta función, primero obtenemos un token del encabezado de solicitud. ¿Recuerdas en qué encabezado, nuestro front-end pasará el token? Escriba en el encabezado de autorización, el encabezado SecondsTo es igual a solicitar encabezados de punto autorización de puntos Después de eso, verificamos el estado. Si el encabezado de autenticación no está disponible, o el punto de encabezado oth comienza con aquí en los códigos, pasamos el espacio Barr Si esto no es cierto, entonces devolvemos error. Entonces devuelva la respuesta, el estado del punto 401 para el objeto Json no autorizado, el éxito para forzar, y mensaje a la autorización, token requerido. Ahora bien, si obtenemos oth header, entonces necesitamos extraer nuestro token de ese encabezado. Así costo token es igual a oth header dot split method, en códigos, pasamos ritmo, y aquí necesitamos segundo ítem, así corchete cuadrado, índice uno. Ya lo vimos en el proyecto anterior. Derecha. Entonces ahora tenemos una ficha. Lo único es que necesitamos verificar el token y establecer los datos de nuestros usuarios en request dot user. Secct decodificado usuario es igual a JWT punto Verify. Aquí, primero, pasamos nuestro token, que obtenemos del encabezado. Y luego en segundo argumento, pasamos proceso punto EV punto JWT clave subrayado Simplemente podemos establecer esta variable como request dot user. Solicitar usuario punto es igual a usuario decodificado, y luego llamamos siguiente función. Esto es lo más importante. Ahora bien, ¿y si no obtenemos este usuario decodificado? Si no manejamos esto, entonces obtendremos error. Entonces manejamos esto con try and catch block. Aquí intentamos el bloque de caché y simplemente movemos estas tres líneas en el bloque try. En el bloque de caché, simplemente devolvemos respuesta, estado de punto, 401, punto Json, Object, éxito a falso y mensaje a token no válido. Y hecho. Ahora vamos a exportar esta función. Por lo tanto, las exportaciones de punto del módulo son iguales a OT. Ahora volvemos a nuestra ruta de usuarios. Aquí en nuestro GIPI, agregamos oth middleware, ver en Bonito. Ahora probemos esto. Entonces cuando Cartero, aquí agregamos nueva solicitud llamada actual bloqueada en punto de usuario a SJDP, Columna doble barra cuatro host Local, Columna 3,000 API slash usuario y Ver, aquí obtenemos error, se requiere token de autorización. Entonces de la llamada a la API anterior, copiamos este token JWT, y en nuestra API actual, vamos a los encabezados Aquí, agregamos encabezado de autorización. Valorar al espacio Barr y pegar nuestro token y enviar la solicitud Ver, aquí me sale token inválido, pero por qué paso el token válido. Comprobemos la terminal. Ver, servidor también se está ejecutando. Creo que el error está ocurriendo en el bloque seco y caché. Por eso mi servidor sigue funcionando. Así que aquí en el bloque de caché, agregamos consola dot log este error. Establece los cambios y vuelve a enviar la solicitud. Ahora volvemos al código VS, volvemos a la terminal, y aquí obtenemos error, JWT no está definido Oh, olvidé importar JWT del paquete de token web JSON Entonces, en la const superior, JWT es igual al token web JSN requerido Se puede ver así es como podemos resolver el error. No te asuste si ocurren errores en tu código. Intenta resolverlo paso a paso. Si ocurren muchos errores, podemos aprender más sobre nuestros errores, y con eso, podemos mejorar nuestro código. Así que no te preocupes por los errores. Ver los cambios y echar un vistazo. Ver, aquí obtenemos los detalles de uso sin contraseña. 163. Cómo restablecer la contraseña del usuario: Ahora implementemos la función de restablecimiento de contraseña en nuestra aplicación. Primero, entendamos la visión general de esta característica. Entonces, cuando el usuario ingrese su correo electrónico y haga clic en el botón de restablecer contraseña, entonces llamaremos a nuestra primera solicitud de API Restablecimiento de contraseña. Ahora, esta API generará un nuevo token y enviará una URL con ese token en su correo electrónico. Cuando los usuarios hagan clic en ese enlace del sitio web, tomaremos una nueva contraseña del usuario, y cuando los usuarios hagan clic en enviar, llamaremos a nuestra segunda contraseña de restablecimiento de API. En esta API, verificaremos ese token y actualizaremos la nueva contraseña en el documento de usuario. Si todo esto funciona bien, entonces devolveremos mensaje, contraseña, reiniciaremos con éxito. Aquí, tenemos que crear dos API, solicitar el restablecimiento de contraseña y restablecer la contraseña. Así que comencemos con la creación de la primera API, así Router punto post endpoint para solicitar la contraseña de Ds, D reset, y también agregamos función de devolución de llamada ASN con solicitud y respuesta Entonces aquí no estamos agregando ware ortomidal porque queremos que cualquiera pueda restablecer su contraseña Están haciendo reset password porque en el 99% de los casos, olvidaron su contraseña, así que no pueden iniciar sesión, y por eso no agregamos aquí orthomidalware Ahora, antes que nada, obtenemos un correo electrónico de usuario del cuerpo de la solicitud. El objeto Secons es igual al cuerpo del punto de solicitud. Y aquí nos llega el correo electrónico. Ahora usando este correo electrónico, primero verifiquemos que el usuario esté disponible o no. Entonces const user es igual a esperar usuario punto Fine one. Y aquí pasamos objeto de comparación con correo electrónico a correo electrónico. A continuación, pasamos condición. Si el usuario no está disponible, entonces devolvemos respuesta que código de estado 404 punto Json Object con éxito a caídas y mensaje dos, este correo electrónico no está registrado, o también podemos pasar usuario no encontrado. Depende totalmente de ti. Ahora si el usuario está disponible, entonces ¿qué haremos? Bien, vamos a generar token. Entonces costo, el token de reinicio es igual al seno de punto JWT. Primero, pasamos nuestros datos, así objeto, subrayado ID a usuario punto subrayado Y en el segundo parámetro, pasamos clave JWT, así proceso punto Env punto clave de subrayado JWT Y también en el tercer argumento, pasamos objeto con expiries en propiedad a 1 hora porque aquí queremos agregar estos expiries en propiedad, y por eso no usamos aquí Tenemos token de reinicio. Ahora solo queremos enviarlo al correo electrónico de nuestro usuario. Enviar un correo electrónico es una lógica separada, por lo que actualmente, no lo implementamos. Primero, creamos nuestras dos APIs de reinicio para que no te confunda Entonces aquí estamos escribiendo comentario para enviar correo electrónico y luego simplemente devolver respuesta Json. Aquí pasamos Objeto con propiedad de mensaje, restablecimiento de contraseña, enlace, enviar al correo electrónico. Y después de eso, también pasamos token de reinicio para restablecer token. Enviando este token de reinicio en respuesta porque aún no enviamos correo electrónico. Es sólo para pruebas. Después de enviar el correo electrónico, no necesitamos pasar el token de reinicio en la respuesta. Ahora, definamos nuestra segunda API en la que verificaremos ese token de reinicio y guardaremos la nueva contraseña. Así router punto post y punto para reducir restablecer la contraseña. Y aquí agregamos función de devolución de llamada ASN con solicitud y respuesta En primer lugar, obtenemos rellenos del cuerpo de solicitud. Así que el objeto Const es igual a solicitar el cuerpo del punto, y aquí desestructuramos el token de reinicio y además obtenemos la nueva contraseña que el usuario quiere actualizar Aquí necesitamos realizar dos pasos. Paso uno, verificar el token, y el paso dos, si el token está verificado, luego actualice la contraseña. Tan simple como eso. Entonces para verificar el token, podemos usar JWT dot Verify Al principio, pasamos nuestro token de reinicio. El segundo argumento, necesitamos agregar nuestro JWT key process dot ENV dot JWT Ahora bien, esta expresión nos dará a los usuarios datos que pasamos cuando generemos este token. Ver aquí en la parte superior, pasamos ID de subrayado a ID de subrayado de punto de usuario Almacenamos eso en la variable llamada usuario decodificado. Ahora encontramos al usuario usando ese ID de guión bajo y luego actualizamos la contraseña Dejar usuario es igual a esperar usuario punto encontrar por ID. Y aquí pasamos descodificado usuario punto subrayado ID. Ahora después de eso, pasamos condición. Si el usuario no está disponible, entonces devolvemos respuesta con Status Code 400 dot Json Object con éxito a false y mensaje a token inválido o caducado. Ahora si conseguimos el usuario, entonces simplemente actualizaremos la contraseña. Aquí, para contraseña, necesitamos primero tener esa contraseña. No podemos almacenarlo tal como está. Esperen, punto cripta tiene aquí, primero, pasamos nueva contraseña, y en el segundo argumento, pasamos la Sal, que es diez. Esto generará una contraseña, por lo que podemos almacenar directamente esa en contraseña de punto de usuario, y por debajo de eso, simplemente esperamos al usuario punto CV. Y por fin, simplemente devolvemos objeto Json de punto de respuesta con propiedad de mensaje, restablecimiento de contraseña con éxito, y eso es todo. En la primera API, generamos el token de reinicio y lo enviamos con correo electrónico, y en la segunda API, usuario nos enviará ese token de reinicio y lo verificaremos. Si se verifica, sólo entonces actualizaremos esa contraseña. Aquí en la verificación de tokens, tenemos poco problema de seguridad. Aquí solo estamos verificando el token usando JWTKey, pero esto no es muy seguro Déjame explicarte con un ejemplo sencillo. Supongamos que los usuarios envían solicitudes de restablecimiento de contraseña. En el back end, generamos un token de reset y lo enviamos al usuario. Ahora podría suceder, usuario puede volver a enviar la solicitud de la contraseña de restablecimiento, y nuevamente enviamos el nuevo token de reinicio al usuario. Ahora bien, estos son dos tokens que se validan para restablecer la contraseña Supongamos que el usuario pasa el segundo token y cambia la contraseña. Ahora bien, ¿y si este primer token antiguo los hackers obtienen y cambian la contraseña usando este token de reinicio antiguo Esta implementación es poco arriesgada. Ahora bien, ¿cuál es la solución aquí? Es realmente simple. Cuando generamos un token de reinicio en nuestra primera API en el momento antes de enviar el correo electrónico, almacenaremos el token de reinicio en la colección de nuestro usuario. También almacenamos el token caduca y el tiempo. Ahora, cuando verifiquemos el token, compararemos el token de reinicio almacenado con el token de reinicio del usuario. Si ambos coinciden y el token no está caducado, entonces actualizaremos la contraseña. Solo por este enfoque, el último token de reinicio es válido y solo para los caducos y el tiempo. Este enfoque es más seguro que el anterior. Entonces vamos a implementar esto. Aquí antes de enviar correo electrónico, escribimos user dot Reset token es igual a reset token, y user dot reset token, caduca es igual a la fecha punto ahora, además, queremos agregar 1 hora expira. Entonces 60 minutos en 60 segundos en 1,000. Convertir segundos en milisegundos. Y después de eso, podemos esperar al usuario punto c. También en la parte superior, convertimos este usuario const a al usuario Y también, necesitamos agregar estos dos rellenos en el modelo de nuestro usuario. Entonces, cuando el usuario Schema, aquí, al final, agregamos reset token a object, type to string, y después de eso, reset token expira a object y type to date, guardamos los cambios, y volvemos a nuestra API de reset. La parte de verificación, agregamos condición si el usuario no está disponible, o el token de reinicio de punto de usuario es igual a restablecer token o el token de reinicio de punto de usuario caduca es menor o igual a punto de fecha ahora. Si alguna de estas condiciones es cierta, entonces devolveremos el token caducado, y el token no se verifica. Además, después de actualizar la contraseña, necesitamos hacer nulos estos dos rellenos. Antes del punto c del usuario, establecemos el reset del punto del usuario, token es igual a nulo y el token del reset del punto del usuario expira es igual a nulo. Esto es más seguro. Si el usuario restablece correctamente la contraseña, no hay tokens que sean válidos para restablecer la contraseña. Ahora vamos a probar esta implementación. En el cartero, creamos una nueva solicitud llamada request , reset password, method, to post point to SDDP, Column double forward slash local host, Column 3,000, slash API, slash user, slash request, Y en cuerpo, vamos a raw y aquí pasamos objeto JN con correo electrónico. Asegúrate de pasar Correo electrónico válido y también ese correo electrónico debe estar en tu correo electrónico de usuario. De lo contrario, obtendremos usuario no encontrado. Si no pasa correo electrónico válido en los datos del usuario, entonces desde el Mongo Di convertirse en pase, puede cambiar eso Ahora envía la solicitud aquí, me sale Ken no encontrado. Déjame revisar el punto final. Oh, aquí está solicitud, hay contraseña, restablecemos. Y en mi punto final, escribo solicitud, vamos a restablecer, des contraseña. Entonces cambio este punto final y envío esta solicitud. Mira, aquí obtenemos un token de reinicio, copiamos este token, y necesitamos crear una nueva solicitud llamada método de restablecimiento de contraseña para publicar y punto final a SDDP, Columna doble barra hacia adelante host local, Columna 3,000, barra de usuario de API, barra diagonal Además, aquí necesitamos pasar body, raw object con reset token, y pegar ese token. Y luego pasamos la nueva contraseña. 123-45-6789. Ahora envía la solicitud. Ver, obtenemos el restablecimiento de contraseña con éxito. Entonces ambas API están funcionando. Ahora, lo único que queremos hacer es que necesitamos enviar este token o enlace de página de reinicio en el correo electrónico del usuario, y lo veremos en la siguiente lección. 164. Formas de envío de correo electrónico en Node JS: Ahora hay muchas formas de enviar correo electrónico desde la aplicación de nodo. El primero es mediante el uso de SMTP, que es un protocolo simple de transferencia de correo segunda forma es mediante el uso de la API de SendGrid, y la tercera forma es por Amazon SS, que es un servicio de correo electrónico simple Ahora veamos los pros y los contras de cada forma, lo que nos ayudará a decidir qué servicio de correo electrónico podemos usar para nuestra aplicación. Entonces SMTP funciona mejor para aplicaciones pequeñas porque es simple de configurar, necesitamos pasar solo el correo electrónico y la contraseña de nuestra cuenta, y luego SMTP enviará ese correo electrónico desde nuestra Pero SMTP es poco lento en comparación con otros servicios de correo electrónico Además, con SMTP, solo podemos enviar una cantidad limitada de correos electrónicos Por ejemplo, si usamos Gmail, entonces solo podemos enviar 500 correos electrónicos por día. Si usamos Yahoo, entonces podemos enviar solo 100 correos electrónicos por día. SMTP no es escalable para grandes empresas. Está bien para aplicaciones pequeñas. Ahora pasemos a SNGrid. En SendGrid, no necesitamos pasar correo electrónico y la contraseña de nuestra En lugar de eso, necesitamos generar ApiKey y enviaremos correo electrónico usando la API de SendGrids Entonces esto es rápido y confiable. También es fácil de configurar. Muchas empresas utilizan SendGrid para enviar correos electrónicos masivos como Uber, AirBnB, app, etcétera. Pero para enviar correos electrónicos ilimitados, necesitamos comprar su plan de pago. Ahora pasemos a Amazon SES. Este es el servicio de correo electrónico más confiable y seguro utilizado por grandes empresas como Netflix, LinkedIn, etcétera También es muy rápido. Podemos enviar millones de correos electrónicos por día, y además su plan pago es más barato que los planes de Sandgrad, pero el único contras es que es poco difícil de configurar Eso lo podemos manejar. Entonces aquí, podemos ver claramente que si necesitamos velocidad, seguridad y bajo costo, entonces podemos usar Amazon SES. Entonces, en la siguiente lección, implementaremos Amazon SES en nuestra aplicación. 165. Cómo configurar Amazon SES para enviar correos electrónicos: Implementemos la encuesta de correo electrónico Amazon Simple en nuestra aplicación de nodo. Es realmente simple. Esto lo desgloso en tres pasos. Paso uno, configurar el SS en la aplicación de nodo. Paso dos, crear una cuenta de Amazon SS y verificar el correo electrónico para probar. Paso tres, enviaremos correo electrónico de prueba desde nuestra API. Aquí quiero aclarar una cosa para configurar la cuenta de Amazon SS, necesitamos los datos de la tarjeta de pago y los datos de identidad. No necesitamos pagar nada, necesitamos los datos de la tarjeta. Aquí usaremos pre versión de Amazon SES. Entonces, si no tiene esos detalles, puede omitir esta lección y puede aplicar remitente de correo electrónico gratuito usando SMTP en la siguiente lección Para implementar Amazon SES, necesitamos instalar el paquete de AWS. Así que NPM instala en dit AWS sdk client Ss a la tasa 3.738 0.0 y pulsa Enter Bueno. Minimizar el terminal. Ahora en nuestro proyecto, creamos una nueva carpeta llamada Config y en esa carpeta, creamos un nuevo archivo llamado Amazons dot js En primer lugar, necesitamos configurar el cliente SS y para eso, necesitamos el método del cliente SS. Así Const CL soportes. Aquí conseguimos SS cliente es igual a requerir a la tasa aws SDK cliente Ss. Después de eso, const, como cliente es igual a nuevo como cliente y dentro de él, tenemos que pasar el objeto de inicialización Ahora la primera propiedad del objeto es region. Aquí, tenemos que pasar por nuestra región. Almacenaremos la región en el archivo ENV, por lo que agregamos aquí process dot ENV Aws Score Después de eso, tenemos que pasar credenciales propiedad. Ahora bien, esto es realmente importante. Sin esto, no podemos enviar correo electrónico. Aquí pasamos objeto con exceso de ID de clave, y también necesitamos pasar clave secreta en exceso. Estas dos propiedades las obtendremos cuando creemos una cuenta en la Amazon AWS. No te preocupes. Primero configuramos todos estos en nuestra aplicación de nodo, y luego crearemos una nueva cuenta en Amazon Aws. Entonces aquí también pasamos proceso punto Un punto Aws, subrayado Xs, subrayado clave Para secreto, pasamos proceso punto n punto Aws, subrayado, clave de subrayado secreto, y hecho Ahora solo necesitamos crear la función Enviar correo electrónico y agregar algunos rellenos de correo electrónico. Entonces Const enviar correo electrónico es igual a la función de flecha. Aquí, antes nos olvidamos de agregar try y cache block, los agregamos, y en el cache, simplemente consola dot log, Amazon, error SCS Aquí agregamos este error. Ahora, escribamos nuestro código en try blog. Si algo sale mal, entonces nuestro bloque de caché consolará ese error. Ahora para enviar el correo electrónico, necesitamos proporcionar alguna información del correo electrónico, queremos enviar correo electrónico a qué correo electrónico queremos enviar, cuál es el asunto, cuál es el cuerpo, etcétera Así que los parámetros de costo es igual a objeto. Aquí, primero tenemos una fuente, aquí, tenemos que pasar nuestra dirección de correo electrónico verificada, cual verificaremos en la página web de Amazon SS. No te preocupes, no escribas nada por ahora. Déjalo plan. Asegúrate de escribir este nombre de propiedades en la capital, igual que yo escribo. De lo contrario, obtendrá error. Ahora, después de la fuente, agregamos destino, objeto addhee con propiedad a dirección, y aquí tenemos que pasar matriz de correos electrónicos a los que queremos enviar También podemos enviar correos electrónicos a múltiples usuarios. Ahora bien, ¿cómo podemos obtener esa dirección de correo electrónico en esta función? Derecha, a partir de los parámetros. Entonces aquí agregamos dos, que es la dirección de correo electrónico. Además, necesitamos asunto del correo electrónico y también necesitamos el texto del correo electrónico. Ahora, aquí en la dirección dos, agregamos dos parámetros. Aquí, si tenemos múltiples, entonces podemos agregar esos ID de correo electrónico también con coma Ahora después del destino, agregamos la propiedad del mensaje al objeto. Primero, agregamos sujeto a objeto con propiedad de datos aquí, tenemos que pasar el asunto que obtenemos del parámetro. Ahora después de asunto, agregamos cuerpo a objeto, texto a objeto, y dentro de estos datos al texto, que nuevamente obtenemos del parámetro. Sé que esta es una sintaxis un poco extraña, pero es lo que es. Tenemos que seguir eso. Ahora tenemos listas nuestras permanente Ahora podemos crear comando para estas perams. Const, comando es igual a Nuevo enviar correo electrónico, comando. S, la entrada automática funciona, y aquí simplemente pasamos perams Ahora necesitamos enviar este comando para enviar el correo electrónico. Entonces Ss cliente punto SN, y aquí pasamos comando. Ahora como sabemos, enviar el correo electrónico llevará algún tiempo, por lo que será una tarea asincrónica Y para eso, nos adherimos aguardan. Y por esperar, necesitamos hacer esta función asíncrona Ahora vamos a hacer la respuesta en la variable de respuesta, y al final, simplemente agregamos consola dot log, email sent successfully message ID column, y aquí devolvemos response dot message ID. Al final de este archivo, simplemente módulo de exportaciones de punto es igual a enviar correo electrónico. Asegúrate de no llamar a esta función aquí. Sólo tenemos que pasar la referencia. También, aquí en las fuentes, pasamos proceso punto En punto Aws subrayado, correo electrónico, que será nuestro correo electrónico desde el que queremos enviar correo electrónico Entonces aquí, nuestro paso número uno está hecho. Solo necesitamos agregar estas tres variables en el archivo ENV y también necesitamos pasar este correo fuente Dirígete al navegador y ve a aws.amazon.com. Y aquí necesitamos crear una nueva cuenta de AWS. Aquí, escribimos nuestra dirección de correo electrónico, y aquí tenemos que pasar nuestro nombre de cuenta de AWS. Por ahora, pasa cualquier cosa, podemos cambiarlo más tarde desde la configuración. Haga clic en Verificar dirección de correo electrónico. Después de eso, va a pedir contraseña, simplemente crear una contraseña y continuar aquí vemos como plan personal, y además tenemos que pasar nuestros datos. Rápidamente escribo mis datos y estoy de acuerdo y continúo. Ahora aquí, tenemos que pasar los datos de la tarjeta. Si no tienes los datos de la tarjeta o no quieres dar tu información, entonces puedes implementar SMTP porque la mayoría de los estudiantes no tienen tarjeta, por lo que puedes implementar SMTP, que solo usa tu Eso te voy a mostrar en la siguiente lección. Por ahora, paso datos de su tarjeta y luego verifico y continúo. Esto procesará pagos pequeños como $1 o incluso más pequeños para la verificación de su tarjeta. Entonces aquí entro mi pago OTP se está procesando y aquí se hace el pago Ahora tenemos que aportar identidad. Seleccione su uso personal. Si quieres usar para negocios, entonces puedes seleccionar eso también. A continuación, seleccionamos individuo, y aquí necesitamos proporcionar documento de identidad. Por lo que rápidamente llené este formulario y también subo mi documento y hago clic en Continuar. Aquí se proporcionan algunos detalles más para su verificación. Escribo aquí mi número de teléfono y envío SMS. Si eres de otro país, entonces podrías obtener otro relleno. Aquí, verifico mi número con OTP y luego continúo. Ahora aquí acabamos de establecer este plan básico gratuito, y finalmente completar el registro Dn ir a la consola de administración de AWS. Mira, aquí estamos en la Consola. En primer lugar, verificaremos nuestro correo electrónico remitente. Entonces, en la parte superior, inserte SE y abra esta página de Amazon SS. Da click en estas tres líneas y ve a identidades para verificar correo electrónico o dominio. Aquí, tenemos que crear identidades. Ahora si quieres usar para producción, entonces tienes que verificar tu dominio aquí. Pero ahora para probar, podemos usar tu correo electrónico. Aquí, escribimos nuestra dirección de correo electrónico desde la que queremos enviar correo electrónico a los usuarios y damos clic en Crear identidad. Consulta aquí obtenemos verificación pendiente. Amazon tiene S enviar correo electrónico a ese correo electrónico y necesitamos verificarlo. Entonces aquí abro ese correo electrónico. Da click en este enlace, ve la verificación realizada, y si actualizamos esa página, mira aquí también nos verifican. Entonces tenemos que copiar este correo electrónico y en nuestra aplicación de nodo en las fuentes, agregamos correo electrónico de subrayado de AWS Agreguemos esta variable en el archivo ENV. El correo electrónico de subrayado de AWS es igual a aquí paso mi correo electrónico verificado Ahora tenemos que crear clave de acceso y clave secreta para nuestra aplicación. Busca aquí IAM, que es la gestión de identidad y acceso. Aquí vamos a los usuarios y creamos un nuevo usuario. Escribimos nombre de usuario, digamos, nuestro Linky Pi y pulsamos en siguiente Aquí tenemos que adjuntar políticas, buscar aquí, AS Xs completas y seleccionar la política de proceso completo de Amazon SS, y dar clic en siguiente y crear usuario. Ahora para generar la clave de acceso, abra este usuario y vaya a las credenciales de seguridad. Aquí tenemos cero claves de acceso, así que creamos clave, seleccionamos otra opción, pulsamos en siguiente. Aquí está pidiendo descripción, pero es opcional, simplemente crear clave de acceso. Ver, aquí obtenemos clave de acceso, y también obtenemos clave de acceso secreta. Tenemos que agregarlos en nuestro archivo ENV. Asegúrate de descargar este archivo punto CNV. En nuestro archivo ENV, primero, agrego aquí nombre de variable, AWS, subrayado Xs, clave de subrayado es igual a copiar la clave ases del navegador y pegarla en nuestro Además, agregamos otra variable llamada AWS, underscore secret, underscore key es igual a copiar la clave secreta desde el navegador, y también pegamos Ahora necesitamos región. En el archivo ENV, agregamos la región de subrayado de AWS. Ahora olvidando la región aquí en el lado izquierdo de nuestro perfil, obtenemos una lista de región. Soy de la India. Por eso selecciono Mumbai. Mi región será AP sur uno. Aquí, tienes que seleccionar el tuyo. Si no tienes idea, entonces simplemente puedes buscar tu región en Google y seleccionar la ubicación de Neal. Agrego este valor de región en el archivo NV. Ahora aquí, nuestro paso dos está hecho. Entonces este archivo a menos que la función de envío de correo electrónico esté funcionando o no, que es nuestro paso tres. En nuestra solicitud, des restablece la contraseña API, llamaremos a la función Enviar correo electrónico en el primer argumento para pasar el correo electrónico del usuario Usuario punto email coma aquí, escribimos nuestro asunto de correo electrónico Vamos a definir nueva variable para asunto es igual al restablecimiento de contraseña, solicitud de tu cuenta de Linkifi Además, definimos el texto que queremos enviar en las garrapatas traseras, haga clic en este enlace. Restablezca su contraseña, SDDP cool y doble barra diagonal, nuestra contraseña de restablecimiento de barra de linkify.com En el parámetro de consulta, signo de interrogación, reset tocan es igual a aquí agregamos paquetes rizado dólar, reset tocan Esta URL es para acceso directo o un front-end. Entonces sentido Instagram, correcto. También, puedes modificar este texto de acuerdo a tus necesidades, o también puedes pasar el código STML como cuerpo del correo electrónico Apenas en los params de correo electrónico en el lugar de este texto, tenemos que pasar STML Ahora en la función Enviar correo electrónico, pasamos asunto y también texto. Guarde los cambios a menos que esta función de enviar correo electrónico esté funcionando o no. Entonces un cartero, y aquí hay una API de solicitud de restablecimiento de contraseña, que es nuestra primera API para restablecer Ahora antes de llamar a esto, permítame pasar aquí correo electrónico válido para que obtenga el token de reinicio en ese correo electrónico. Aquí, cambio mi correo electrónico a uno de mis correos ficticios, lo actualizo, y también en el cuerpo del punto de solicitud, paso el mismo correo electrónico Bueno. Ahora, enviemos la solicitud. Ver aquí obtenemos no se pudo enviar solicitud. Oh lo siento, se me olvidó iniciar el servidor. Entonces nodemon index dots Niza. Ahora, enviemos la solicitud. Aquí me sale sendemail no está definido. Se me olvidó ingresar eso. Entonces en la parte superior, costo, enviar correo electrónico es igual a requerido. Aquí vamos una carpeta arriba, Config Amazon SCS. Guarda esto y vuelve a enviar la solicitud. De nuevo, me sale error. No entres en pánico. Vamos a revisar. Es error de validación. Entonces, como sabemos, acabamos de verificar nuestro correo electrónico remitente en Amazon SES, pero también tenemos que verificar el correo electrónico del receptor para probar la función de correo electrónico. Es la condición de Amazon SES para probar la cuenta sandbox Si pasamos al plan de producción y pago, entonces le enviaremos un correo electrónico a cualquier persona sin verificar su correo electrónico. Para el entorno de pruebas, necesitamos verificar el correo electrónico del receptor. Así que déjame revisar qué correo electrónico utilizo para la cuenta de usuario en el Mongo DB Compass Ver, esto es correo electrónico. Entonces aquí, tengo que agregarlo en nuestra identidad de usuario. Entonces busca Ss así. Ir a identidades. Crear identidad, seleccionar correo electrónico, y nosotros aquí su correo electrónico que está disponible en su base de datos. Crear identidad. De nuevo envían el correo electrónico de verificación en este correo electrónico. Entonces abro ese correo aquí y abro este enlace. Verás, nos llegan felicitaciones. Bueno. Déjame refrescar esta página. Ver, se verifica. Entonces volvamos a morir. Enviar la solicitud aún, me sale Sandymil no está definido Déjame revisar el archivo Amazon SS. Oh, en la parte inferior, olvidé quitar este paréntesis Agregué para mostrarte error, y me olvidé de quitar eso. Guarde esto, y volvamos a enviar la solicitud. Ver, aquí obtenemos el token de reinicio. Pero si revisamos nuestro terminal, vea, aquí todavía obtenemos un error de validación, error Amazon SS, correo electrónico. Comprobemos SandyMLFunction. Bien. Aquí en el destino, tenemos que cambiar estas dos direcciones a dos direcciones plurales. Ahora intentemos de nuevo. Aquí obtenemos nuestro token de reinicio. Ahora vamos a revisar nuestra terminal. Aquí obtenemos un nuevo error. El correo electrónico no se verifica en esta región. Pero por qué como sabemos, ya verificamos nuestro correo electrónico. Aún así, estamos recibiendo este error. Déjame explicarte. Aquí verifiqué nuestro correo electrónico ambos en la región equivocada. Permítanme consultar también en el sitio web de Amazon. Mira, aquí tengo seleccionada la región de Europa, y en mi variable NV, paso la región de Mumbai, y por eso me sale este error. Selecciono aquí esta región umbi. Ahora tengo que volver a verificar ambos correos electrónicos en esta región. Ir a identidades, crear identidad, seleccionar aquí correo electrónico, escribir el correo electrónico y crear identidad. Ahora verifiquemos esto desde el correo electrónico bueno. Ahora tengo que hacer lo mismo para otro correo, si como y hecho aquí ambos correos son verificados para mi región. Entonces ahora volvamos a probar nuestra implementación. Envía la primera llamada a la API. Verás, obtenemos token de reinicio. Y además, si revisamos nuestro terminal, entonces mira aquí obtenemos correos electrónicos enviados con éxito, y también obtenemos ID de mensaje. Y si reviso mi bandeja de entrada de correo, aquí me sale el correo electrónico en el spam porque aquí estamos en el modo degustación y tampoco verificamos dominio. En producción, hay que hacer pequeños cambios en la configuración y su correo electrónico no entrará en la carpeta de spam. Este es el poder de Amazon SES. Sé que configurar esta cuenta SES es una parte un poco difícil y aburrida. Pero para una mejor experiencia suave como esta, necesitamos pasar de esa pintura dulce. Ahora el usuario puede abrir este enlace de front-end y luego el front-end llamará a nuestra segunda API. Ese es el trabajo de front end. También desarrollador front-end tú si eres un enlace. No te preocupes por eso. Ahora, también, si tenemos que usar Amazon SES para la producción, entonces necesitamos solicitar acceso a la producción. Si verificamos nuestro estado actual en la página de GetSet, vea actualmente, nuestro estado es sandbox lo que significa probar Aquí podemos leer la mención en las tarjetas a continuación, verificar una dirección de correo electrónico y enviar dominio para solicitar ces de producción lo que le permite enviar correo electrónico a nivel de producción y aprovechar todas las capacidades de SCS Para la producción, hay que verificar el envío de dominio desde aquí. Y si proporciona información de escritura y envía una solicitud, entonces AWS generalmente la aprueba dentro de las 24 a 48 horas. Después de obtener la aprobación, podemos enviar correo electrónico a la dirección de correo electrónico. Además, voy a dar un poco más de información en el artículo a continuación de esta lección. Entonces, para la producción, se puede leer eso. ¿Bien? Así es como enviamos el correo electrónico de la manera más segura, súper rápida y barata de Amazon SS. 166. Envío de correos electrónicos GRATIS: Veamos cómo podemos enviar correo electrónico usando la forma SMTP, que es gratis, pero tiene límite diario Podemos enviar solo 500 correos electrónicos desde GML SMTP, y si usa YahooSMTP, entonces solo podemos Pero para tu solicitud local o proyecto universitario, esto está bien. Además, si implementas Amazon SS y está funcionando para ti, entonces puedes saltarte esta lección porque agregaremos solo funciones de envío de correo electrónico en esta lección, igual que lo hemos hecho en la lección anterior. Ahora veamos la implementación de SMTB. Divido esta implementación en tres sencillos pasos. Paso uno, implementaremos configuración de SMTV en la aplicación de nodo Después paso dos, vamos a generar una contraseña para SMTB último paso tres, vamos a probar esta implementación Empecemos con el paso número uno. Para implementar SMTP, necesitamos paquete llamado nodo mailer NPM instala Node mailer, en el d 6.10 0.0 y Bueno. Ahora aquí en nuestro proyecto, creamos una nueva carpeta llamada config, y en esa carpeta, crearemos un nuevo archivo llamado SMTP dot js Bueno. Ahora para iniciar la configuración, necesitamos un método mailer de nodo del paquete El correo del nodo Sconst es igual a requerir el nodo Mailer. Y después de eso, necesitamos crear transporte para la configuración. Así nodemler punto Crear Transporte. Y dentro de esto, tenemos que pasar el objeto de configuración. Aquí, agregaremos propiedades, y la mayoría de sus valores los pasaremos en el archivo ENV Así que host para procesar punto nw punto SMTP Underscore host. Segundo, necesitamos pot para procesar punto nw dot SMTP Underscore Después de eso, seguro a la verdad. Este valor es cierto por solo poner 465. Para otras macetas, necesitamos usar valor falso. Después de esto, pasamos de a objetar. Y aquí tenemos que pasar usuario para procesar punto nw punto SMTP, subrayado Y después de eso, pasar a procesar punto w punto SMTP, pasar guión bajo No te preocupes, pasaremos estos valores en solo un minuto. Ahora para enviar el correo electrónico, creamos una nueva función llamada Enviar SMTP, correo electrónico es igual a la función de error Ahora en esta función, antes de escribir el código, es mejor agregar try y cache block. Y en el bloque de caché, pasaremos el registro de puntos de consola. Error al enviar correo electrónico y simplemente agregarcorreo electrónico. Ahora en el blog dri, agregamos costo. Las opciones de correo son iguales a objeto. Aquí pasamos algunas opciones. A partir de dos proceso punto nvt SMTP subrayado usuario, entonces tenemos Aquí, tenemos que pasar el correo electrónico de los receptores. Pero aquí hay una pregunta. ¿Cómo podemos obtener el correo electrónico de los receptores en esta función? Bien, lo obtendremos del parámetro. Entonces nosotros también agregamos. También, aquí necesitamos tema. Este es el asunto de nuestro correo electrónico y también pasamos texto, que es el cuerpo del correo electrónico. Ahora en las opciones, agregamos dos a dos, sujeto a asunto, y texto a texto. Entonces tenemos opciones listas. Ahora solo necesitamos enviar el correo electrónico. Esperen, y aquí necesitamos transportador, que obtenemos de este método de nodo Miller. Entonces vamos a almacenarlo invariable llamado transportador, y en la función de enviar correo, usamos transporter dot send mail, aquí tenemos que agregar opciones de correo Esta expresión escribirá la respuesta, así que vamos a almacenarla en una variable llamada respuesta. Por fin, simplemente consolamos el registro de puntos, correo electrónico enviado con éxito, y también agregamos ID de mensaje, y adherimos el ID de mensaje de punto de respuesta. Para enviar el correo electrónico, solo necesitamos llamar a esta función y pasar estos argumentos. Exportamos esta función usando módulo que exporta es igual a enviar correo electrónico SMTP Guarde este archivo, y ahora en nuestra API de reinicio de solicitud, simplemente llamaremos aquí, enviaremos la función de correo electrónico SMTP, vea trabajos atoiput Aquí en la lección anterior, creé estas dos variables, tema y texto. Puedes copiarlo y simplemente en esta función, pasar el correo de punto del usuario, que es el correo electrónico del receptor, asunto de la coma y el texto Ahora permítanme comentar esta función anterior para Amazon SES. Aquí nuestro paso uno está hecho. Ahora pasemos al paso dos, que es definir variables de entorno. Entonces, en los archivos ENV de la lección anterior, agregué estas cuatro variables para Amazon SES. Si no aplicas eso, entonces no te preocupes. Ahora aquí pasamos cuatro variables para SMTP. Si no recuerdas sus nombres, entonces simplemente puede copiarlo del código. No hay nada malo en eso. Entonces primero, SMTP y ace host es igual a aquí estoy usando gmlhst así que escribo smtp.gmail.com Después de eso, el puerto de subrayado SMTP es igual a 465. Aquí, si estás usando Yahoo o Outlook, entonces puedes usar los valores post y port. Pero Gmail es bueno para SMTP. Ahora necesitamos usuario de guión bajo SMTP, y aquí pasamos el correo electrónico desde el que queremos enviar Este es el ID de correo electrónico de la empresa. Entonces aquí agrego mi ID de correo electrónico. Yo uso este correo solo para demo, en el futuro, no lo voy a usar. Ahora solo necesitamos pasar la contraseña de guión bajo SMTP es igual a aquí, podemos pasar nuestra contraseña de Gmail, pero después de 2024, Gmail no permite este tipo de configuración Entonces, en lugar de pasar una contraseña real, podemos pasar una contraseña. Veamos cómo podemos generar una contraseña. Así que abre google.com y ve a administrar mi cuenta de Google. Aquí vamos a la seguridad. Ahora para generar la contraseña de la aplicación, hay una condición. En nuestra cuenta de Google, verificación en dos pasos debe ser incapaz. Si está deshabilitado para tu cuenta, entonces debes habilitarlo. De lo contrario, obtendrá un error SMTP. Ahora, después de que no puedas pasar la verificación en la parte superior, busca una contraseña y abre las contraseñas a en seguridad. Te verificará primero, bien. Ahora es nombre de la aplicación. Aquí podemos escribir nodo, Miller, SMTV o cualquier otro nombre, no importa Lo único es en el futuro, si quieres eliminar la contraseña de esta aplicación, entonces puedes recordar ese nombre de aplicación. Ahora haz clic en Crear. Mira, aquí obtenemos contraseña de 16 dígitos, simplemente copia esta y además puedes tomar captura de pantalla o hacer click en Foto en tu teléfono porque una vez que la cerramos, entonces no podemos ver la contraseña. Copia esto y pégalo en nuestro archivo ENV. Asegúrate de dejar el espacio tal como está. No cambies nada en esto. Y eso es todo. Aquí, nuestro paso dos está hecho. Ahora pasemos al paso tres, que es probar. Entonces, antes de probar, asegúrate pasar el correo electrónico válido en los datos de tu usuario. Si no pasas tu correo electrónico, entonces puedes modificarlo desde el Mongo DB Compass Bien. Ahora abierto Cartero, y aquí enviamos primera solicitud, restablecer contraseña API Ver, aquí vamos a restablecer token, y si revisamos nuestro terminal, obtenemos error. Conectar, icono, rechazar. A lo mejor esto es un error para una contraseña de una sola vez. Así que déjame intentarlo de nuevo. Aún así, me está dando el error. Así que déjame crear otra contraseña de aplicación para nodemiler, SMTP, crear y copiar esto y asegúrate de hacer clic Ahora en nuestro archivo ENV, reemplace la contraseña, guarde este archivo Ahora intentemos de nuevo. Enviar la primera solicitud. Aquí obtenemos token y en el terminal, vea, obtenemos el correo electrónico enviado con éxito, y también obtenemos el ID del mensaje. Y si abro mi bandeja de entrada, mira, aquí me sale el nuevo correo electrónico. Eso es muy sencillo enviar correo electrónico desde la aplicación de nodo. En resumen, puedes usar Amazon SES para aplicaciones de tipo empresarial, y si tu aplicación es pequeña, entonces puedes usar el método SMTP, pero solo nos dará 500 correos electrónicos en un día, depende totalmente de ti cuál elijas 167. Lógica del seguidor y del seguimiento: Hoy en día, en cualquier aplicación de redes sociales, hay seguidor y siguiente característica es imprescindible. Entonces vamos a implementar eso también en nuestra aplicación. Es posible que te asuste un poco esta función si la estás implementando por primera vez. Pero créeme, es realmente sencillo. Entonces, primero entendamos la lógica de seguidor y seguimiento. Así que aquí están, que es el usuario de inicio de sesión en nuestra aplicación. Y aquí hay otro usuario, digamos Harley y su estado de perfil es público. Ahora, quieres seguir a Harley, así que presionas el botón de seguir. Ahora ¿qué pasó en la parte de atrás? En primer lugar, para cada usuario, agregaremos tres nuevos campos en el esquema del usuario, seguidores, que es la matriz de usuarios que siguen a ese usuario. Aquí agregamos ID de usuario como referencia. A continuación, agregamos el siguiente campo, que es el array de usuario que es seguido por este usuario. Por fin, agregamos follow request, que también es array, pero en eso, agregaremos todos los ID de usuarios que envía solicitudes para seguir al usuario. Agregaremos ID de usuario en esta solicitud de seguimiento solo si la cuenta de usuario es privada. Ahora volvamos a nuestro ejemplo, supongamos que quiere seguir Hurley y Hurley cuenta es pública En primer lugar, tu ID de usuario se agregará en la lista de seguidores de Hurley Entonces el ID de usuario de Halley agregará en su siguiente lista. Muy sencillo. Ahora aquí, cuenta de Halley es pública ¿Y si configuramos su cuenta en privada? En este caso, no podemos añadir tu ID de usuario en la lista de seguimiento de Halley En este caso, agregaremos su ID de usuario en la matriz de solicitud de seguimiento de Hal. Ahora Hali tiene dos opciones. Puede aceptar la solicitud o rechazar. Si Ali rechaza, entonces simplemente eliminamos su ID de usuario de la solicitud AlisFollow Ahora bien, ¿y si Hali acepta la solicitud? Después primero, eliminamos tu ID de usuario de la lista de solicitudes y la agregamos en la lista de seguidores. Y además, agregamos el ID de usuario de Hale en tu siguiente lista. Entonces así de sencillo es este seguidor y las siguientes características. Ahora en la siguiente lección, definiremos AEI para estas características 168. Sigue al usuario: Ahora definamos API para agregar seguidor. Como sabemos, la lógica es muy sencilla. Entonces vamos a implementarlo rápidamente. Aquí en la parte inferior, agregamos router punto post endpoint para reenviar slash Aquí, agregamos ID de usuario, así que Column user ID slash follow Este es el ID de usuario del usuario al que queremos seguir. Además, necesitamos el ID de usuario registrado, así que agregamos aquí orth middleware y acing function con request Ahora dentro de esta función, en primer lugar, obtenemos este ID de usuario, por lo que Const ID de usuario es igual a solicitar punto Perms dot ID de usuario Además, necesitamos const, usuario actual es igual para solicitar ID de subrayado de punto de usuario punto En primer lugar, revisaremos una condición. Si el ID de usuario es igual al ID de usuario actual, entonces devolvemos la respuesta con el código de estado 400 para la solicitud mala punto Json Object, propiedad Message. No puedes seguirte a ti mismo. La primera lógica de seguir API es que comprobaremos que otra cuenta de usuario es privada o pública. Para eso, llegamos a la información del usuario. Así que contras usuario a seguir es igual a esperar usuario punto bien comprar ID. Y aquí pasamos ID de usuario. A continuación, pasamos tu condición. Si el usuario a seguir no está disponible, devuelva la respuesta con el código de estado 404 y Json a Object con la propiedad del mensaje, Usuario no encontrado. Además, necesitamos encontrar información de usuario actual. Entonces const usuario actual es igual a esperar usuario punto Fine BD y pasar aquí ID de usuario actual Y también pasa aquí, la misma condición, así que duplica esta condición por Alt más tamizar más flecha abajo u Opción tamizar más flecha abajo y mover esta línea debajo de la opción de retención o alterar Y aquí simplemente cambiamos este usuario a usuario actual. Ahora después de que obtengamos los dos usuarios, podemos pasar tu condición si el usuario a seguir es privado. Si esto es cierto, lo que significa que la cuenta es privada. La cuenta es privada, entonces necesitamos agregar el ID de usuario actual en la solicitud de seguimiento de otro usuario. Pero para eso, necesitamos agregar tres campos en nuestro esquema de usuarios. Entonces en el esquema de usuario, por fin, agregamos seguidores llenos a array, y dentro de eso, agregamos tipo de objeto al esquema de punto Mangoose tipos de punto punto ID de objeto, y ref al usuario Además, necesitamos seguir y seguir la solicitud, que tiene el mismo tipo de esquema y referencia de usuario. Justo aquí cambiamos siguiendo y seguimos solicitud. Guarde este archivo, y vuelva a nuestra ruta. Aquí, escribimos usuario a seguir, punto follow request, dot push. Y aquí agregamos el ID de usuario actual, y luego podemos esperar al usuario para seguir punto save. Y aquí devolvemos respuesta con mensaje JSON. A seguir, solicitud enviada. Bueno. Pero aquí hay una cosa. Es posible que el usuario ya esté disponible en la matriz de solicitud de seguimiento. Antes de este método push, añadimos condición I usuario para seguir punto seguir solicitud punto incluye aquí, pasamos ID de usuario actual. Si el ID de usuario actual está disponible en la matriz, entonces devolvemos el estado del punto de respuesta, 400 puntos Json Object con MsATPperty para seguir Y después de eso, agregamos s, y podemos mover esta parte en el bloque s. Entonces aquí escribimos la lógica de agregar solicitud de seguimiento si la cuenta es privada, pero nuestra otra cuenta de usuario puede ser pública. Después de esto, si agregamos Ls, si te estás confundiendo, entonces puedes escribir comandos para eso. Escribo comentario aquí, lógica para cuenta pública. Bueno. Ahora bien, ¿qué queremos hacer si la cuenta es pública? Derecha, direccionaremos agregar ID de usuario actual en la lista de seguidores, y en la lista de seguimiento de usuario actual, agregaremos el ID de usuario para seguir. Usuario para seguir seguidores de punto dot push. Aquí agregamos ID de usuario actual, y después de eso, usuario actual, seguimiento de punto, push de punto. Y aquí agregamos ID de usuario. Y después de eso, guardamos estos dos documentos. Así que espera al usuario para seguir dot save, y esperar al usuario actual dot save. Después de eso, devolvemos respuesta con objeto JSON con propiedad de mensaje, usuario seguido con éxito. Ahora como lo hicimos anteriormente, podría ser posible que nuestro ID de usuario actual ya esté disponible en la lista de seguidores. Pasamos tu condición antes de esta lógica. Si usuario para seguir seguidores de punto, dot incluye aquí pasamos ID de usuario actual. Si está disponible, entonces devolvemos respuesta con código de estado, 400 para solicitud bat, y en el objeto Jason con propiedad de mensaje para ya seguir al usuario. Después de esto, agregamos s, y moveremos este código en el bloque se. Eso es. Es realmente simple. Ahora vamos a probar esta implementación. Entonces, para probar la API follow, necesitamos otra cuenta de usuario. Vamos a crear esto primero, abrir la API de usuario creada , cambiar el nombre de usuario, digamos, Hurley 001 y enviar un correo electrónico a Hali en el gmail.com rojo Además, seguiré siendo contraseña igual. De lo contrario, olvidaré la contraseña y enviaré la solicitud. Ver, aquí obtenemos el nuevo token de usuario. Aquí necesitamos este ID de usuario de Hurley. Entonces por Mongoi nos brújula, vamos a los usuarios y copiamos esta nueva ID de usuario Volver a Cartero para seguir, creamos una nueva solicitud Siga API, método SDB, para publicar, URL a SDDP, Columna doble diagonal hacia adelante Host local, Columna 3,000, slash API slash usuario slash aquí pagamos el nuevo ID de usuario , slash Necesitamos el token de usuario actual, así que vamos a la API de inicio de sesión, cambiamos la contraseña porque la cambiamos en nuestra lección anterior y enviamos la solicitud. Copia este token, y en nuestra API de seguimiento, vamos a los encabezados, adherimos la autorización, y en el portador de valor, el ritmo espacial del token. Y enviar la solicitud. Ver, aquí conseguimos usuario seguido con éxito. Seguimos directamente al usuario porque esa nueva cuenta de usuario es pública. Ahora, probemos también haciendo que esa cuenta sea privada. Entonces vamos al Mongo Di BeCompasrFresh los datos. Primero, eliminamos el ID de la siguiente lista. Y además eliminamos ID de la lista de seguidores y también hacemos que esta nueva cuenta de usuario sea privada a true y la actualicemos. Ahora, volvamos a seguir API y enviar la solicitud. Ver aquí obtenemos seguir solicitud enviada encantadora. Ahora en la siguiente lección, crearemos API para aceptar la solicitud de seguimiento y rechazar la solicitud de seguimiento 169. Acepta la solicitud de seguimiento: Definamos API para aceptar y rechazar la solicitud de seguimiento En primer lugar, vamos a implementar rechazar la solicitud porque va a ser fácil de probar, así router punto post y punto a slash rechazar la solicitud Ds, slash y aquí necesitamos el ID de usuario solicitante Llame al ID del solicitante. Después de eso, también necesitamos la vajilla ortomddal Agregamos una función sing calve con solicitud y respuesta. Ahora, antes que nada, en esta función, obtendremos Costo, ID de solicitante es igual a solicitar punto Perms ID de solicitante de punto También necesitamos const, usuario actual es igual a solicitar el ID de subrayado de punto de usuario punto bajo, que obtendremos de este En primer lugar, comprobaremos si ambos usuarios están disponibles en nuestra colección o no. Recuerda, hicimos lo mismo en la API anterior. Aquí está, copia este código. Además, copie esta primera condición para el mismo ID, y en la parte inferior, péguela en nuestra API de rechazo. Aquí tenemos que hacer pequeños cambios. Entonces en el lugar de ID de usuario, tenemos que agregar ID de solicitante, y aquí también ID de solicitante Y también, necesitamos cambiar el nombre de esta variable así que seleccione usuario a seguir, presione F dos y cambie esto a usuario solicitante Nos dará más claridad. Ahora para rechazar la solicitud, solo necesitamos eliminar el ID del solicitante matriz de solicitudes Pero antes de eso, podemos verificar si hemos solicitado ID en la matriz de solicitudes de seguimiento o no. Entonces si el usuario actual punto follow request punto incluye ID de solicitante, si esta condición no es verdadera, pasamos aquí signo de exclamación, pasamos aquí signo de exclamación, y luego devolvemos respuesta con código de estado 400 y punto JSON Object con propiedad de mensaje dos, no se encontró ninguna solicitud de seguimiento Y sigo la solicitud se encuentra, entonces aquí podemos usar método de filtro para eliminar el ID del solicitante de la matriz Entonces Const, solicitud actualizada es igual a usuario actual punto seguir solicitud punto Filtrar Aquí agregamos ID, que es el elemento individual de esta función de flecha de matriz, y aquí devolvemos condición dt dos cadenas no es igual a ID de solicitante Esto eliminará el ID del solicitante de la siguiente matriz de solicitudes Simplemente podemos establecer solicitud de seguimiento de punto de usuario actual es igual a la solicitud actualizada. Y luego esperamos al usuario actual punto c. y por fin, simplemente devolvemos respuesta con objeto JSON con propiedad de mensaje a seguir, solicitar, rechazado, y eso es todo. Ahora vamos a probar esta API. Entonces abre Cartero, y aquí agregamos una nueva solicitud llamada rechazar la solicitud de seguimiento Ahora en esto, establecemos el método API para publicar y apuntar a SDDP, Columna doble para slash, host local, Columna 3,000 API usuario slash rechazar solicitud slash aquí necesitamos pasar el ID del solicitante, que es el ID del usuario que envió la Aquí abrimos Mongo Db Compass, y ¿me pueden decir qué usuario envía una solicitud Correcto, es nuestro primer usuario, cuyo ID se agrega en la matriz de solicitud de seguimiento de otro usuario. Así que copia este ID y pégalo en la URL, y nosotros enviamos la solicitud. Oh, tenemos que pasar JWT Token. Ahora aquí necesitamos token del usuario que recibe la solicitud, que es nuestro nuevo usuario. Entonces en la API de inicio de sesión, cambio el nombre de usuario a Hurley 001 y también cambio la contraseña y envío la solicitud Copia este token. Y en la API de rechazo, vamos a los encabezados, adherimos la autorización, y valoramos al espacio portador, el ritmo del token. Ahora enviamos la solicitud. Ver, aquí obtenemos solicitud de seguimiento rechazada. Como si revisáramos nuestra base de datos, actualice la colección. Ver, para el segundo usuario, no obtenemos ningún ID en la siguiente solicitud. Aquí, nuestra API rechazada está funcionando bien. Ahora podemos definir API para aceptar la solicitud del usuario. Esta API es muy similar a la API de solicitud rechazada, por lo que copiamos toda la API y la pegamos a continuación. Bueno. Ahora aquí, primero cambiamos el punto final para aceptar como solicitudes ID de solicitante Después de eso, si aceptamos la solicitud, también necesitamos eliminar ID del solicitante de la siguiente matriz de solicitudes Así que mantenemos nuestro código tal como está. Pero después de eliminar el ID de solicitante, necesitamos agregar el ID de solicitante a la lista de seguidores Eso significa que estamos aceptando la siguiente solicitud. Entonces, antes del método save, agregue el usuario actual dot followers dot push. Aquí empujamos el ID del solicitante, y también necesitamos agregar el ID de usuario actual en la siguiente lista de usuarios del solicitante Así que el usuario solicitante, punto siguiente punto push. Aquí empujamos el ID de usuario actual. Ahora también esperemos al solicitante usuario punto save. Por fin, cambiamos el mensaje para seguir solicitud, aceptado, y eso es todo. Ahora probemos también esta API. Así que volvamos a Cartero y aquí necesitamos la misma petición como rechazo Para que podamos duplicar la API de sabor desde aquí, cambiar el nombre para aceptar la siguiente solicitud. También punto final para aceptar como ID de solicitante de solicitud. Y si revisamos los encabezados, mira, aquí también obtenemos ese token, y por eso duplicamos esta prueba. Ahora, vamos a enviar esta solicitud de API. Ver, aquí no obtenemos ninguna solicitud de seguimiento encontrada porque acabamos de rechazar la solicitud de seguimiento. Aquí necesitamos enviar de nuevo la solicitud de seguimiento. Para eso, vamos a seguir API y enviar la siguiente solicitud. Solicitud enviada, buena. Ahora vuelve a aceptar solicitud API y enviar la solicitud. Ver, obtenemos solicitud de seguimiento aceptada, y si revisamos nuestra base de datos, actualizar la colección. Ver, aquí también obtenemos ID de usuario en la lista de seguidores y solicitamos nuestro ID se elimine de la solicitud de seguimiento. Y aquí obtenemos el ID en la siguiente lista. 170. Ejercicio: conseguir la lista de seguidores y seguirlos: Ahora es el momento de poco ejercicio. En este ejercicio, quiero que creen dos APIs. Una API para obtener la lista de usuarios de otro usuario, y una segunda API para obtener la siguiente lista de otro usuario. Si eres usuario uno, entonces puedes enviar solicitud para obtener la lista de usuarios dos, seguidores y siguientes. Aquí nuestra API se ve así. ID de usuario de la API de Slash, seguidores de slash. Slash siguiendo para la siguiente API. Piensa primero en la lógica y luego ponla en práctica. Es realmente simple. que puedes completar este ejercicio. Intenta resolver esto y luego cuál es la solución. Espero que completes este ejercicio o intentes resolver este ejercicio. Te agradezco por eso. Ahora veamos la solución. Entonces aquí agregamos router dot Obtener y apuntar para cortar Colin user ID, slash Este es el ID del usuario cuya lista de seguidores el usuario de inicio de sesión quiere ver. Entonces necesitamos middleware y luego asing función de devolución de llamada con solicitud Ahora dentro de esta función, primero, obtenemos costo ID de usuario es igual a solicitar punto Perms punto ID de usuario Además, necesitamos costo, usuario actual, es igual a solicitar punto usuario punto guión bajo ID Ahora entendamos la lógica de esta API. Deberíamos mostrar la lista de seguidores de cualquier usuario no. Solo puedes ver la lista de seguidores de aquellos usuarios, a quienes sigues o cuya cuenta es pública. Aquí, necesitamos la lista actual de seguidores de usuarios y otros usuarios es propiedad privada. Nuevamente, copiamos el código de ambos usuarios de la API anterior y lo pegamos en esta API. Ahora aquí cambiamos el nombre de la variable a usuario y cambiamos este ID de solicitante a ID de usuario Bueno. Ahora, después de esto, podemos pasar condición si usuario dot followers dot incluye, aquí pasamos el ID de usuario actual. O el punto de usuario es privado es falso, lo que significa que la cuenta de usuario es pública. Si alguna de esta condición es cierta, entonces mostraremos a los usuarios la lista de seguidores. Devolver respuesta dot Json, y aquí pasamos usuario dot followers. Agregamos, y en eso devolveremos respuesta punto Estado 400 punto Jon, pasa tu Objeto con propiedad de mensaje, Gant, Obtener lista de seguidores, cuenta es privada Ahora hagamos esta implementación, guardemos los cambios y abramos cartero Aquí, creamos una nueva solicitud llamada Lista de seguidores de Getting Users. Aquí agregamos URL, SDP, Columna doble cuatro slash, host local, Columna 3,000, slash API, slash ID de usuario, y por fin, agregamos seguidores de slash y por fin, agregamos seguidores Ahora de vuelta a la base de datos Mongo DB, copia este segundo ID de usuario, que tiene seguidor y pega este ID en la URL Ahora en esta API, necesitamos pasar token. Así que ve a los encabezados. Aquí agregue autorización y valor al espacio portador. Y aquí, tenemos que pasar otro usuario Token que esté siguiendo este ID de usuario. Así que volvamos a la API de inicio de sesión, y aquí simplemente iniciamos sesión con cuenta antigua, cambiamos la contraseña, y enviamos esta solicitud. Ver, aquí obtenemos token, copiamos esto y lo pegamos en nuestro encabezado API. Bueno. Ahora envía la solicitud. Mira, aquí obtenemos la matriz con el ID del seguidor. Pero como sabemos, en el mundo real, necesitamos mostrar el nombre de usuario, así que tenemos que poblarlo Para eso, en nuestra consulta fina, teníamos método populatet al principio, pasamos fill name que queremos poblar, que es followers, y luego pasamos fills name, que queremos obtener de la referencia, que es underscore ID Ahora aquí hay una cosa. Aquí, poblamos la lista de seguidores Entonces ahora no es lo mismo que antes. Será una matriz de objeto con ID de guión bajo y campos de nombre de usuario en cada objeto Entonces no podemos pasar aquí, esto incluye método. Podemos usar el método de índice fino que usamos en los proyectos anteriores, y también escribir aquí diferente condición, usuario actual, punto siguiente punto incluye, y aquí pasamos ID de usuario. Entonces, si el usuario actual está siguiendo al otro usuario, entonces también podemos obtener esa lista de seguidores. Guarda los cambios y echa un vistazo. Enviar la solicitud. Ver aquí obtenemos la siguiente lista con ID y nombre de usuario. Ahora, vamos a crear otra API y la adivinaste correctamente, vamos a duplicar esta API y en la parte inferior, agregamos aquí Ahora aquí solo necesitamos cambiar las pequeñas cosas. Entonces, antes que nada, cambiamos el punto final para cortar el ID de usuario, slash siguiente Entonces aquí en la consulta del usuario, necesitamos rellenar el siguiente campo, entonces esta condición será la misma y cambiamos el mensaje a siguiente lista, cuenta es privada, y ya está hecha Ahora en la siguiente lección, definiremos API para dejar de seguir al usuario 171. Ejercicio: deja de seguir al usuario: Déjame darte otro ejercicio. En este ejercicio, hay que crear API para dejar de seguir al usuario Entonces nuestro punto final API se verá así. Usuario de la API de Slash, ID de usuario de slash , slash dejar de seguir. Es realmente sencillo, dedique algo de tiempo y resuelva este ejercicio. Y después de eso, vuelve y mira la solución. Ahora veamos rápidamente la solución. Así que aquí escribimos router punto Post y 0.2 slash Columna, ID de usuario, slash Además, necesitamos la función de devolución de llamada Omidleware ACN con solicitud y respuesta . Ahora aquí necesitamos encontrar a ambos usuarios. Así que copia este código de inicio con ambas condiciones y en nuestra API pasa este código. Ahora aquí no necesitamos este método de poblar, así que lo eliminamos, y además cambiamos este nombre de usuario a usuario para dejar de seguir Bueno. Ahora después de obtener los dos usuarios, pasamos tu condición yo usuario para dejar de seguir seguidores de punto, punto incluye ID de usuario actual si no es cierto, y aquí agregamos signos de exclamación, y luego aquí devolvemos respuesta con código de estado, 400 y en Jason, pasamos Mensaje de objeto al usuario no está disponible en Y después de eso, podemos eliminar ID de usuario actual del usuario para dejar de seguir la lista de seguidores Entonces usuario dejar de seguir seguidores de Dart es igual a usuario dejar de seguir el método de filtro de puntos de seguidores de Dart Aquí obtenemos cada ID, y aquí devolvemos la condición ID, punto dos cadena no es igual al ID de usuario actual. Además, usuario actual, seguimiento de puntos es igual al usuario actual, seguimiento de puntos, filtro de puntos. Aquí obtenemos la función de flecha ID, y la cadena ID dos no es igual a ID de usuario. Ahora podemos guardar ambos documentos, esperar al usuario para dejar de seguir punto c y esperar al usuario actual punto C. Y aquí devolvemos respuesta punto objeto Json con propiedad de mensaje, usuario dejó de seguir con éxito Y hecho. Ahora podemos saborear esta implementación. Entonces un cartero y aquí duplicamos esta API de seguimiento. Cambiar el nombre para dejar de seguir API. Ahora cambiemos el punto final a slash user, slash ID, slash unfollow y envíemos la solicitud y Ver, aquí obtenemos usuario de mensaje de éxito, dejó seguirse con éxito Entonces así es como implementamos seguidores, siguiendo solicitud y rechazamos API. Se puede ver que es realmente sencillo. Necesitamos entender la lógica antes de implementar nuevas funciones. 172. Sección 14: introducción: Bienvenido a la sección 14 del curso ultimate no JS. En esta sección, implementaremos funciones relacionadas con la publicación como publicar una nueva imagen o video, mostrar publicación, eliminar la publicación completa. Además, agregaremos me gusta y a diferencia redacción de un nuevo comentario en la publicación, contestando los comentarios, y muchas más cosas Esta es una sección importante, así que comencemos esta sección. 173. Crear modelo de publicación: Primero vamos a crear el esquema de post antes de crear APIs para post. En la carpeta models, creamos un nuevo archivo llamado post dot js. Ahora ve al archivo del módulo del usuario, copia todo el código de aquí y pégalo en el archivo post modelo. Ahora, antes que nada, vamos a eliminar este objeto de esquema y Como necesitamos cambiar algún nombre aquí. Se como este esquema de usuario y renombrar esto por F para publicar el esquema y presionar Enter Ahora seleccione usuario, y para seleccionar varias veces, presione Control más D o Comando más D y cámbielo para publicar. Ahora solo tenemos que agregar el objeto Schema. En el post documento, necesitamos un par de cosas. En primer lugar, necesitamos usuario, que es el ID de usuario que publicó imagen o video. Así que escriba a Mongos punto esquema punto Tipos punto ID de objeto, ref al usuario, y requerido a true A continuación, necesitamos medios de comunicación. Puede ser imagen o puede ser video. Además, puede ser uno o más de uno. Así que agregamos aquí array, y en eso, agregamos object, first property name to object, type to string, and required tou true. Y otra propiedad, media, type to object, type to string. Num a array, aquí agregamos imagen, o puede ser video. A medida que lo hacemos requerido para dibujar. Por este esquema, obtenemos una comprensión adecuada sobre los medios de comunicación. A continuación, los usuarios pueden agregar subtítulo con la publicación, escribir a cadena y soñar con true para eliminar espacios en blanco, o también podemos eliminar esta propiedad de stream. Los usuarios pueden agregar cualquier tipo de subtítulos. Además, no lo estamos haciendo obligatorio porque al usuario podría no gustarle agregar ningún título. Después de eso, agregamos s, que es array, y también aquí nos quedamos la referencia del usuario. Entonces copiamos esta propiedad tipo y ref del campo de usuario y la pegamos aquí. Bueno. Ahora agreguemos algunos campos adicionales como textos, que también es array, escriba a string. A continuación, también agregamos ubicación, tipo a cadena, y eso es todo. Actualmente, necesitamos estos rellenos. Si en el futuro, necesitamos algunos otros rellenos, entonces lo agregaremos en las próximas lecciones. Además, añadiremos comentarios rellenados más adelante en esta sección. Así que no te preocupes por eso. Ahora déjame mostrarte una cosa en el objeto de esquema. Anteriormente, recuerda que habíamos creado al rellenar nuestro proyecto. Pero en el esquema de Mongo, podemos agregar eso automáticamente Simplemente después de este objeto de esquema, tuvimos un segundo argumento en el método de esquema, objeto, y aquí agregamos la propiedad timestamp y la configuramos para drew Por esta propiedad, obtendremos dos propiedades relacionadas con el tiempo, creado Ed y actualizado Esta es la hora actual en que se creó el documento y en ED actualizada, obtendremos fecha y hora de la última actualización. No te preocupes, lo veremos cuando creamos un nuevo post y lo haremos en la siguiente lección. 174. Crea una publicación nueva: Vamos a crear una API para crear una nueva publicación. En la carpeta rutas, creamos un nuevo archivo llamado post dot js. Aquí, necesitamos Router, Cost Express es igual a requerir Express. Y después de eso, costo Router es igual a express dot Router. Al final, simplemente el módulo exportaciones de punto es igual a Router. Ahora vamos a configurar este router en nuestro archivo principal. Así que en el archivo js punto índice, agregamos costo post ruta es igual a requerir. Aquí vamos a la carpeta rutas, y en ese post. Ahora en la parte inferior, app dot g, prefijo para barra diagonal API, y en el segundo argumento, agrega rutas de publicación Guarde este archivo, y ahora podemos agregar rutas de correos. Entonces en el archivo post, agregamos Router, qué método usaremos, derecho. Vamos a utilizar router punto post. Aquí agregamos forward less para crear nuevo post. Además, aquí necesitamos ware ortomidal porque queremos solo iniciar sesión los usuarios deben crear un nuevo post Y después de eso, agregamos función de devolución de llamada AC con solicitud y respuesta Ahora lo que queremos hacer en esta API queremos simplemente crear un nuevo post documento, y almacenar esas imágenes y videos en nuestro servidor local. Entonces para eso, necesitamos configurar Multer igual que lo hemos hecho anteriormente Así pluma hasta el terminal y escribir y pm instalar Multer en el rojo 1.4 0.5 dash LTso Ocho, Enter. Bien, minimice esta terminal y vamos a implementar Multer. Entonces en el proyecto anterior, agregamos la configuración de Multer en el mismo archivo de ruta, pero eso parece poco poco poco profesional Entonces en este proyecto, podemos configurar Multer en otro lugar y luego importarlo en este archivo ¿Bien? Entonces en la carpeta config, creamos un nuevo archivo llamado MulteruLoad dot js Sabemos que implementar Multer es realmente sencillo. Solo tenemos que establecer el nombre del archivo y podemos establecer el filtro de archivos para evitar la subida de archivos innecesarios. Costo, post upload es igual a Multer y dentro de esto, necesitamos pasar objeto de configuración Primero, pasamos el almacenamiento, que se encargará de la ruta del archivo y el nombre del archivo. Así que en la parte superior, creamos separado el almacenamiento const variable es igual al almacenamiento en disco Mltert Y en esto, también pasamos objeto con propiedades. Además, necesitamos ingresar a Multer en la parte superior. Por lo que Const Multer es igual a exigir a Multer. Bueno. Ahora en este objeto, agregamos primera propiedad, destino. Y aquí obtenemos request, file, y CB tiene parámetros, función de error, y dentro de esto, simplemente llamamos función CB. Y en la primera posición, tenemos que pasar error, que es nulo. Y en el segundo argumento, pasamos el camino, destino de nuestros archivos de correos. Digamos que sube post. A continuación tenemos nombre de archivo, nuevamente, función de flecha con request, file y CB y dentro de este, definiremos nombre de archivo específico y único, igual que lo hicimos anteriormente. También se puede ver el código de ese proyecto. Está totalmente bien. Entonces Const timestamp es igual al punto de fecha ahora Por esto, obtenemos la hora actual. Después de eso, vamos a eliminar algunos caracteres y espacios del nombre del archivo. Así costo nombre original es igual al archivo punto nombre original. Por esto, obtendremos el nombre original del archivo subido. Ahora en el nombre del archivo, puede haber algo de espacio, así que es mejor que reemplacemos ese espacio con el guión. Hará que la URL del nombre del archivo sea amigable. Añadimos el método de sustitución de puntos. Aquí, primero agregamos expresión regular es una sintaxis de expresión regular, que es doble slash hacia adelante entre estos, escribimos hacia atrás slash a para el espacio y más para uno o más espacios en blanco Al final de la expresión regular, una G para bandera global, que asegura que todas las coincidencias en la cadena sean reemplazadas, no solo la primera. Ahora, aquí pasamos guión en códigos únicos. Esto significa que todo el espacio se reemplazará por guión. Ahora bien, ¿y si en el nombre del archivo, también obtenemos los caracteres especiales También tenemos que eliminarlos. Agregamos otro método de reemplazo. Primero, ¿qué pasaremos? Escribir expresión regular por doble para nuestra diagonal entre estas, escribimos expresión regular para obtener los caracteres espaciales Aquí agregamos A a Z. También A a Z cero a nueve guiones Ahora queremos conseguir otros personajes que no forman parte de estos personajes. Serán nuestros personajes especiales. Entonces, para invertir esto, lo envolvemos entre corchetes, y después del primer corchete, agregaremos Garret para inverso, y al final, también agregamos G para bandera global Ahora queremos sustituir estos caracteres especiales por nada. Sólo queremos eliminarlos. Por lo que nos adherimos solo códigos sin nada. Ahora al final, mezclaremos esta marca de tiempo y nombre de archivo original. CB primero, pasamos nulo por error, y segundo, escribimos impuestos. Aquí, agregamos corchetes Cali, sello de tiempo, corchetes de dólar Cali, nombre original y hecho. Definimos destino y también nombre de archivo para nuestro archivo subido. Ahora podemos simplemente pasar esta variable de almacenamiento aquí en la función múltiple. Ahora después del almacenamiento, pasamos el filtro de archivos en el que filtraremos los archivos por sus extensiones. Por lo tanto, el filtro de archivo de costo es igual a la función de error con tres parámetros, request, file y CB. Aquí comprobaremos mientras sea válido o no. Entonces Const tipos permitidos es igual a array, y aquí agregamos tipos de archivo Ahora, en nuestra aplicación de redes sociales, el usuario puede subir imágenes y videos también. Agregamos aquí imagen barra diagonal JPEG, otra imagen, PNG. A continuación, imagen GIF y para video, agregamos videos MP four. Y también video slash MOV. También puedes agregar otros tipos si quisieras. Ahora podemos simplemente poner aquí condición I archivo Mme tipo es de estos tipos, sólo entonces lo vamos a permitir, de lo contrario lo rechazaremos Si los tipos permitidos punto incluye archivo punto tipo Mme, es cierto, entonces llamamos a esta función CB y primero, pasamos null por error, y luego pasamos a través para aceptar el archivo Ahora bien, si el tipo MM es otra cosa, entonces estos tipos, entonces nos adherimos a condición y llamamos aquí a la función CB. Al error, pasamos nuevo error, y aquí pasamos el mensaje de error, tipo de archivo no válido, solo JPEG, PNG, GIF, MP cuatro, y MOV están permitidos para rechazar este archivo, adherimos pausa. Ahora podemos simplemente pasar este filtro de archivo en el objeto Multi config. Además, en el multer, podemos especificar el tamaño del archivo usando la propiedad Limits Para las redes sociales, podemos establecer límite a 15 MB. Yo usuario quiere subir algunos videos, entonces ellos también pueden hacer eso. Tamaño del archivo del objeto a 15 en 1024 en 1024. Por esto, obtenemos el valor de bytes. Este es el límite para cada expediente. Si lo usamos para subir múltiples publicaciones, entonces cada archivo tiene un límite máximo de 15 MB, no para el límite combinado, y listo Aquí, nuestro método de post upload está listo, así que podemos exportarlo desde aquí. Las exportaciones de punto del módulo son iguales a la carga posterior. Guarda este archivo, y en nuestro archivo de rutas, aquí después de este middleware orth, agregamos post, upload, see auto input works dot porque queremos subir múltiples imágenes en Ahora con la primera posición, escribimos el nombre de relleno de entrada. Pasemos aquí los medios de comunicación. Desde el front-end, necesitamos tomar archivo en entrada con fill name media como este. Después de eso, pasaremos el número máximo de expedientes, digamos diez, y ya está. Ahora podemos escribir lógica API. En primer lugar, aquí comprobamos archivo subido por el usuario o no porque si no hay medios, entonces no queremos guardar el post en nuestra base de datos. Solicito o archivos no están disponibles, o solicitar archivos de punto longitud de punto es igual a cero. Si alguna de estas condiciones es verdadera, entonces devolvemos error, respuesta, estado de punto, 400 para una mejor solicitud. Y en el JSON, agregamos objeto con propiedad desordenado. Se requiere al menos un archivo multimedia. Ahora, si hay medios disponibles, entonces almacenamos ese post en nuestra colección de publicaciones. Entonces costo, nuevo post es igual a nuevo post Excelente auto input funciona, y aquí necesitamos pasar rellenos. El primero es que el usuario solicite el ID de guión bajo de punto de usuario de punto. A continuación, tenemos caption, que obtendremos del cuerpo de la solicitud. Por encima de esto, con desestructuramos el cuerpo de la solicitud, y aquí obtenemos subtítulo Además, el usuario puede agregar texto y ubicación. Ahora, en nuestro post, agregamos caption a caption, o también podemos eliminar este texto a texto y ubicación a ubicación. Solo necesitamos un campo que es media, y ese es array of object, y ese objeto tiene dos propiedades, name, que es el nombre del archivo y tipo de medio, que es image o video. Por eso, cuando mostramos ese medio en el front-end, entonces podemos decidir fácilmente qué etiqueta debemos usar. Así que aquí tenemos que crear esa matriz de objeto. Es realmente simple Cast media es igual a solicitar archivos de puntos mapa de puntos. Aquí, obtenemos el archivo único en el parámetro, función de error, y aquí simplemente queremos reten un objeto Aquí en los corchetes de Gully, estamos escritos objeto, nombre a archivo, nombre de archivo de punto, y para tipo de medio, aquí tenemos que pasar condición Archivo punto tipo mime, punto comienza con códigos dobles, imagen Si es cierto, entonces establecemos type a image, column, else, lo configuramos a video. Este método, vamos a obtener media array de objeto aquí en nuestro nuevo post, establecemos media a media. Después de eso, simplemente podemos esperar nuevo post punto C. Luego devolvemos el estado del punto de respuesta a 01 para crear nuevos datos. Objeto Dot Json con propiedad de mensaje, publicación cargada correctamente. A medida que volvemos un post a nuevo post, y eso es todo. Probemos esta implementación. Guarde este archivo y abra cartero. Aquí, creamos una nueva carpeta llamada post, y dentro de esta, agregamos new request upload a new post, cambiamos el método SDDP a post y URL a SDDP Columna doble para slash Host local, Columna 3,000 barra diagonal API barra Publicar y enviar Ver, aquí obtenemos token requerido, vamos a la API de inicio de sesión y simplemente generamos un nuevo token. Copia esto en nuestra nueva API, vamos a encabezado y agregamos aquí nuevo encabezado, autorización al espacio de cerveza, y aquí pegamos nuestro token. Ahora envía la solicitud. Ver, aquí obtenemos al menos se requiere un archivo multimedia. Ahora agreguemos también archivo multimedia con esta solicitud. Recuerda desde qué sección podemos enviar archivo, podemos enviar archivo desde el cuerpo y los datos del formulario. Aquí en la clave, pasamos los medios porque en nuestra API, definimos los medios aquí en el método multer Ahora aquí seleccionamos archivo. Agregar un nuevo archivo desde la máquina local. Enviemos dos o tres imágenes cualquiera desde aquí y enviemos la solicitud. Ver, aquí obtenemos error, no hay tal archivo o directorio AploadsPost Básicamente, nos están diciendo que necesitamos crear ruta de carpeta. En nuestro servidor, creamos una nueva carpeta llamada uploads. Asegúrate de usar solo letras minúsculas porque es sensible a mayúsculas y minúsculas. Ahora en esta carpeta de subidas, creamos otra carpeta llamada Post Bueno. Ahora envía la solicitud. C, post subido correctamente. Aquí obtenemos nuevo objeto post con usuario, Media también se ve muy bien con nombre y tipo de medio, me gusta y etiquetas para vaciar array y también obtenemos marcas de tiempo creadas en y subidas en Obtenemos esto tanto porque en nuestro esquema, agregamos marcas de tiempo a true Así es como creamos un nuevo post. Ahora en la siguiente lección, obtendremos post de la colección post. 175. Obtén publicaciones de usuarios actuales: Ahora es el momento de poco ejercicio. Aquí, tienes que crear una nueva API para obtener todas las publicaciones del usuario iniciado sesión actual. También en eso, hay que implementar la función de paginación, igual que hicimos en el proyecto anterior, API de productos Asegúrate de mostrar primero las letras post y luego más antiguas. Sé que puedes hacer esto, probarlo y después de eso, cuál es la solución. Ahora veamos rápidamente la solución. Así que aquí en nuestra ruta post, añadimos otro router punto GDNDPoEndpoint, digamos, recortamos Aquí, también agregamos Osmidalware y función de devolución de llamada ASN con solicitud y respuesta Osmidalware y función de devolución de llamada ASN con solicitud y respuesta. Aquí necesitamos obtener para squary parámetros, que nos darán página y límite El segundo objeto es igual a solicitar consulta de punto. Y aquí obtenemos página y límite. Además, podemos establecer el valor predeterminado de esta página y limitar. Entonces página a uno y limitar a digamos diez. Si en el parámetro query, pasamos algo más, entonces reemplazará estos valores. Además, como sabemos, cuando obtenemos valores del parámetro query, esos valores son string, por lo que necesitamos convertirlos en enteros. Entonces aquí en el lugar de costo, escribimos let, y después de eso, page es igual a analizar integer, page, y después de eso, limit es igual a parse integer, limit. Ahora podemos agregar consulta para post. Entonces const, post es igual a esperar, post dot find. Aquí pasamos Usuario de objeto para solicitar usuario punto punto subrayado ID Y aquí agregamos el método Skip. Esa página menos uno en límite, y también somos método limit, y pasamos aquí este límite, y también vamos a hacer esta línea. Y luego al final, simplemente devolvemos respuesta dot Json y pasamos aquí este post. Ahora vamos a tasar esta implementación. Guarde este archivo y abra cartero. Aquí, duplicamos esta solicitud, cambiamos su nombre para que se inicie sesión en la publicación del usuario. También cambie el método para obtener y URL a API post barra MI Post y enviar la solicitud Ver, aquí tenemos el post. Actualmente, solo tenemos un puesto, y por eso llegamos aquí solo puesto, así que está funcionando. También, para mejorar esta consulta, podemos hacer una cosa. Pase variable, que le dice a nuestro front-end allí siguiente página disponible o no. Es realmente simple. Entonces aquí, después de que obtengamos nuestro post, creamos una nueva variable llamada una página siguiente es igual a aquí pasamos condición si esta longitud del punto de publicación es igual al límite actual, entonces es posible que haya una página siguiente para post, así que pasamos aquí true si el tamaño actual del post es menor que el límite, entonces en lo demás, pasamos false. Es una lógica realmente simple. Ahora en la respuesta Json, tenemos que pasar objeto, post a post. Página a página, límite, a límite, y como página siguiente a hass página siguiente Guarda los cambios y echa un vistazo. Enviar de nuevo la solicitud. Ver, aquí obtenemos post, y si nos desplazamos hacia abajo, obtenemos una página siguiente a caídas porque el límite de página actual no está lleno. Ahora en la siguiente lección, veremos cómo obtener publicaciones para nuestra página de inicio de redes sociales. 176. Informaciones en casa: Vamos a crear API para obtener post, que podemos mostrar en la pantalla de inicio cuando el usuario abra nuestra aplicación. Aquí agregamos otro router punto GAD y punto a barra siguiente porque en la página de inicio, usuario verá post quien siguió por ella o él Aquí también necesitamos Osmidleware porque necesitamos que los usuarios actuales sigan lista y también acando la función de devolución de llamada con En primer lugar, en esta API, necesitamos encontrar la siguiente lista de usuario actual. Segundos usuario es igual a esperar usuario, punto fino por ID, y aquí pasamos solicitud punto usuario punto subrayado ID Aquí solo queremos siguiente relleno, así que seleccione punto, y pasamos aquí siguiendo en códigos. Aquí obtenemos tres líneas, lo que significa que la entrada automática no funcionó. Permítanme ingresar este modelo de usuario en la parte superior. Costo usuario es igual a requerir. Aquí vamos una carpeta b modelos y vamos a los usuarios. Bueno. Ahora para post consulta, podemos definir variable separada. Let query es igual a object. Dentro de esto, pasamos usuario, y aquí nuevamente agregamos llaves. Ahora podemos usar el operador Mongo Deb llamado $1 in, que se usa para verificar el valor del ítem de la matriz Aquí pasamos usuario punto siguiente, que es array. Básicamente, esto significa así publicación de usuarios que están disponibles en el punto de usuario siguiente matriz. Ahora a partir de esto, simplemente podemos obtener post, así que Const, post es igual a esperar, publicar, dot find, y aquí agregamos nuestra consulta Además, con esto, necesitamos poblar al usuario que subió esas publicaciones Entonces punto poblar y aquí pasamos usuario relleno en el segundo parámetro, pasamos qué campos queremos Así puntúa ID, nombre de usuario y nombre de perfil. Si tenemos foto de perfil, entonces también podemos poblar eso aquí A continuación, agregaremos short. Aquí pasamos objeto con creado en propiedad, y los disparamos en orden descendente, así que pasamos menos uno. Por estos, primero conseguimos nuevo post. Actualmente, no implementamos función de paginación en esta consulta, pero en el mundo real, necesitamos la función de paginación porque en el mundo real, puede haber cientos o miles de publicaciones En ese momento, no podemos enviar todos los correos en una sola solicitud. Hará que nuestro servidor sea lento. Así que aquí necesitamos la función de consulta infinita en la parte superior, añadir objeto let es igual a solicitar consulta de punto, y aquí desestructuramos la página es igual a uno, y el límite es igual a diez Estos son valores predeterminados. Además, necesitamos convertirlos en enteros. Página es igual a analizar entero a página y límite es igual a analizar entero, límite. Ahora en nuestra consulta, agregamos Skip method y pasamos aquí la página menos el hueso al límite. Y también agregamos método limit, y pasamos aquí limit, y también al final, agregamos método len. Ahora, todo está genial, pero aquí hay poco problema en esta API. Déjame explicarte eso con el ejemplo. Supongamos que aquí tenemos 20 post y nuestro usuario envía API solicitud para post. Nuestra API envía este primer post de diez. Ahora cuando el usuario está viendo esta publicación, posible que cualquier usuario siguiente pueda agregar una nueva publicación en la base de datos. Supongamos que cualquiera de los cinco siguientes usuarios suben cinco nuevos post. Ahora cuando el usuario actual quiere ver más post solicitud con el parámetro de consulta de la página dos. En ese momento, nuestra consulta omitirá los primeros diez datos de la base de datos porque la página dos y mostrará este post. Aquí podemos ver duplicación de post porque este cinco post agregó recientemente, y este es el tema. Ahora bien, ¿cuál es la solución aquí? Podemos usar aquí la paginación basada en cursor. Déjame explicarte con palabras sencillas. paginación basada en el cursor significa que obtendremos la publicación en función de la hora Por ejemplo, aquí está el usuario h él está en la página principal y envía solicitudes para los primeros diez post. Ahora, desde el back end, enviaremos diez posts y también enviaremos el último post creado en el momento. Ahora cuando Harley quiera otros diez post, entonces enviará ese último post creado en el momento, que llamamos como cursor. Ahora podrías preguntar por qué necesitamos este cursor. Usaremos este cursor en nuestra consulta. Encuentra otros diez post cuyo tiempo de creación sea menor que este tiempo de cursor. Por esto, no obtenemos post duplicado, y además nuestra paginación funcionará sin problemas Esta técnica se llama como paginación basada en cursor. Esta técnica se usa muy a menudo cuando los datos que queremos están agregando muy rápidamente como las redes sociales. Ahora vamos a implementar esto en nuestra consulta. En primer lugar, devolveremos el cursor en la respuesta para que lo entiendas correctamente. Aquí después de nuestra consulta, agregamos costo siguiente cursor es igual a. Aquí pasamos condición, longitud del punto del poste es mayor que cero. Si es cierto, entonces volvemos el último post creado en la Tate. Así poste, corchete, poste de longitud de punto menos uno. Por esto, obtenemos el último post, punto creado en, devolvemos nulo. Ahora al final, agregamos respuesta punto Json aquí agregamos objeto, post a post, y siguiente cursor al siguiente cursor. Bueno. Ahora, agreguemos este cursor en nuestra consulta porque esa es la razón por la que estamos enviando este cursor. Entonces, cuando enviemos este siguiente cursor al front-end, nuestro front-end enviará este siguiente cursor en la siguiente solicitud de publicación. Entonces en el parámetro body o query, obtenemos el cursor que envía front end. Y ahora simplemente agregamos este cursor en nuestra consulta. Aquí la consulta creada en es igual a los corchetes de Coli. Aquí pasamos Operador dólar LT, que es el menor que, y pasamos aquí nueva fecha. Y aquí pasamos cursor. Ahora aquí tenemos que manejar situación de quemadura. Solicitud de primer post, no habrá cursor. Entonces pasamos aquí condición si el cursor está disponible, sólo entonces agregamos esto creado en la consulta. Entonces sin cursor, nuestra consulta se verá así. Y con cursor, nuestra consulta se verá así, simple como eso. También podemos pasar aquí tiene propiedad de página siguiente. Así que copia esta línea de la API anterior y pegarla en nuestra API. Y al final en objeto de respuesta, agregamos hasNext page to hass next Ahora, vamos a esta implementación. Abra Cartero, duplique esta última consulta. Cambiar su nombre a conseguir siguiente, post. Además, cambiamos la URL a API post slash siguiente y enviamos la solicitud Ver, aquí no obtenemos post porque nuestro usuario actual ha subido el post, no ninguno de sus siguientes. Entonces aquí necesitamos agregar otro token de usuario. Vaya a API de inicio de sesión, inicie sesión con otra cuenta de usuario. ¿Cuál es el nombre de usuario y contraseña de otro usuario? Déjame recordar sí, es h001 y la contraseña está establecida en 128 Sí, obtén este token, copia esto, y en nuestra API actual en el encabezado, reemplazamos este token y enviamos la solicitud. Aún así, no conseguimos post. Déjame comprobar quién sigue a quién. Oh, aquí, nadie sigue a nadie. Entonces para hacer este dic, copio este ID de usuario actual, cual loguimos y dits ID en los seguidores del usuario anterior Y también copia este ID de usuario y d él en el siguiente listado de usuario actual y actualízalo. Ahora, volvamos a enviar esta solicitud. Mira aquí obtenemos post, y además obtenemos siguiente cursor, que es el creado a la fecha del último post y tiene página siguiente a caídas, esto quiere decir que está funcionando correctamente. 177. Eliminar la publicación: Vamos a crear una API para eliminar el post, así Router, dot delete, y aquí agregamos barra diagonal, columna, post ID, que es el parámetro query Además, necesitamos middleware porque solo los usuarios autorizados pueden eliminar su publicación Y por último, agregamos función de devolución de llamada ASN con solicitud y respuesta Bueno. Ahora, en primer lugar, en esta función, obtenemos const post ID es igual a solicitar punto PRM, punto post Además, obtenemos costo userid es igual a solicitar punto usuario punto subrayado Ahora aquí en esta API eliminada, advertimos que solo el usuario que creó la publicación puede eliminar la publicación. Entonces para eso, necesitamos encontrar al usuario de este post. Costo post es igual a esperar post punto Fine By ID. Y aquí pasamos post ID. Pasamos condición I post no está disponible, entonces devolvemos respuesta con código de estado 404, y en Jason, Object, message property two, post not found. Ahora bien, ¿y si encontramos post? Entonces tenemos que verificar el usuario de inicio de sesión actual es el autor de este post o no? Así que si post punto usuario, que es el objeto ID a sring no es igual a ID de usuario, entonces volvemos a devolver respuesta con código de estado 403 por error no autorizado en el Jason, agregamos objeto con propiedad de mensaje no autorizado para eliminar este post Ahora bien, ¿y si usuario y autor también son iguales? En ese caso, primero necesitamos eliminar las imágenes o videos de esa publicación, y luego podemos eliminar el post documento, ¿verdad? Así que aquí tenemos que correr para cada bucle porque nuestro medio es array, supuesto punto media punto para cada uno. Aquí obtenemos un solo objeto de archivo, función de flecha, y aquí ejecutamos nuestra lógica para cada archivo. En primer lugar, necesitamos la ruta del archivo de la imagen o video porque por eso solo, podemos eliminar ese archivo. Es realmente simple. Para path, necesitamos módulo path. Entonces Const path es igual a requerir path, que es el módulo incorporado del nodo Ahora en la parte inferior, la ruta del archivo de costo es igual a la unión de puntos de ruta. Primero, agregamos subrayado subrayado Dname y también coma agregamos nombre de punto de archivo, que es una propiedad de nombre No estoy seguro de este camino. Así que vamos a consultar dot log esta ruta de archivo. Y en la parte inferior, simplemente devolvemos respuesta dot json, Object with mide property, post, deleted successfully just for checking this path. Guarde este archivo y abra cartero. Aquí duplicamos esta entrada de usuarios consiguiendo iniciar sesión porque en esa API, tenemos token del usuario que creó esa publicación. Aquí, cambiamos el nombre de la API para eliminar, la publicación, cambiar el método , eliminar, y en API endpoint, lo cambiamos a API post ID. También copiemos el ID de publicación de la API anterior, enviemos la solicitud, y aquí en la parte inferior, obtenemos el ID, copiamos y lo pegamos en nuestro punto final de API. Y enviar la solicitud. Ver, aquí conseguimos que la publicación se elimine con éxito. Y si revisamos nuestro terminal, vea, aquí obtenemos la ruta del archivo. Ignorar el primer camino porque es subrayado subrayado, querida Solo para ver aquí, obtenemos rutas de barra diagonal nombre de archivo, que es nuestra ruta de carpeta actual, pero no queremos agregar Entonces aquí entre Fecha Nombre y nombre de archivo, agregamos códigos dobles, periodo, periodo. Guarde este archivo y enviemos la solicitud. En el terminal de código VS, C, se elimina la ruta. Ahora solo necesitamos agregar subidas de barra diagonal porque ese es un camino de nuestro post Antes de este nombre de archivo, agregamos publicación de cargas de barra diagonal, guardamos los cambios y volvemos a enviar la solicitud Si revisamos nuestra terminal, vea aquí obtenemos nuestra ruta de archivo. Entonces así es como puedes probar el código usando Console. Siempre hago eso cuando estoy confundido. Yo solo comento la lógica de la base y luego pruebo la API. De esa manera, no necesitamos crear y eliminar datos de la base de datos. Así que llegamos aquí ruta de archivo. Ahora solo necesitamos eliminar ese archivo usando el módulo de archivos. Ya lo hicimos en nuestro proyecto anterior. Así que aquí, quita la Consola y agrega aquí, prueba y captura el blog. Y en caché, añadimos error de punto de consola en Batis pasamos error en borrar archivo, dolares Coli corchetes, ruta de archivo, y además registramos este objeto de error Ahora en el drilog simplemente esperamos fs punto desenlace y aquí pasamos ruta de archivo Para usar esperar, necesitamos hacer esta función de devolución de llamada asíncrona, y también necesitamos importar Fs desde el módulo incorporado Entonces Const Fs es igual a requerir promesas de Fs porque eliminar el archivo es una operación asíncrona Y después de eliminar el archivo del servidor, podemos eliminar el post documento. Así que espera post punto Eliminar uno porque ya traemos post en la parte superior. Y hecho. Guarde los genes y envíe nuevamente la solicitud de eliminación. Ver aquí podemos publicar, eliminarlo con éxito. Y si revisamos nuestros archivos Bend en la carpeta post, también se eliminan las imágenes. 178. Para comentar en la publicación o para diferenciarte: Vamos a crear API para y a diferencia de la publicación. Es realmente simple. Si en la matriz, ID de usuario no está disponible, entonces en eso agregamos el ID de usuario, lo que significa que nos gusta el post, y si el ID de usuario ya está en la matriz L, entonces para a diferencia del post, solo necesitamos eliminar el ID de usuario de esa matriz. Agreguemos la página del punto del router. Aquí, agregamos endpoint a slash column, post ID, slash L. Esta es la misma API que usaremos para y a diferencia del Comma ORT es función de devolución de llamada con solicitud y respuesta. Ahora, primero, obtenemos post ID es igual a solicitar punto PRM, punto post ID, y además obtenemos costo ID de usuario es igual a solicitar punto usuario punto subrayado Ahora, primero, nos encontramos con el post, así Const, post es igual a esperar post punto Fine By ID, y pasar post ID Después de eso, verificamos el estado. Si post no está disponible, entonces devolvemos respuesta con código de estado 404, y en el Jason, pasamos objeto con propiedad de mensaje para publicar no encontrado. Ahora, si la publicación está disponible, entonces verificamos al usuario ya le gusta el post o no. Entonces Const ya me gustó es igual a publicar me gusta de punto, dot incluye, y aquí pasamos ID de usuario Ahora en base a esto, podemos pasar condición, costo, actualizado, post es igual a ocho, post dot fine By ID, y actualizar. Primero, pasamos el ID del post, y ¿me puedes decir qué pasaremos en el segundo argumento? Bien, pasamos las actualizaciones. Entonces aquí pasamos condición. Ya me gustó es verdad, entonces tenemos que quitar los similares. Entonces para eso, en objeto, usamos el operador Mongo Di Be, que es dólar pull to object Y aquí agregamos likes al ID de usuario. Y si ya me gustó es falso, pasamos aquí a y aquí en el objeto, agregamos otro método Mongoib, dólar en para establecer en objeto, es al ID de usuario La razón que agregamos aquí en para establecer porque solo agregará ID de usuario si no está disponible, no duplicará el ID de usuario en s. Ahora en el tercer argumento, pasamos objeto con nuevo a true. Esto nos dará datos actualizados. Al final, simplemente devolvemos punto de respuesta Json Object con propiedad de mensaje. Aquí, comprobamos el estado. Ya me gustó es verdad, entonces pasamos por aquí, post a diferencia de lo demás pasamos post like y ademas podemos devolver likes a post actualizado punto likes dot Length. Puedes devolver cualquier valor que quieras devolver de API. Ahora vamos semanalmente tis esta API. Un cartero, primero, necesitamos crear un nuevo post porque en la lección anterior, borramos nuestro único post Ir a crear post API enviar la solicitud. Mira aquí obtenemos post error, así que tenemos que seleccionar imágenes nuevamente. Y enviar la solicitud. Ver, aquí conseguimos nuevo post, copia su DNI. Eso nos hace falta. Ahora en nuestra carpeta de correos, creamos una nueva solicitud llamada L y a diferencia de la publicación. Cambiar el método a página, y punto final a SDDP, columna doble para nuestro host local de slash, columna 3,000 slash API slash post, y aquí pegamos También en el encabezado agregar clave de autorización y valor al token de copia de espacio portador desde la API de inicio de sesión y simplemente pegarlo en nuestra API y enviar la solicitud. Mira, obtenemos post like y me gusta cuentan hasta uno. Ahora vuelve a enviar la solicitud. Mira, obtenemos post like y likes cuentan a cero, así que está funcionando. 179. Implementa la función de comentarios: Hoy en día, en casi todas las aplicaciones de redes sociales, hay características para agregar comentarios en la publicación. Es la manera de involucrar a la gente para ese puesto. También implementemos funciones de comando para nuestra publicación. En primer lugar, la pregunta es, ¿dónde estamos a la orden? Necesitamos agregar comando en el esquema. Así que en el archivo post modelo, y aquí en la parte inferior, añadir comandos, que es la matriz de objeto. Ahora, en lugar de escribir todo el esquema aquí, podemos crear un esquema separado para los comandos, y luego aquí agregamos referencia. Por eso, no nos confundimos. Entonces antes de este esquema, agregamos const comment schema is equal to new Mongoose dot schema, y aquí en el objeto, pasamos el esquema de comentario único En primer lugar, necesitamos aquí usuario para objetar, escribir a Mongos punto esquema punto tipo punto punto ID de objeto, y hacemos referencia al usuario y también se requiere a True A continuación, necesitamos texto para objetar, escribir a cadena, y también lo hacemos requerido True. Después de eso, necesitamos creado en, que es el momento creó ese comando en particular. Así que escribe hasta la fecha y por defecto hasta la fecha punto ahora. Ahora como sabemos, en redes sociales, el usuario puede responder al comando de otros usuarios. ¿Deberíamos agregar esa respuesta características en nuestro Linky fi o no? Hagámoslo también. Para las respuestas, agregamos otras respuestas rellenas, que es array, y dentro de esta matriz, necesitamos definir el esquema para cada respuesta. No te preocupes, es lo mismo que este comando. Simplemente copie estas tres propiedades y dentro de esta matriz, agregue objeto y péguelas aquí. Asegúrate de agregarlo en el objeto, lo contrario, nos dará error. Ahora tenemos esquema de comandos. Simplemente podemos agregarlo en la parte inferior en el esquema ver, ahora podemos ver fácilmente el esquema post sin confundirnos. Ahora vamos a crear API para agregar el nuevo comando a la publicación. Es realmente simple. Así que aquí agregamos router punto post y punto a slash columna, post ID, comandos slash Aquí, también necesitamos el ware ortomiddal función de devolución de llamada ASN con solicitud y respuesta En primer lugar, obtenemos costo post ID es igual a solicitar punto PRMs punto post ID Además, obtenemos Cost UserID es igual a solicitar punto usuario punto guión bajo Entonces también obtenemos Const text es igual a solicitar dot body dot text Antes de hacer nada, primero verificamos si el texto no está disponible, luego simplemente devolvemos respuesta con estado 400 y yo Jason, pasamos objeto con propiedad de mensaje para comentar, se requiere texto. Ahora bien, si tenemos texto de comando, entonces necesitamos simplemente crear un nuevo comando. Entonces costo, nuevo comentario es igual a objeto, y dentro, tenemos que pasar usuario a ID de usuario y texto a texto. Entonces no necesitamos pasar la fecha de creación porque ya pasamos la fecha actual como valor predeterminado en nuestro esquema. Ahora aquí necesitamos plantear este nuevo objeto comentario en el array post commments. ¿Me puede decir qué método vamos a utilizar? Sí, podemos usar aquí, multa por identificación y actualización. El costo de publicación es igual a esperar, publicar, punto, multa por identificación y actualización. En la primera posición, agregamos post ID. En la segunda posición, tenemos que pasar lo que queremos actualizar. Ahora para empujar el nuevo comando, utilizamos el método dollar push. Aquí le agregamos corchetes Cully y en esos comandos a lo que queremos empujar Wt este nuevo comando Y en el tercer argumento, pasamos objeto con nuevo a verdadero. Ahora bien, ¿me puede decir por qué no usamos aquí en para establecer el método? Correcto, porque at para establecer no permiten valores duplicados. Pero aquí, el comando puede ser duplicado. Un usuario puede atribuir comandos. No podemos negar eso, y eso es todo. Al final, devolvemos respuesta con código de estado 201. Nuevos datos, y devolvemos objeto JSN con propiedad de mensaje para comentar agregado con éxito Y como podemos enviar comentario para publicar comandos de punto en paquete cuadrado, publicar comandos punto longitud menos uno, que es el último comando que agregamos y hecho. Ahora, hagamos esta implementación. Abre Cartero y duplica esta API, cambia el nombre. Para crear un nuevo comando. Cambiar el método para publicar, y también apuntar a publicar comandos ID y enviar la solicitud. Mira aquí obtenemos error porque no pasamos texto. En el cuerpo, vamos a raw y aquí agregamos objeto con propiedad de texto. ¿Qué debo comentar? Sí, este es un gran producto. Aquí puedes agregar cualquier comando. Ahora envía la solicitud. Mira aquí obtenemos comando, editamos con éxito, y aquí también obtenemos letras comando. Ahora en la siguiente lección, crearemos API para agregar respuesta a este comando. 180. Agregar una respuesta a los comentarios: Ahora vamos a crear API para agregar respuesta a un comando específico. Es API muy similar a la anterior, así que router punto post, barra diagonal, columna post ID, comandos slash, slash aquí también necesitamos comentario ID porque en qué comando el usuario quiere agregar respuesta, necesitamos encontrar Y después de eso, slash responde. Desplázate hacia arriba y copia toda esta API con OT y pegarla en nuestra API. Bueno. Ahora tenemos que cambiar las pequeñas cosas aquí. En primer lugar, en los params, estamos recibiendo comentario ID también Vamos a desestructurar los parámetros de punto de solicitud, y aquí obtenemos ID de comando Ahora en el lugar de nuevo comentario, nombramos esto a nueva respuesta y en la parte inferior, cambiaremos el método a uno fino y actualizaremos. Como usamos uno fino y actualizamos, necesitamos pasar su objeto condición en el primer argumento. Dentro de esto, pasamos ID de guión bajo a ID de publicación. Y además le pasamos su condición, códigos dobles, comentarios punto subrayado ID para comentar ID Asegúrese de que escribimos el nombre de propiedad correcto porque distingue entre mayúsculas y minúsculas. Además, podrías preguntar a nuestros comentarios es array, y aquí estamos escribiendo comentarios punto subrayado ID, ¿funcionará La respuesta es sí, funcionará porque en Mongo Di B, utilizamos esta notación de puntos, utilizamos esta notación de puntos, lo que nos permite buscar a través de la matriz de comentarios y encontrar el primer objeto donde underscore ID coincide con ID de comando Ahora en el método push en el lugar de comandos agregamos comentarios punto respuestas Aquí podemos usar comentarios punto dólar punto rep. Ahora podría preguntarse, cuál es la diferencia entre comentarios punto respuestas y comentarios punto dólar punto RPS Por lo tanto, el operador de dólar commens está optimizado para apuntar a un elemento específico dentro de una matriz otro lado, comentarios punto respuestas es para campo general. Déjame explicarte con ejemplo. Supongamos que este post tiene diez comentarios, y queremos agregar respuesta a este segundo comentario. Ahora bien, si usamos aquí commens dot replies, entonces agregará reply a todos los comandos No queremos eso, por otro lado, si usas aquí comentarios punto dólar punto respuestas, entonces agregará respuesta solo al segundo comando, y eso es lo que queremos. Recuerde siempre que si desea actualizar matrices anidadas elemento específico, entonces necesita agregar operador dólar entre ellos. Como commens dot dollar dot respuestas. A este dólar se le llama como operador posicional. Corto en Mongo DB, notación de puntos funciona para buscar y eliminar elementos, y se necesita un operador posicional para modificar elementos de matriz Ahora aquí en nuestro método de actualización, cambiamos este nuevo comentario a nueva respuesta. Y también al final, cambiamos el mensaje para responder, editar con éxito, y simplemente enviamos esa nueva respuesta en nuestra respuesta. Entonces por encima de estos agregamos el comentario de costo es igual a publicar comandos de punto, que es la matriz. Ahora para obtener el comando específico, necesitamos encontrar su índice. Entonces en vez de eso, en Mongoose, tenemos otro método llamado dot ID Esto nos ayudará a encontrar un subdcument por su campo ID de guión bajo dentro Solo tenemos que pasar aquí comentario ID, pero asegúrate de agregar comentario dot ID es método de mangos De lo contrario, en el futuro, te confundirás al buscar este código. En la respuesta en el lugar de mando, agregamos respuesta, y aquí pasamos comando, respuestas de punto, corchete, comando, respuestas de punto, longitud de punto menos uno. Por esto, obtenemos la última respuesta que acabamos de agregar. Guarda los cambios, y probemos esta API de nuevo a Postman, y aquí duplicamos este comentario API cambia su nombre para agregar una nueva respuesta Ahora en endpoint, después de comandos necesitamos agregar el ID de comentario. Vamos a copiar el ID de comentario de la API anterior y pegarlo en nuestra API. Después de la identificación del comentario, agregamos las respuestas de barra diagonal. Ahora cambiemos también el texto de respuesta para agradecerles tanto y enviar la solicitud. Mira aquí obtenemos el mensaje de éxito y también obtenemos la última respuesta. Para que veas lo sencillo que es. 181. Ejercicio: eliminar un comentario específico: Ahora es el momento de poco ejercicio. En este ejercicio, hay que crear una nueva API para eliminar el comando específico de la publicación. Entonces nuestro APIURL se verá como este slash API slash post ID, comandos slash, slash command ID, y tienes que eliminar este comando con este ID de comando Además, asegúrese de que solo el usuario que subió esa publicación o el usuario que agrega ese comando pueda eliminar ese comando. No todos los usuarios pueden eliminar comandos. Es realmente simple. Sé que puedes hacer eso, pruébalo y luego ver la solución. Espero que resuelvas este ejercicio, y aunque te quedes atascado en alguna parte, no te preocupes, al menos intentas. Eso es lo que más importa. Ahora veamos rápidamente la solución para este ejercicio. Aquí, simplemente duplicamos esta última API porque es muy similar. En primer lugar, cambiamos el método para eliminar. Además, desde el punto final, eliminamos las respuestas de barra diagonal porque no las necesitamos. Ahora en la función, primero, no necesitamos este texto. Además, no necesitamos esta condición, y tampoco necesitamos esta nueva variable de respuesta. En el método fino y actualización, necesitamos agregar nuestra condición. Entonces primero es el ID de subrayado para publicar ID, y ahora para encontrar el comando, y necesitamos asegurarnos de que usuario de inicio de sesión actual debe ser el autor de la publicación, o debería ser el autor del comando Entonces aquí usamos dólar u operador, y es una matriz de condición. Objeto, objeto. Aquí, nuestra primera condición debe escribir o la segunda condición debe escribir. En primer lugar, comprobamos que usuario actual es el autor del post o no. Aquí agregamos columna de usuario, ID de usuario, y para segunda condición, en otro objeto, pasamos códigos, comms dot subrayado ID para comentar ID, códigos, commenst user two user Lo que queremos hacer si alguna de estas dos condiciones es cierta. Queremos extraer ese comando de la matriz de comandos. Aquí en el lugar de empuje, utilizamos operador pull y de qué campo queremos tirar. Sí, queremos sacar de los comandos, y aquí pasamos la condición, qué artículo queremos sacar. Entonces en objeto, pasamos como buen ID para comentar ID. Ahora no necesitamos esta variable de comentario , y en la respuesta, simplemente devolvemos mensaje, comentario, eliminado con éxito. Y también, devolvemos comandos para publicar comandos punto y eso es todo. Aquí lo que creo que deberíamos comprobar post se encuentra o no. De lo contrario, obtenemos directamente este mensaje sin hacer ninguna eliminación. Entonces antes de esta respuesta, añadimos, publico no está disponible, luego devolvemos respuesta con código de estado 403, y en el Jason, pasamos mensaje a no autorizado o post comentario no encontrado. Será útil. Guarde los cambios y probemos esta implementación. Volver a Cartero. Y aquí, vamos a duplicar esta prueba de API de respuesta, cambiar el nombre a eliminar un comando específico, método, para eliminar. Y en el punto final, solo necesitamos eliminar estas respuestas y enviar la solicitud. C comentarlo con éxito, y si volvemos a enviar la misma solicitud, vea, aquí nos sale el error no encontrado, por lo que está funcionando Como puedes ver, crear API no es difícil. Si la lógica es clara para ti, entonces puedes crear cualquier tipo de API. Ahora hay muchas más APIs para post y comentarios. No los estamos creando todos porque como puedes ver, es repetitivo y si te muestro todas las APIs una por una, entonces también te aburrirá Puedes definir APIs de acuerdo a las necesidades de tu proyecto. Depende totalmente de ti. 182. Gestión de errores: Ahora actualmente en nuestro proyecto, no agregamos manejo de errores. Así que abro aquí nuestro proyecto anterior, Card Wish, y desde el archivo js index dot, simplemente copiamos esta variable logger y también los dos manejadores de errores y en nuestra carpeta InkiFipject in Config, creamos un nuevo archivo llamado logger dot js y pise Ahora bien, en este archivo, necesitamos este objeto Winston. Entonces en terminal, escribimos NPM, instalamos Winston, a la tasa 3.17 0.0, y también necesitamos Winston MongoDB, a la tasa 6.0 0.0, a la tasa 6.0 Bueno. Ahora en la cima, costo, Winston es igual para requerir a Winston Y también, necesitamos agregar requieren Winston Mongo DB para iniciar sesión en la Ahora en nuestro registrador, necesitamos cambiar esta cadena de base de datos para procesar dot nw dot dB. Y al final, simplemente módulo de exportaciones de punto es igual a logger. Podemos usar este registrador en cualquiera de nuestros archivos. Entonces en el archivo de perros índice en la parte superior, agregamos Const logger es igual a requerir Vamos a la carpeta Config y en ese logger. Ahora, del proyecto anterior, también copiamos este método de caché de Mongoose connect y simplemente lo reemplazamos con nuestro método de caché Entonces desde el proyecto Cardwih, copiamos este middleware de error personalizado para manejar errores en la solicitud de API y lo pegamos en solicitud de API y lo pegamos proyecto Linky fi después de todas nuestras Además, aquí podemos consolar error de registro de puntos por simplicidad. Ahora podrías preguntar, no necesitamos agregar esas funciones para manejar excepciones ungod y rechazos UnhandlepMise Sí, aquí, no necesitamos agregarlos en nuestro archivo index dogs porque cuando importamos logger desde el archivo loggers, estos dos métodos se ejecutarán automáticamente porque se configuran globalmente en este archivo Y por eso llegamos aquí código limpio. Para que veas lo sencillo que es. Además, siempre agrego este archivo logger en mi repositorio Github. Así que siempre que necesite este código de manejo de errores, puedo obtenerlo directamente. Pero para entender lo que hay dentro del código. Si lo sabes, entonces puedes usar cualquier código y hacerlo tuyo. Eso es todo para esta sección. En la siguiente sección, aprenderemos características muy interesantes en tiempo real. Nos vemos en la siguiente sección. 183. Sección 15: Introducción: Bienvenido a la sección 15 del curso ultimate no JS. En esta sección, vamos a aprender sobre la comunicación en tiempo real de nuestro back end a front end y también front end a back end. Esto va a ser divertido porque también probaremos nuestra implementación con el front end así. Imagina que estos son dos usuarios de diferentes computadoras y están conversando entre ellos en nuestra aplicación inkifi Vea cómo funciona sin problemas. Nuestros dos usuarios están recibiendo mensajes en tiempo real, y también cuando un usuario está escribiendo mensaje, otro usuario obtiene el indicador de mecanografía, lo que hace que la experiencia del usuario sea una para chatear. Además, implementaremos el chat grupal, y por eso, más de un usuario puede chatear en grupos. Por lo que implementaremos estas características en nuestro back end y lo probaremos con el front end. Además, una cosa que quiero aclarar es que aquí no vamos a crear front end desde cero. Es solo para degustación, para que puedas entender más sobre estas características en tiempo real. Estoy muy emocionada por esta sección y espero que tú también. Entonces comencemos. 184. Creación de chat: modelo de mensaje: Para crear la API Jet, primero, necesitamos crear la colección o modelo Jet, quieras llamarlo. Así que aquí en nuestra carpeta de modelos, creamos un nuevo archivo llamado chats punto js. Ahora, del modelo de usuario anterior, copiamos todo el código y lo pegamos aquí. Bueno. Ahora, primero, cambiamos el nombre de la variable a esquema de chat. Además, eliminemos todo del objeto de esquema y también cambiemos a este usuario a chatear y listo. Ahora, definamos el esquema de chat. Pero antes de eso, déjame aclarar lo que es el chat aquí. El sombrero es como una habitación en la que dos o más usuarios pueden comunicarse entre sí. En palabras sencillas en Instagram, ¿viste en el lado izquierdo, conseguimos que todos los chats se acorten por el último mensaje Esos rellenos son chat. Pueden ser grupos o pueden ser chats individuales. Lo que necesitamos para estas charlas. Actualmente, solo estamos implementando chat uno a uno, así que no te preocupes por las funciones de chat grupal. Solo piensa en uno a uno. Así que para el chat individual, podemos crear campo central, y también podemos crear campo receptor. Y para ambos, agregamos tipo al esquema de puntos de Mongos tipos de punto, ID de objeto de punto, y ref al usuario Entonces supongamos que el usuario A envía el mensaje al usuario B. Agregamos el usuario A como remitente y el usuario B al receptor. Ahora aquí hay un gran problema. Supongamos que ahora el usuario B está enviando mensaje al usuario A. Entonces el remitente será el usuario B y el receptor será el usuario A. Esto creará un nuevo documento de chat, y estos dos usuarios no obtendrán el mismo chat por hablar entre ellos. Ahora, ¿cuál es la solución aquí? Es realmente simple. Así que en el lugar de definir remitente y receptor ambos por separado, podemos agregar un solo campo para ellos. Como aquí, tuvimos participantes, que es la matriz y en eso almacenaremos el ID de usuario de los participantes. Escriba los tipos de punto del esquema de puntos de Mongos, ID de objeto de punto y la referencia al usuario Si el usuario A envía un mensaje al usuario B, entonces tenemos al usuario A y al usuario B, ambos ID en la matriz de participantes, y si el usuario B envía un mensaje al usuario A, entonces también ambos ID están disponibles en los participantes. De esta manera, obtendremos un solo chat para que el usuario A envíe un mensaje al usuario B, o el usuario B envía un mensaje al usuario A. Este relleno de participantes se usa para buscar jets para un usuario específico Ahora, después de los participantes, queremos fecha y hora. Para eso, simplemente podemos permitir marcas de tiempo sean verdaderas, y eso es todo. Ahora podrías preguntar ¿qué pasa con los mensajes? Para los mensajes, crearemos otro modelo. Así que copia este esquema, y en la carpeta models, creamos un nuevo archivo llamado messages dot js y pegamos aquí ese es schema. Ahora, primero, cambiamos el esquema de chat a esquema de mensaje y modelo de chat a mensaje. Bueno. Ahora definamos el esquema para un solo mensaje. Entonces para el mensaje, primero, necesitamos su ID de chat. Así que escriba a Mongos esquema de punto tipos de punto punto ID de objeto, y referencia a la colección de chat, que acabamos de definir Ahora después de eso, agregamos remitente que envió este mensaje y es tipo a ID de objeto y referencia al usuario. Así que simplemente podemos cortarlo de los participantes y pegarlo para el remitente. Ahora no necesitamos a estos participantes. Después de eso, tenemos tipo de contenido a cadena, y requerido a true. Este es el contenido del mensaje o texto del mensaje que los usuarios quieren enviar. Ahora después del contenido, lo que agregamos, sí, necesitamos estatus de ese mensaje. Escriba a cadena um a matriz, y aquí definimos el conjunto de valores como enviar, entregar y leer. Y por defecto, establecemos el estado para enviar. En el futuro, actualizaremos el estado cuando nuestro mensaje sea entregado o leído por otros usuarios, y eso es todo. Además, para los mensajes, agregamos marcas de tiempo a true olvidando la fecha y hora Ahora podrías preguntar por qué no agregamos estos mensajes en el modelo de chat. Podemos hacer mensajes para hacer arreglos y definir todos los mensajes con su chat relacionado. Sí, podemos hacer eso, pero una razón por la que no agregamos mensajes en el modelo de chat porque en el modelo de mensajes, vamos a realizar agregar, actualizar y eliminar muchas veces. Agregamos mensajes en el modelo de chat, entonces necesitamos tratar con datos anidados realmente profundos, lo que puede confundirnos Y también, si agregamos matriz de mensajes en el modelo de chat, entonces cuando abrimos chat, tenemos que recuperar todos los mensajes del back end, y eso es mucho más datos en una sola solicitud Entonces, al separar los mensajes, solo podemos enviar los últimos diez o 15 mensajes, y luego si el usuario quiere ver mensajes de chat más antiguos, solo entonces vamos a buscar otros mensajes usando la técnica de Paginación Entonces por eso separamos los mensajes del modelo de chat. Aquí en el modelo de chat, también podemos agregar un relleno más. Último mensaje, que es escribir a esquema de punto Mongos tipos de punto punto ObjectID y ref a Por esto, podemos mostrar el último mensaje con chat y no necesitamos encontrarlo de la colección de mensajes. Ahora en la siguiente lección, crearemos API para obtener la lista de jet para usuario de inicio de sesión. 185. Cómo conseguir chats para usuarios: Vamos a crear API para obtener la lista de jet para usuario conectado. Aquí en la carpeta rutas, creamos un nuevo archivo llamado jets dot js. Ahora, primero, creamos Router, por lo que Cs Router es igual a requerir Express. Esta expresión devolverá Express Object, y aquí simplemente obtenemos dot Router. Este es el código de una sola línea para estas dos líneas que estamos usando hasta ahora. Al final, simplemente exportamos esto con las exportaciones de módulo es igual a Router. Ahora lo que vamos a hacer, también agregamos estas rutas en el archivo de perros índice, presionamos Control más P y vamos al archivo perros índice. Aquí agregamos costo rutas jet es igual a requerir, vamos a la carpeta rutas y dentro ella jets en la parte inferior, app dot U aquí agregamos prefijo API slash jets en el segundo parámetro, agregamos rutas de jet y guardamos esto Ahora podemos definir nuestras APIs. Primero, queremos conocer la lista de jets para usuario de inicio de sesión actual, router dot get endpoint to forward slash, y aquí necesitamos Os Middleware porque solo los usuarios de login pueden ver chats o Al final, agregamos la función de devolución de llamada Asyn con solicitud y respuesta Ahora dentro de esta función de devolución de llamada, primero, obtenemos el ID de usuario de costo es igual a solicitar ID de guión bajo de punto ID de usuario de punto A continuación, podemos encontrar chat. El costo de los chats es igual a esperar chat. Ver, auto input works dot Encuentra y aquí pasamos nuestra condición en Participantes de objeto a ID de usuario. Aquí también podemos usar operadores de Mongo Di Be, pero esto también funcionará Si no funciona, entonces lo cambiaremos. ¿Cuál es el problema? Ahora en la parte delantera, queremos mostrar algo como esto. En primer lugar, el usuario que recibe o envía mensajes. También el último mensaje, quiénes mandan el último mensaje, y en qué momento envían. Aquí necesitamos rellenar los datos de usuario de los participantes. Dot pueblar. En el primer argumento, pasamos el nombre de relleno, que es los participantes, y el segundo argumento es fill name, digamos, subrayado ID y nombre de usuario Ahora también necesitamos la información sobre los últimos mensajes. Nuevamente, poblar primero lo que escribimos. Escribir, último mensaje, llenar nombre, y luego segundo, que llena necesitamos del último mensaje. Primero, necesitamos remitente que envió este mensaje. Siguiente contenido, el texto del mensaje, y siguiente, se crea en. Aquí, si estás confundido sobre el nombre de Phil, entonces también puedes ver Schema. Ahora aquí, un pequeño reto para nosotros. Como podemos ver, estamos recibiendo remitente de este último mensaje, pero también es ID, no el nombre de usuario. Necesitamos el nombre de usuario de ese remitente. Entonces aquí podemos hacer así. Después de este método de poblar, agregamos otro método de poblar. Primero, agregamos el último mensaje dot sender y el segundo argumento, agregamos fill name, que es username. Ahora creo que esto parece un poco confuso. Entonces hay otra manera de escribir método de poblar anidado. Déjame mostrarte. Hasta ahora en el método populate, pasamos dos argumentos En el primer argumento, pasamos el nombre de campo que queremos poblar y en el segundo, pasamos las propiedades que queremos obtener de la relación Esta es la primera forma. Para el método populatet anidado, podemos pasar aquí el método podemos pasar aquí Ahora en vez de pasar aquí los argumentos, podemos pasar objeto. Primero, en este objeto, pasamos la propiedad path. Esta ruta es un nombre de campo que queremos rellenar, que es el último mensaje Y otra propiedad es selecta. Aquí, seleccionamos qué datos queremos obtener de la relación. Digamos centrar el contenido y creado en. Ahora aquí queremos volver a rellenar los datos del remitente. Después de seleccionar, pasamos otra propiedad la cual es poblar y aquí pasamos objeto con misma ruta de dos propiedades y seleccionamos Camino a lo que agregamos aquí, escribir remitente. No necesitamos escribir aquí último mensaje punto Remitente porque ya estamos en el último mensaje poblar método, y aquí pasamos seleccionar a nombre de usuario Aquí, si quieres ir más profundo, entonces también podemos pasar otra propiedad poblar, por ahora no la necesitamos, así que vamos a eliminar esto Ahora aquí, estos dos métodos de poblar y este único método de poblar anidado funcionan de la misma manera Me gusta este enfoque anidado porque es claro y no confuso Si te gusta primero, entonces ve a por ello. No te preocupes, depende completamente de ti. Ahora después de poblar, queremos mostrar jets en orden inverso al último mensaje Pero aquí, ¿cómo podemos ordenar los jets? Es realmente simple. Ver cuando alguien envía mensaje, como sabemos, actualizaremos ese jet, propiedad del último mensaje, y cuando actualicemos esa propiedad, nuestros jets actualizados en la propiedad se actualizan. Por lo que podemos abreviar por eso actualizado en la propiedad. Entonces punto corto, y en objeto, pasamos actualizado a valor a menos uno, y al final, devolvemos respuesta dot json, Object con chats a estos chats, y eso es todo. Actualmente, obtenemos la lista de chat para usuario de inicio de sesión. Ahora, a continuación, cuando el usuario abre un chat específico, entonces necesitamos mostrarles los mensajes de ese chat. En la siguiente lección, crearemos API para eso. 186. Recibir mensajes de chat específicos: Vamos a recibir mensajes de un chat específico. Así punto exterior GT. Primero, necesitamos el ID del chat, así que slash column, chat ID, slash messages Además, necesitamos aquí o middleware y por fin está en función de devolución de llamada con solicitud Ahora dentro de esta devolución de llamada, obtenemos costo chat ID es igual a, y desestructuramos solicitud punto Después de eso, los mensajes de costo es igual a esperar mensaje dot find. Simplemente aquí pasamos Identificador de chat de objeto a ID de chat. Déjame comprobar que es chat o chat ID. Sí, es ID de chat. Cuando estaba aprendiendo no Jazz, esto me pasa a mí. Escribo mal nombre de relleno en la consulta y paso casi un día encontrando error, y por fin, verifico el nombre de relleno. Así que asegúrate de que no te pase a ti. Ahora aquí queremos poblar estos datos. Así que el dardo pueblan. Y aquí queremos rellenar remitente, y qué quieres obtener subrayado ID, y nombre de usuario Ahora, después de eso, queremos obtener los mensajes en orden inverso porque así es como mostramos los mensajes en el front-end. Así que ordenar aquí en objeto, pasamos creado en a sí, menos uno. Ahora, esta consulta devolverá todos los mensajes de este ID de chat. Pero en el mundo real, solo necesitamos los últimos diez a 20 mensajes porque nadie va a ver mensajes desde el principio. Si alguien quiere ver mensajes anteriores, entonces podemos buscarlo después como paginación Entonces para la paginación, escribimos aquí, vamos corchetes Ci, límite de coma de página, es igual a desestructurar aquí solicitar consulta Además, pasamos aquí ese valor predeterminado si front end no pasará estos datos. Entonces página a uno y limitar a digamos diez. Después de eso, necesitamos convertirlos en enteros. Entonces página es igual a pasar entero y pasar aquí página. Duplica esta línea con tamizar más Alt más flecha hacia abajo o Tamizar más Opción más flecha hacia abajo. Y aquí cambiamos esta página para limitar, y también aquí limitar. En nuestra consulta, simplemente agregamos el método Skip, y dentro de él, página menos uno en limit, y también agregamos método limit y pasamos aquí limit. Y también, al final, agregamos el método len. Creamos mucha API con paginación, ¿verdad? Ahora también podemos agregar aquí C tiene mensajes anteriores, es igual a aquí pasamos condición, mensajes longitud de punto es igual a límite. Si es verdad, entonces volvemos verdadero, no, devolvemos falso. Ahora al final, simplemente devolvemos mensajes de respuesta punto JSunObject a los mensajes, tiene mensajes anteriores, a mensajes anteriores, página a página, y límite para limitar Y eso es todo. Por ahora, no tenemos chats y mensajes, por lo que probaremos estas API después de crear chat y mensajes. En la siguiente lección, vamos a crear enviando mensaje EPI 187. API para enviar mensajes: Ahora vamos a crear API para enviar mensajes. Así que aquí agregamos router punto post para endpoint, añadimos para nuestro slash column jet ID, en qué jet queremos enviar mensaje, slash message o mensajes, quieras llamarlo Además, agregamos Osmitalware y acing callback función con En primer lugar, obtendremos el ID de usuario de la solicitud punto usuario punto subrayado ID A medida que obtenemos costo Calibakets chat ID es igual a solicitar PRMs punto, ¿qué más necesitamos? Necesitamos contenido del mensaje que obtenemos del cuerpo. El contenido de Calibacket de costo es igual al cuerpo del punto de solicitud. Ahora, antes de hacer nada, vamos a comprobar aquí condición. Si el contenido no está disponible, entonces devolvemos respuesta con código Stata 400 y en el método JSON, devolvemos objeto con mensaje a contenido, o podemos decir mensaje, texto es st requerido. Ahora lo que queremos hacer dentro de esta API, queremos simplemente almacenar mensaje en la base de datos. Eso es. Aquí podemos hacer costo, nuevo mensaje es igual a mensaje nuevo. Aquí en el objeto, pasamos jet ID a chat ID, remitente a lo que escribe, ID de usuario, y luego agregamos contenido al contenido. Después de eso, esperamos nuevo mensaje punto c. Y al fin, simplemente devolvemos respuesta con Status Code 201, y en Jason, pasamos Object, nuevo mensaje a nuevo mensaje. Ahora antes de probar esta API, podrías preguntar, no creamos API para crear chat. Entonces, ¿cómo podemos pasar jet ID? Tu pregunta es correcta. Necesitamos crear Jet API antes de guardar el mensaje. Aquí creamos una nueva API, router punto post, punto a barra Crear chat Aquí, necesitamos middleware y también en función callback con request En primer lugar, obtenemos Cost user ID es igual a solicitar punto usuario punto guión bajo ID También necesitamos la identificación del receptor, quien es el receptor u otro usuario de este jet. ID del receptor de costo es igual a solicitar el ID del receptor del punto del cuerpo del punto. Como estamos obteniendo este ID de receptor del cuerpo del punto de solicitud, es una buena práctica validar. Así que el ID del receptor no está disponible, entonces devolvemos respuesta con Código de Estado 400 y en Jason, devolvemos objeto con mensaje al receptor requerido. Ahora antes de crear un nuevo chat, es mejor encontrar que estos dos usuarios ya tienen chat existente o no. Así que vamos a chatear es igual a esperar chat punto Bien uno. Aquí en objeto, pasamos participantes a objeto, y en eso agregamos dólar o a array, ID de usuario, ID de receptor de coma Ahora bien, esta consulta significa un jet en cuyos participantes hay estos tanto ID de usuario como ID de receptor. Ahora bien, ¿y si es un jet grupal? Entonces podría ser posible que haya múltiples chorros en los que estos dos ID estén disponibles. Aquí necesitamos asegurarnos de que solo el ID de usuario y el ID del receptor deben estar disponibles. Para eso, podemos usar aquí el tamaño del dólar a dos. Este es otro operador útil de Mongo Dib. Hace poco me enteré de ello. Ahora bien, ¿y si realmente no hay chat para usuario y receptor? Simplemente entonces para crear un nuevo chat. Entonces si el chat no está disponible, entonces nosotros hacemos chat es igual a New Jet. Aquí en el objeto, agregamos participantes a la matriz de ID de usuario, coma, ID de receptor, y luego podemos esperar chat punto c. Al final, simplemente devolvemos la respuesta que código de estado 201 En JSON, simplemente enviamos este chat y ya está. Ahora tenemos crear Jet API, antes de crear un nuevo mensaje, primero debemos verificar que el usuario pase un ID de chat correcto o no y además sea el participante del chat o no. Si no comprobamos esta condición, entonces cualquiera puede enviar mensaje a cualquier persona o grupo. Costo chat es igual a esperar chat punto bien comprar ID, y aquí pasamos jaTiD Y después de eso, verificamos si Jet no está disponible o jet dot Participantes punto incluye ID de usuario. Si el remitente no está en los participantes, pasamos sus signos de exclamación, y luego le devolvemos la respuesta que el código de estado 403, y en el mensaje JSON para acceder denegado Ahora verificamos jet. Ahora en el nuevo mensaje, reemplazamos este ID de chat para chatear ID de guión bajo de punto Ahora bien, ¿qué más tenemos que hacer cuando enviamos un nuevo mensaje? ¿Puedes adivinar? Bien, tenemos que actualizar la propiedad del último mensaje del chat. Recuerde, después de guardar el mensaje, escribimos chat punto último mensaje es igual a nuevo mensaje punto guión bajo ID Y después de eso, también esperamos chat dot save. Y eso es todo. Ahora por fin, T es esta API. Abre Cartero y aquí creamos una nueva carpeta llamada chats y dentro de ella, agregamos nueva solicitud llamada crear un nuevo chat Buen método para publicar. I punto final, agregamos SGDP, Columna doble barra hacia adelante Host local, Columna 3,000 barra diagonal API slashETS slash CreThat En primer lugar, tenemos que pasar token en la cabecera. De vuelta a nuestra API de inicio de sesión y aquí para la cuenta de Hari, buena copia este token y en nuestra API de creación de chat en encabezados, teníamos autorización para error, ritmo ese token y enviar la solicitud. Ver, aquí obtenemos error interno del servidor es porque se requiere ID del receptor. Entonces aquí en el cuerpo, vamos a aw. Aquí, pasamos JSObject y pasamos aquí el ID del receptor a los códigos, volvemos a Mango Di Becompass y aquí copio este otro ID de usuario y lo pego en el ID del Ahora envía la solicitud. Mira aquí conseguimos nuevo jet, copia este jet ID. Como Prueba, enviar mensaje API. Asegúrate de guardar esta API con Control plus o Command plus a, y luego duplica esta solicitud de publicación. Cambiar el nombre de la solicitud para enviar un nuevo mensaje. Además, noto en nuestra API, tenemos que pasar el ID de chat en el parámetro de solicitud y el contenido en el cuerpo de la solicitud. Para que podamos hacer algo así. Podemos cambiar nuestra API y apuntar a solo enviar mensajes, y aquí obtenemos el ID de chat en el cuerpo de la solicitud. Bueno. Guarde estos y vuelva a Cartero Aquí, cambiamos nuestro punto final para cortar chats, cortar enviar mensajes En cabecera, ya tenemos token, así que solo necesitamos pasar el cuerpo de solicitud. Aquí en el objeto, pasamos contenido para digamos que este es el primer mensaje. También agregamos jet ID y pegamos ese jet ID aquí. Ahora envía la solicitud. Mira aquí obtenemos el nuevo contenido del mensaje a nuestro mensaje, y en el remitente, es nuestro ID. Ahora es mejor que en el lugar del remitente, podamos ver el ID y el nombre de usuario. Por eso, es fácil mostrar nuevos mensajes en el front-end. Al final, definimos costo, poblar mensaje es igual a esperar mensaje punto encontrar bydNuevo mensaje punto guión bajo ID, punto Primero, agregamos remitente, y en el segundo argumento, agregamos ID de guión bajo y usamos un nombre Y en la respuesta, volvemos nuevo mensaje para poblar mensaje Guarde los cambios y enviemos otro mensaje. Este es el segundo mensaje, y enviar la solicitud. Ver, en el remitente, obtenemos ID y nombre de usuario. Entonces aquí, nuestra API de enviar mensaje está funcionando bien. Encantadora. 188. Qué son los sockets web: Entonces en las lecciones anteriores, creamos APIs para enviar el mensaje, y también definimos API para obtener mensajes de chat específico. Ahora imagina que este es nuestro front-end, y tiene página de chat abierta para dos usuarios Hurley y Mike Entonces esta es la pantalla de Hul y esta es la pantalla de Mike Ambos están en la página de chat en la que ambos son participantes, y ambos reciben dos mensajes que son chat de historia. Ahora imagina aquí Harley escribe un nuevo mensaje y haz clic en Enviar. Entonces en el botón Enviar, llamaremos a API para enviar un nuevo mensaje, ¿verdad? Y como sabemos, esta API guardará este mensaje en nuestra base de datos. Ahora el problema es cómo Mike recibirá este mensaje porque Mike ya buscó todos los mensajes de este jet y después de eso, Hurley envía el nuevo Una fue, Mike enviará la solicitud de recibir mensajes en cada 5 segundos para obtener nuevos mensajes. Es como Mike le pregunta al servidor, ¿hay algún mensaje nuevo para mí? servidor dice que no. De nuevo, después de 5 segundos, Mike pregunta, ¿hay algún mensaje nuevo para mí? Nuevamente, el servidor dice que no. Entonces si el servidor recibe nuevo mensaje, entonces en otros 5 segundos cuando Mike vuelva a pedir el nuevo mensaje, en ese momento, el servidor le enviará el mensaje. Ahora imagina que tenemos 10,000 o 100,000 usuarios en nuestro sitio web, y todos los usuarios están enviando solicitudes de mensaje en cada 5 segundos, lo que realmente no tiene sentido porque solo obtendremos nuevos datos cuando nuestro servidor obtenga nuevos datos De lo contrario, nuestras solicitudes solo van al servidor y regresan. Esto definitivamente hará que nuestro servidor sea lento o incluso se estrelle a veces. Entonces aquí no podemos confiar en esta solución. Necesitamos algo que automáticamente le diga a Mike si tiene nuevo mensaje y automáticamente lo envía en la pantalla de los ratones. Y para resolver este problema, tenemos socket web. Entonces, ¿qué son los sockets web? El socket web es una forma para que nuestro front-end de sitio web y nuestro servidor backend se comuniquen entre sí en tiempo real Es como una conversación bidireccional. En palabras simples, los sockets web nos ayudarán a construir una conversación en tiempo real. De una conexión web socket es como una llamada telefónica entre tu navegador y el servidor. Una vez que se realiza la llamada, navegador puede hablar con el servidor y servidor también puede responder en cualquier momento. Ahora podría preguntarse, cuál es la diferencia entre las API y los sockets web. Imagina que este es nuestro front-end y este es nuestro servidor. Ahora supongamos que en el front-end queremos obtener algunos datos, así que enviamos una solicitud API desde el front-end a nuestro servidor. servidor procesará esa solicitud y enviará respuesta a nuestro front-end aquí nuestra conexión API está cerrada. Por ejemplo, desde el front-end, Harley envía un mensaje a nuestro servidor usando post API. Ahora nuestro servidor almacenará esos datos en la base de datos y luego devolverá el nuevo mensaje al front-end. Aquí, nuestra conexión está cerrada. Esta es la forma de conexión usando APIs SGDP. Ahora veamos cómo funciona el socket web. Aquí tenemos front end, y este es nuestro servidor. Ahora, antes que nada, aquí creamos conexión usando socket web. Por esta conexión, nuestro cliente puede enviar los nuevos datos de messet al servidor sin ninguna llamada a la API Igual que el servidor también puede devolver nuevos datos de messet. Después de que el servidor hiciera un nuevo mensaje de datos, aún así esta conexión permanece ahí. No cerrará hasta que cerremos nuestro sitio web o lo cerremos manualmente con el código. Déjame explicarte con el ejemplo del mundo real. Aquí está Harley, aquí está Mike, y aquí está nuestro servidor. Supongamos que Harley y Mike construyen una conexión con nuestro servidor usando sockets web. Ahora bien, si Halley envía nuevo mensaje al servidor, servidor almacenará ese mensaje en la base de datos, y luego enviará ese mensaje al micrófono sin que Mike envíe la solicitud API Ahora, si Mike envía mensaje al servidor, el servidor también almacenará ese mensaje en la base de datos, y luego enviará ese nuevo mensaje a Harley. Ahora bien, si nuestro servidor va a recibir otro mensaje para Mike de otro usuario, entonces también Mike recibirá ese mensaje, pero esto solo sucederá si Mike construye una conexión con el servidor usando socket web. Si Harley está conectada con servidor, pero Mike no está conectado al servidor usando socket web, entonces el nuevo mensaje se almacenará en la base de datos, pero no llegará al micrófono. Así es como funciona el socket web. Los enchufes web se utilizan para construir comunicación en tiempo real entre el front-end y el back-end. No te preocupes, es realmente sencillo. Entiende todo esto cuando aplicamos enchufes web en nuestro back end y lo probamos con el front end. 189. Conexión del zócalo: Ahora en la lección anterior, vemos que si queremos enviar y recibir datos en tiempo real, entonces tenemos que conectarnos con web socket para tratar con web socket, usaremos la biblioteca socket punto IO más popular. Esta biblioteca es utilizada por muchas plataformas populares, por lo que definitivamente podemos usarla. Abrir terminal, y aquí escribimos NPM instalar socket punto IO a la velocidad 4.8 0.1 Entra. Bien, minimice este terminal, y agreguemos socket en nuestra aplicación backend En el archivo JS punto índice, ingresamos costo Coli Brackets, servidor es igual a requerir socket punto IO. Y en la parte inferior, podemos agregar costo AO es igual a nuevo servidor. Ahora en este servidor, tenemos que pasar nuestro servidor SGDP. Sin servidor SGDP, el socket no recibirá solicitud de conexión Para ello, necesitamos crear un servidor SDDP. Costo SDDP es igual a requerir SDP. Este es el módulo SGDP incorporado en la parte inferior, agregamos Const server es igual a SDP punto Ahora podemos pasar este servidor en nuestro socket. Bueno. Ahora aquí hay una pregunta en qué placa escuchará el servidor socket. Porque aquí para la app Express, definimos puerto 3,000 y al final, escuchamos con ese puerto. En nuestra implementación actual, si agregamos socket dot Listen a 5,000, entonces nuestras API se ejecutarán en el puerto 3,000 y nuestro socket se ejecutará en el puerto 5,000. Esto no es lo que queremos. Queremos que nuestras APIs y socket funcionen ambos en la misma placa. Entonces para eso, aquí en el servidor de creación, tenemos que pasar esta app Express. Por esto, este módulo SGTP creará servidor con esta app express, y ese mismo servidor que estamos usando para inicializar socket También en la parte inferior, necesitamos cambiar esta app dot Escuchar con server dot Lisen De lo contrario, esto no funcionará correctamente. Guarde estos cambios y reiniciemos nuestra aplicación para asegurarnos de que se está ejecutando correctamente o no. Ver aquí obtenemos servidor se está ejecutando en B 3,000, y también obtenemos Mongo Db conectado Eso significa que está funcionando correctamente. Así que para recapitular rápidamente para inicializar socket en nuestro back-end, primero necesitamos crear servidor y pasar Express app InDee entonces podremos usar este servidor para crear servidor socket, y al final, tenemos que también servidor punto LISN a también servidor punto LISN Así que aquí inicializamos exitosamente socket en nuestra aplicación Ahora desde la parte frontal, cualquiera puede conectarse a este zócalo. Pero, ¿qué queremos hacer cuando alguien se conecta al zócalo? Tenemos que añadir esa lógica. Es realmente simple. Aquí, después de estas rutas de aplicaciones, agregamos IO que es la instancia de socket punto on, y en el primer argumento, pasamos conexión, y en el segundo argumento, aquí pasamos la función de devolución de llamada y lo que hacemos cuando alguien se conecta a nuestro socket Por ahora, simplemente consola dot log. Usuario conectado. Siempre que desde el front-end, alguien se conecte a nuestro socket, entonces esta función de devolución de llamada se ejecutará Ahora bien, ¿cómo podemos saborear esta implementación? Para probar eso, creé una aplicación ficticia, SGML simple y JavaScript. No te preocupes. Si no sabes nada de front end, te lo explicaré. Además si no quieres probarlo, entonces puedes ver esta degustación. También te ayudará a entender el flujo de trabajo del socket. En la carpeta de recursos, tenemos la carpeta Project three, y en ella, tenemos LinkFi testing app, copiamos esa carpeta y nos movemos a nuestra carpeta de proyectos Aquí pegamos esa carpeta. Ahora abre esta carpeta en el código Vas. Bueno. Aquí, primero usamos esta sencilla carpeta de chat. La razón por la que uso aquí aplicación front-end porque con front end real, aprendizaje socket va a ser divertido, y además despejará flujo de trabajo completo de socket. No te preocupes, no necesitas escribir ningún código aquí. Sólo haz lo que yo hago. Entonces, para ejecutar este front-end, rastrea este sencillo archivo GML de punto de chat en el navegador y ábrelo en la nueva pestaña Ver, aquí obtenemos este tipo de interfaz. Ahora volvamos al código vis front end y abre este sencillo archivo de puntos de chat. En la parte superior, se puede ver socket de escritura es igual a AO y por dentro, pasamos nuestro backend Link, que es Local host columna 3,000 Esta expresión significa que queremos conectarnos con socket, que se inicializa en este pot Además, podrías preguntarte cómo estamos obteniendo este método Ao. Estamos obteniendo este método Ao porque agregué socket con Dan Link. Mira, aquí está, y por eso, estamos llegando hasta aquí Aomthod Guarda esta página y vuelve a nuestro front end. Comprobemos nuestra Consola, así que haga clic derecho en la página y vaya a Inspec. Consulta aquí obtenemos este error de curso para la columna host local 3,000 slash socket Ahora podrías preguntar, ya habilitamos curso en esta app express, ¿por qué seguimos recibiendo este error de curso? La razón es que solo configuramos curso para nuestra app express, pero también tenemos que configurar course para nuestro servidor socket. Es realmente simple. Aquí en el método del servidor, en el segundo argumento, podemos pasar las opciones para el servidor socket. Me opongo, pasamos curso aquí también objeto, primer origen de propiedad a estrella, lo que significa que se permite cualquier puerto. Además, si queremos pasar solo nuestro front-end, entonces aquí podemos pasar esa URL. Pero por ahora, nos quedamos con estrella. Puede copiar o portar desde el navegador front-end. Ahora después del origen, podemos pasar métodos, que es array y pasamos aquí, Get y post. Este método de sol especifica qué métodos SGDP están permitidos durante el socket web ndSac Ahora podrías preguntar qué es websocket Hensak. Cuando un cliente se conecta a un socket o di servidor, entonces comienza con la solicitud SDP. El apretón de manos Si tiene éxito, entonces se actualizará a una conexión de socket web. Durante este apretón de manos, el servidor comprueba si el método SDDP entrante está permitido o no Es importante agregar estos métodos porque con eso, nuestra conexión se establecerá. Si no especificamos los métodos correctos, entonces el navegador podría bloquear la conexión debido a un error del curso. Guarde esto y actualicemos nuestro front-end. Ver, aquí no obtenemos ningún error, y si comprobamos nuestro back end en el terminal, obtenemos el mensaje de Consola de un usuario conectado. Y además actualizamos nuestra aplicación una vez más. Entonces en nuestro back end, mira, aquí nuevamente conseguimos que un usuario esté conectado, lo que significa que nuestro usuario front-end está conectado exitosamente con nuestro back end usando socket. Entonces, para recapitular rápido, después inicializar socket, en nuestro back-end, agregamos ao punto en la conexión, y en el segundo argumento, pasamos la función de devolución de llamada Entonces cada vez que un nuevo usuario se conecte con nuestro socket, entonces esta función de devolución de llamada se ejecutará Y también dentro de esta función callback, escribiremos toda nuestra lógica para socket Así inicializamos y manejamos la conexión de socket 190. Emisión del zócalo y métodos: Se podría pensar que escribir un código relacionado con socket es difícil. Tiene muchos métodos y funciones. ¿Cómo podemos aprenderlos? Si tienes este tipo de ecuaciones, entonces no te preocupes. Por primera vez, también creo que el socket es muy difícil. Pero cuando en realidad lo aplico en mi proyecto, es realmente sencillo. Socket tiene principalmente dos métodos, socket dot d y socket dot on. 90% de tiempo, vamos a utilizar estos dos métodos, y créeme, son realmente simples. Entonces, como sabemos, el socket se utiliza para la conversación en tiempo real entre el front-end y el back end. Básicamente, significa que en cualquier momento nuestro servidor o back end puede enviar y recibir datos desde el front-end sin ninguna llamada a la API, y también funciona a la inversa. front-end también puede enviar y recibir datos desde el back-end. Supongamos que desde nuestro front end, Harley quiere mandar un mensaje a back end como este es el nuevo mensaje. Ahora la cosa es, ¿cómo podemos enviar datos desde el front-end? Entonces para eso, usamos socket punto E enviar mensaje. Este es el nombre del evento, y en el segundo argumento, podemos agregar nuestros datos. En inglés sencillo, emit significa enviar. Entonces le estamos diciendo a nuestro socket, emitir los datos, o en palabras simples, enviar los datos. Por esto, enviamos mensaje desde el front-end, pero en el back end, necesitamos escribir también la lógica para manejar ese evento. Y para eso, usamos socket dot en enviar mensaje. Este es el mismo nombre del evento que enviamos desde el front-end. Y en el segundo parámetro, pasaremos la función de devolución de llamada, que se ejecutará cuando consigamos enviar evento de mensaje Entonces escribiremos toda nuestra lógica en esta función de devolución de llamada. Ya sea que queramos almacenar el mensaje en la base de datos o queremos enviarlos directamente a otros usuarios. En palabras simples, solo recuerda cuando queremos enviar datos de front end a back end o back end a front end, usaremos el método socket dot con nombre de evento, y cuando queramos recibir datos desde el back end o desde el front end, entonces usaremos socket dot on, y aquí escribimos el mismo nombre de evento y función callback Implementemos esto en nuestra aplicación. Entonces en front end dab primero, aquí agregué enviar evento para nuestro formulario en el que tenemos entrada de mensaje y botón de enviar Y aquí obtenemos mensaje de entrada y usamos un nombre rellenado en estas dos variables. Entonces todo está listo. Tenemos que enviar mensaje usando socket. Entonces aquí, qué método de socket usamos para enviar el mensaje. Bien, usaremos socket punto m. en el primer argumento, escribimos el nombre del evento, digamos, enviar mensaje. Y en el segundo argumento, podemos pasar los datos que queremos enviar con este evento. Digamos que pasamos aquí objeto con remitente a objeto bajo ID cuadrado para digamos 123 y usamos un nombre para nombre de usuario valor de punto. Y otro contenido de propiedad para ingresar valor de punto, que es nuestro texto de mensaje. También, enviamos creado en a nueva fecha, y también pasamos estado para enviar. Y eso es todo. Aquí, agregamos rellenos como definimos en la base de datos. Aquí, por este código, enviamos los datos del mensaje cuando enviamos un formulario. Ahora, veamos si estamos obteniendo estos datos en nuestro backend o no Entonces dime qué método de socket usaremos para obtener los datos del evento. Correcto, usamos socket dot on. Aprendes bastante rápido, encantador. En nuestro back end en el ao dot on, nosotros en socket dot on. En el primer argumento, ¿qué pasamos? Correcto, pasamos el nombre del evento que queremos manejar, que es enviar mensaje. Asegúrate de escribir el mismo nombre a medida que pasamos desde el front-end. De lo contrario, no funcionará, y además es sensible a mayúsculas y minúsculas. Ahora en el segundo argumento, pasamos la función de devolución de llamada, que se ejecutará cuando alguien desde el front-end envíe este evento send message En el parámetro de esta función, obtenemos los datos, y por ahora, simplemente consolamos log new message from front end, y adherimos estos datos Estos datos son el objeto de mensaje que pasamos desde el front-end. Ahora podrías preguntar, ¿cómo podemos conseguir socket en este punto o en callback Simplemente llegamos aquí desde el parámetro. Usando este socket, podemos agregar métodos emit y on. Guarde estos cambios y enviemos un mensaje desde el front-end. Refresca la página aquí mismo, nombre de usuario y aquí mismo, mensaje, primer mensaje y haz clic en Onsent Aquí, no pasa nada. Y si revisamos nuestro back end, revisa nuestro terminal. Mira aquí conseguimos que el usuario se conecte, y luego obtenemos ese objeto de mensaje, lo que significa que obtenemos con éxito el mensaje desde el front-end. Eso es muy sencillo de enviar y obtener datos usando socket. Solo tenemos que recordar socket dot y socket dot on método. Ahora aquí nos llega el mensaje desde el front-end. A continuación, qué queremos hacer con ese mensaje. Obviamente, queremos almacenar ese mensaje en la base de datos y luego devolver ese mensaje al front-end nuestro front end puede mostrar ese mensaje en la pantalla. Por ahora, no te preocupes por la lógica de la base de datos, implementaremos más adelante. Por ahora, solo queremos mandar este mensaje al front-end. Dime qué método usaremos para enviar los datos de back end a front end. Sí, usamos socket dot, y en el primer argumento, pasamos evento. Obtener mensaje. Se le puede dar cualquier nombre. No importa. Ahora, ¿qué queremos enviar con este evento? Quiere enviar los mismos datos. En el mundo real, enviaremos nuevo objeto de mensaje que almacenamos en la base de datos. Ahora guarda este archivo, y en el front-end, necesitamos manejar este evento de mensaje G, y ya sabes qué método tenemos que usar para manejar el evento u obtener el evento. Correcto, vamos a escribir aquí socket dot on. Primero, pasamos el nombre del evento, Get message, y en el segundo argumento, pasamos la función callback, y en esa callback, en el parámetro, obtenemos esos datos ¿Qué queremos hacer con este mensaje? Simplemente, queremos mostrar ese mensaje en el navegador. Entonces para mostrar el mensaje, creé esta función de mensaje de visualización. Simplemente llame a esto y pase los datos que contiene. Esta función creará mensaje y lo mostrará en nuestro navegador. Además, aquí puedes ver esa lógica si quieres. Guarde esto, y probemos esta implementación. Asegúrese de actualizar la página después de hacer cualquier cambio en el código de front-end. De lo contrario, no obtendrá estas actualizaciones. Ahora usamos un nombre para Hurley y mensaje para primer mensaje y mandamos el mensaje Mira, aquí nos sale el mensaje en el front end dentro de un segundo o se pone en segundo. Entonces, para recapitular rápido, socket tiene principalmente dos métodos, socket dot m y socket dot on Socket dot se utiliza para enviar o emitir los datos. Y con socket dot on, podemos manejar ese evento enviado o podemos ver el evento. Si entiendes estos dos métodos, entonces felicidades. Usted 90% socket está hecho. Es así de simple. 191. Recibir mensajes para ambos usuarios: En la implementación actual, la probamos con un solo usuario. Ahora probémoslo con dos usuarios al mismo tiempo como Haley y Mike están platicando entre sí Así que abre otra pestaña privada del navegador, o también puedes usar otro navegador y abrir el mismo archivo S DML Ahora supongamos que la primera pantalla es Halley spec y la segunda pantalla es Mike spec. Están platicando entre ellos. Entonces aquí Halley manda mensaje, y aquí recibe este mensaje, pero Mike no está recibiendo el mensaje Como aqui desde el back end, estamos enviando mensaje con socket, como esta funcionando para Halley y no funcionando para Mike El motivo está aquí desde el back end, usamos socket punto m. Este método enviará evento solo a ese usuario que emita el evento send message, y es por eso que Halley está recibiendo este mensaje, pero Mike no está recibiendo Ahora bien, ¿cuál es la solución aquí? Porque queremos nuestro mensaje, también lo enviaremos a otros usuarios. Simplemente en el lugar del punto socket, utilizaremos este método ao dot. Usando ao dot, podemos enviar mensaje a todos los usuarios que estén conectados con socket. Guarde este archivo y probemos esta implementación. Refresca ambas páginas. Bueno. Además, aquí escribimos nombre de usuario para ambos usuarios y desde el Hal escribimos mensaje y lo enviamos. Ver, ahora Mike también recibe este mensaje. Y si enviamos mensaje de Mike, mira, Él también lo consigue. Y así es como funciona el chatear en tiempo real. Al usar socket dot desde el back end, solo podemos enviar eventos a los usuarios que emitan ese evento. Y si usamos ao dot, entonces nuestro socket enviará ese evento a todos los usuarios que estén conectados usando socket. 192. Lógica de la participación en una sala de chat: En la lección anterior, estamos recibiendo mensajes instantáneamente en ambos usuarios. ¿Y si agregamos otra ventana y vemos qué pasará? Así que agreguemos otra ventana privada y abramos el mismo archivo HTML. Ahora escribe aquí, nombre de usuario y desde la primera ventana, enviamos mensaje. Consulta aquí para ambos usuarios, nos sale el mensaje. Y si algún otro usuario envía mensaje, entonces también otros usuarios están recibiendo ese mensaje, lo que significa que nuestro socket está enviando el mensaje a todos los usuarios que están conectados al socket. Es como si organizaras una gran fiesta. Aquí, la gente está charlando en todas partes sin habitaciones, y por eso, toda conversación se mezclaría. Es como el usuario A hablando con el usuario B, pero el usuario C escucha todo, así que no habría conversación privada Qué gracioso es que todos estén sutando por toda la casa en lugar de hablar gentilmente en una habitación Aquí también tenemos la misma situación. Nuestra implementación actual es el envío de mensajes a todos los usuarios. Entonces, ¿cuál es la solución aquí? Necesitamos implementar salas. Por lo que las habitaciones en socket pueden resolver este problema al permitirnos agrupar a los usuarios. Cada grupo o habitación es un espacio privado donde solo los miembros de esa sala pueden enviar y recibir mensajes. En palabras simples, room in socket son espacios virtuales donde los usuarios pueden unirse y vivir. En eso se puede transmitir mensaje a todos en una habitación sin molestar a los demás. Supongamos que Halley y Mike's quieren platicar entre ellos. Cuando Halley abre un chat, Halley se une a una habitación que tiene un nombre único como chat HM Halley, Ahora Mike abre jet page para platicar con Halley. Mike también se unió a la misma sala llamada JathM. Ahora ambos usuarios están conectados en una misma habitación. Entonces, si Halley envía mensaje en esa habitación, entonces solo Mike recibirá este mensaje, no la tercera persona Yo Hola cierro la pestaña, luego Halley perdió la conexión con el socket y cuando el socket se desconecta, luego socket dot IO elimina automáticamente Halley de Room jet hm Por esta implementación, nuestros jets no se harán públicos y también esto funciona en el chat grupal también. Supongamos que el usuario A, el usuario B y el usuario C son miembros del grupo, y todos están conectados a un chat de sala específico ABC. Ahora cualquiera de ellos está mandando mensaje. Otros dos recibirán este mensaje porque están conectados en la misma habitación. Entenderás esto correctamente cuando implementemos y probemos esta característica, y lo haremos en la siguiente lección. 193. Implementación de la unión a una sala de chat: Ahora implementemos la función de sala en nuestra aplicación inkifi. Pero antes de eso, permítanme recapitular rápidamente el flujo de trabajo. Entonces, cuando el usuario abre un chat, se unen a la sala con su ID de chat. Solo los usuarios de la misma sala pueden enviar y recibir los mensajes. Y por fin, cuando el usuario sale o cierra ese chat, entonces los retiramos de la habitación. Entonces, antes que nada, cuando el usuario abre un chat, luego desde el front-end, un evento debe activar la llamada unirse a la sala con ID de chat. Después de eso, desde el back-end, agregamos ese usuario en esa sala, y cuando alguien envíe mensaje, enviaremos ese mensaje solo a los usuarios que se unan a esa sala. Aquí en nuestro back end, manejamos otro evento, socket dot on, y qué evento queremos manejar sí, es join room. Ahora aquí obtenemos datos, o podemos decir desde el front-end, enviaremos el ID de chat, la función de flecha, y ahora para unirnos a Room, simplemente escribimos socket dot join, y aquí pasamos nombre de la sala, que es nuestro ID de chat, y para asegurarnos también de consola dot log in backticks, user dollar Cali Brackets, socket dot ID, que es el ID único de usuario actual proporcionado por socket. Unirse a la habitación dólar CL brackets chat ID. Ahora en el enviar mensaje, queremos enviar mensaje solo a aquellos usuarios que actualmente se encuentran en esa sala. Por lo que comentamos este método anterior del EIT, para que puedas verlo más tarde Y aquí escribimos ao dot mensaje MIG, y pasamos aquí los datos Ahora para enviar este evento solo a sala separada, aquí agregamos ao punto dos, y dentro de él, necesitamos pasar ese nombre de sala que configuramos para ID de chat. Ahora la pregunta es, ¿cómo podemos obtener el ID de chat? Bien, podemos pasar el ID de chat desde el front-end. Entonces ID de chat de datos, y eso es todo. Nos unimos al usuario en la sala, y luego enviamos el evento get message solo a esa sala. Ahora para probar esta implementación, necesitamos usar otro archivo SDML Entonces en la carpeta testing, obtendrás otra carpeta llamada Romjat y dentro de ella, obtendrás el archivo llamado Rojatt También, en su archivo JS, primero, conectamos usuario con socket, y luego estamos pidiendo nombre de sala en prompt. Después de obtener el nombre de la sala, enviamos este evento de unirse a la sala. Esto nos ayudará a unirnos a una habitación, y luego el resto del código de front-end es el mismo que antes. Justo en el evento de enviar mensaje, también enviamos jet ID porque lo necesitamos en el mensaje de envío. Ahora vamos a ejecutar este archivo. Excava este archivo y ábrelo en tu navegador. En primer lugar, preguntará por el nombre de la habitación. Aquí, para degustación, estamos pasando cualquier ID de jet aleatorio. Digamos chat subrayado uno, dos, tres. Bien. A medida que escribimos usa un nombre. Sin ella, podríamos obtener error. Escribe usa un nombre, y si en nuestro back-end, abrimos Consola vemos aquí podemos ver usuario conectado, y luego usuario socket ID, unirse a la sala, y aquí obtenemos nuestro nombre de sala, chat, subrayado, uno, dos, tres Genial. Ahora abramos otra pestaña y hagamos lo mismo. Escribe aquí el nombre de la sala, charla, subrayado uno, dos, tres, porque queremos unirnos a la misma sala Ahora aquí escribimos nombre de usuario. Y luego escribir mensaje y enviarlo. Ver, para ambos usuarios, estamos recibiendo este mensaje, así que está funcionando bastante bien. Ahora, vamos a abrir otra ventana y unirnos a una habitación diferente. Hablemos, subrayemos 45, seis. Bueno. Ahora bien, si enviamos mensaje de este usuario, estos dos usuarios no recibirán este mensaje. Y si alguno de estos dos usuarios está enviando el mismo mensaje, entonces este tercer usuario no está recibiendo este mensaje. Entonces esto también está funcionando. Entonces así de sencillo es unirse a room y enviar mensaje a esas salas. Como te dije anteriormente, el socket es muy sencillo. Solo necesitas entender la lógica. 194. Ejercicio: indicador de tipeo: Ahora es el momento de hacer poco ejercicio de socket. En este ejercicio, hay que implementar show typing indicator cuando alguien está escribiendo el mensaje. La lógica es cuando los usuarios empiezan a escribir en la entrada, activamos un evento de socket escribiendo. Y desde el back-end, enviaremos datos quién está escribiendo y en qué habitación está escribiendo. Ahora después de implementar eso como un bono, cuando nuestro usuario no escribe durante 2 segundos, entonces activaremos otro evento llamado Stop typing, que simplemente eliminará indicador de mecanografía del front-end. te preocupes, si no conoces el código de front-end, solo escribe código para backend, maneja el evento y envía a ese usuario que está escribiendo o cualquier mensaje En el front end también, agregué código, que funcionará cuando escribamos algo en el cuadro de entrada. Y también agregué comandos donde tienes que emitir los eventos y también el código que tienes que escribir cuando manejas esos eventos. El objetivo de este ejercicio es pensar en términos de eventos. Entonces intenta implementarlo y luego cuál es la solución. Ahora, veamos la solución de este ejercicio. Entonces antes que nada, en nuestro back end, tenemos que manejar evento, digamos mecanografía. Entonces socket punto al escribir. Y desde el front-end, enviaremos objeto con jet ID y nombre de usuario. Entonces podemos desestructurarlo aquí y obtener jet ID, y también obtenemos el nombre de usuario, la función de flecha Y aquí enviamos este mensaje a otros usuarios que se encuentran en la misma habitación. Entonces o punto dos aquí pasamos el ID de chat, y después de eso, punto, mostrar mecanografía. Y aquí pasamos mensaje en BTI dólar nombre de usuario está escribiendo. Y eso es todo. Después de eso, también necesitamos manejar evento, dejar de escribir, así socket punto encendido, dejar de escribir. Y aquí también obtenemos objeto con ID de chat y nombre de usuario. Y en la función de error, simplemente Iot a chatd punto m, Ocultar mecanografía Aquí le pasamos el nombre de usuario que dejan de escribir, y eso es todo. No necesitamos otra cosa en la parte de atrás. En este ejercicio, si confundes con el front-end, entonces no te preocupes por eso Acabo de agregar front end para degustación. También puedes saltarte esa parte de degustación tan pronto como sepas escribir lógica de socket y evento. Ahora, veamos rápidamente esta parte de degustación. Como te dije en la lección anterior, aquí en la parte inferior, agregué este código, que se ejecutará cuando escribamos algo en este cuadro de entrada. Aquí, si el valor de entrada no está vacío, solo entonces hacemos socket punto m y qué evento emitimos, enviaremos evento de escritura, y en la segunda posición, agregamos objeto con ID de chat a ID de chat, y luego también enviamos nombre de usuario al valor de usuario. En este tiempo de escritura de espera, que se ejecutará después cada 2 segundos cuando escribamos algo en el cuadro de entrada cuando por dos segundos el usuario no escribió nada, luego enviamos otro evento llamado stop typing. Aquí duplicamos este método emit y lo pasamos aquí y cambiamos este evento para dejar de escribir. Fuera de este oyente de eventos, necesitamos manejar dos eventos que emitimos desde el back-end Enchufe punto encendido, mostrar mecanografía. Aquí, pasamos la función de devolución de llamada, y aquí obtenemos el mensaje, el usuario está escribiendo en esta función de flecha, nuestro front-end escribirá su lógica Por ahora, simplemente agregamos aquí esta lógica que agregué en la parte inferior con comando. Ahora después de eso, agregamos otro punto socket encendido. Dejar de escribir aquí también función de devolución de llamada. Aquí llegamos a usar un nombre si quieres usarlo. Y aquí movemos esta segunda lógica para dejar de escribir. Guarda los cambios y echa un vistazo, actualiza la página, Ingresa chat, ID, chat, subraya uno, dos, tres, y escribe usa un nombre, Ali Ahora en otra ventana, también refrescamos la página. Entrar chat, D, chat, subrayado uno, dos, tres, y escribimos usar un nombre para micrófono Ahora escribamos algo de Mike. Consulta aquí para Hola, estamos recibiendo el mensaje de mecanografía. Mike está escribiendo. Pero aquí podemos ver que Mike está recibiendo, Mike está escribiendo. Esto es lo que queremos. Queremos que nuestro back end, solo envíe el evento de mecanografía de espectáculos a los usuarios que estén en la sala de chat, pero no para el remitente. Para eso, aquí en el lugar de ao punto dos, necesitamos hacer socket punto dos y aquí socket dt dos , primeros eventos de mecanografía Te voy a explicar esto en solo un segundo, ver los cambios, y vamos a probarlo una vez más. Refresca la página, escribe jet ID, para chatear, subrayar uno, dos, tres y escribir un nombre de usuario, Harley Y también para Mike, refrescamos la página. Ingresa jet ID, para chatear, subrayar uno, dos, tres y escribir el nombre de usuario, Mike Ahora escribe algo mira ahora solo Harley está recibiendo Mike está escribiendo, y después de 2 segundos, este mensaje sigue aquí. Déjame revisar el evento. Manejamos aquí dejar de escribir desde el front-end y qué evento estamos emitiendo desde el back-end. Oh, es alto tecleando. Entonces, en nuestro front end, cambiamos este evento para ocultar la escritura. Guarda los cambios y probémoslo una vez más. Refresca la página. Escribe ID de chat para chatear subrayado uno, dos, tres, y aquí mismo, usa un nombre Entonces para Mike, reprimimos la página, Ingresa ID de chat para chatear subrayado uno, dos, tres, y aquí mismo, usa un Ahora escribe mensaje desde aquí y si te detienes por 2 segundos, entonces ese mensaje se ha ido. Entonces esto está funcionando bien. Ahora aquí hay una cosita. ver cuando mandamos el mensaje, entonces por poco, estamos consiguiendo Mike esté escribiendo. Eso no queremos. Por lo que también emitiremos el evento stop typing cuando enviemos el mensaje. Así que copia este socket punto m para Dejar escribir y pegarlo al final de nuestro formulario enviar. Guarda los inges y déjame probarlo una vez más. Refresca la página, escribe ID de chat y nombre. También, hacemos esa misma represión, escribimos ID de chat y nombre Ahora escribimos su mensaje y lo enviamos. Mira, ahora no estamos consiguiendo esa mecanografía. Hay cuatro variación de métodos en socket ao dot, socket dot I ao dot two room dot M y socket dot two room dot m. déjame explicarte cada uno con palabras simples. Así ao punto mostrar mecanografía. Esto enviará evento de mecanografía de espectáculos a todos los usuarios conectados, ya sea que se unan a una sala o no. Se enviará el evento show typing a todos los usuarios que estén conectados con socket. A continuación, tenemos socket punto m, Mostrar mecanografía. Esto enviará el evento Show typing solo al remitente. A continuación, tenemos ao punto dos, room dot show typing. Esto enviará evento de mecanografía a todos los usuarios que se unan a esta sala, incluido el remitente. Nuestro caso, son Halley y mic ambos. Es por eso que anteriormente, obtenemos show typing event para ambos usuarios. Por fin, tenemos socket dot two room dot show typing. Esto enviará evento de mecanografía a todos los usuarios que se unan a esta sala excepto al remitente. Yo Hal está escribiendo, entonces Haley no obtendrá este evento de mecanografía del espectáculo Esta es la diferencia básica entre estos métodos. Podemos utilizarlos de acuerdo a nuestras necesidades. No hay reglas sobre usar solo esto o aquello. Usaremos lo que más se adapte a nuestra lógica. 195. Aplicación de un código de mensaje de envío real: Ahora actualmente en nuestra aplicación, cuando el usuario envía mensaje, simplemente enviamos ese mensaje a todos los usuarios que se unan a esa sala de chat. Pero en el mundo real, también necesitamos guardar esos mensajes en nuestra base de datos. Entonces, aunque el usuario saliera de la habitación, podrá ver esos nuevos mensajes y también el historial de los mensajes. Guardemos nuestro mensaje en la base de datos. En primer lugar, quiero aclarar una cosa. Cuando desde el front-end, enviamos mensaje, debe haber un chat ya creado entre usuarios. Por ejemplo, si Hurley quiere enviar mensaje a los ratones y si nunca conversaron entre ellos, lo que significa que no se crea chat entre ellos. En ese caso, cuando Harley envía el primer mensaje, llamamos a API separada que es nuestra API de creación de chat, y cuando Harley tiene et ID, entonces emitiremos el evento send message con el ID de chat. Esto ya lo sabemos, ¿verdad? Recuerda, en el inicio de esta sección, creamos enviar mensaje API. Sí, necesitamos esa misma lógica aquí en el evento send message. Entonces copiemos ese código. Y en nuestro evento de enviar mensaje, simplemente lo pegamos aquí. Ahora, antes que nada, necesitamos hacer esta función de devolución de llamada asíncrona Bueno. Ahora aquí estamos obteniendo ID de chat y contenido del cuerpo de la solicitud. Pero en socket, no tenemos cuerpo de solicitud, así que tenemos que obtener el ID de chat y el contenido del parámetro function. Entonces aquí desestructuramos estos datos y obtenemos aquí ID de chat y contenido Ahora bien, ¿qué más necesitamos? Correcto, necesitamos el ID de usuario también, así que también lo obtenemos en estos datos. Y ahora no necesitamos esta línea. También, en la parte inferior, estamos enviando datos en la respuesta. Pero como sabemos, en socket, no obtenemos respuesta, así que simplemente podemos eliminar eso y del socket en el lugar de los datos, enviamos este mensaje de poblar A en el punto o dos, solo en chat ID en el lugar de datos punto Jet ID. Ahora vamos a comprobar también dónde usamos nuestra respuesta. Sí, en el error de devolución, y también aquí usamos respuesta. En el lugar de enviar error a través de respuesta, aquí podemos enviar mensaje de error a través del evento socket. Pero la pregunta es ¿a quién queremos enviar este mensaje de error? ¿Deberíamos enviarlo a todos los usuarios activos en esa sala? No, queremos enviar este mensaje de error solo al remitente y decirme qué método de socket usamos para enviar solo el evento al usuario actual. Correcto, usamos socket punto m. vamos a enviar evento llamado error en enviar mensaje, y simplemente enviamos mensaje de error acceso denegado. Ahora aquí, nuestro código inferior seguirá funcionando. Entonces para dejar de ejecutarlo, simplemente podemos agregar aquí, volver. Aquí, también emitimos el mismo motor de eventos de error este mensaje a este mensaje. El texto del mensaje de contenido es obligatorio maestro, y después de eso simplemente agregamos return, que saldrá de nuestro código de ejecutar este resto del código. Además, eliminemos este código. Ahora nuestro front-end puede manejar este evento de error como quieran, ya sea que muestren Alert, o muestren notificaciones de brindis. Entonces aquí necesitamos importar estos modelos de chat y mensaje. En la parte superior, antes de estas rutas, agregamos costo, chat es igual a requerir modelos de periodo, slash chats y otro mensaje de costo es igual a requerir modelos de periodo, mensajes de slash, y hecho Guarde los cambios, y probemos esta implementación. En el front end, archivo de puntos de roomchat, podemos checar enviar mensaje estamos enviando los datos o no Sí, antes que nada, aquí en el lugar del remitente, necesitamos enviar ID de usuario. Por ahora, agregamos aquí nombre de usuario valor punto. Entonces en nuestra entrada de nombre de usuario, tenemos que pasar ID de usuario. Después de eso, contenido a valor de entrada. Aquí, no necesitamos esto creado en y estado porque generará automáticamente por mangos, y eso es todo Guarde esto y reformulemos la página. Aquí, necesitamos jet ID, así copiamos el jet ID del Mongo D venimos pasar y pegarlo aquí Ahora tenemos que escribir aquí ID de usuario en el lugar de nombre de usuario porque en caso de que, establecemos ID de usuario como este nombre de usuario punto Valor. Copiamos un ID de usuario de la colección de usuarios de Mongo Divi Compass y lo pegamos aquí como remitente. Ahora escribe un mensaje. Digamos que el socket es fácil. Mira, obtenemos el mensaje y si revisamos nuestra base de datos, y en la parte inferior, este nuevo mensaje también está parado, nuestro evento send message está funcionando correctamente. 196. Autenticar al usuario en Socket: Ahora actualmente en nuestra implementación, estamos obteniendo el ID de usuario actual desde el front-end. Pero en el mundo real, no podemos obtener ID de usuario directamente desde el front-end. Obviamente, por razones de seguridad porque cualquiera puede tomar cualquier ID de usuario y enviar el mensaje. Entonces tenemos que hacerlo un poco más seguro. Y para eso, usaremos middleware socket. Es el mismo concepto que aplicamos middleware en nuestras Como nuestro middleware orth se ejecuta antes de cada solicitud de devolución de llamada igual que el middleware socket se ejecutará antes de que nuestro Déjame mostrarte prácticamente. Aquí antes de este método ao punto on, definimos nuestro middleware socket usando ao dot U. Ahora en este método, pasamos la función callback, que se ejecutará antes de que nuestro usuario se conecte al Por ahora, simplemente agregamos aquí consola dot log, ejecutando socket middleware Guarde los chanes y refresquemos nuestro front-end. Aquí chat, ID, chat subrayado uno, dos, tres. Ahora bien, si revisamos nuestro terminal de back end, vea, aquí primero conseguimos ejecutar socket middleware. Pero, ¿qué es esto? No conseguimos que un usuario se conecte. Así que aquí en nuestro middleware socket, nuestro código se detiene Tenemos que moverlo en la siguiente función, igual que hicimos en nuestro Express o middleware En esta función de devolución de llamada, en la primera posición, obtenemos el objeto socket, que se utiliza para obtener información sobre ese socket Y en el segundo parámetro, obtenemos next, que funciona igual siguiente función en middleware express Ahora, después de esta consola, simplemente llamamos a esta siguiente función. Guarda los cambios y reprime la página. Ingresa aquí jet ID, y ahora en nuestro terminal, C, primero conseguimos ejecutar socket middleware, y luego nos conectamos al usuario Por esto, está claro que el middleware socket se está ejecutando antes de que nuestro cliente se conecte al Ahora en este middleware socket, podemos hacer autenticación de usuario, y ¿cómo podemos hacer eso? Lo hicimos antes en nuestro middleware de autenticación. Derecha. Para la autenticación, utilizamos JWT Entonces en este middleware, comprobamos, usuario pasa el token JWT Es válido o no. Si es válido, sólo entonces el usuario puede conectarse al socket. Y si token no es válido, entonces no vamos a permitir usuario porque para jet, necesitamos iniciar sesión usuario. Ahora podría preguntarse, ¿cómo podemos obtener token en esta función de middleware Entonces aquí usaremos el objeto socket. Entonces Const token es igual a socket dot Hensig. Aquí obtenemos datos que pasamos con nuestra conexión socket. Nuestra planeación es obtener datos en objeto OT y dentro de él, pasamos token. Aquí escribimos socket dot hensgtth dot token. Después de esto, simplemente pasamos aquí condición. Si el token no está disponible, ¿ entonces qué hacemos? Simplemente rechazamos la conexión. Para rechazar la conexión, volvemos aquí siguiente función, y dentro de ella, tenemos que pasar nuevo error Aquí, pasamos mensaje de error a error de autenticación, token requerido. Ahora bien, ¿y si el token de paso de usuario? Simplemente, verificamos ese token, y para eso, necesitamos JWT Entonces, en la parte superior, costo, JWT es igual al token web JSON requerido Bueno. Ahora en la base de datos, agregamos JWT dot verify En el primer argumento, pasamos token, y en el segundo argumento, pasamos nuestra clave secreta process dot Env dot JWT underscore Permítanme verificar el nombre de esta variable. Sí, es clave JWT. Ahora bien, si este token se verifica con éxito, entonces aquí llegamos a los datos del usuario, que pasamos con token Lo almacenamos en la variable llamada usuario, y luego simplemente podemos hacer socket punto usuario es igual a este usuario. Además, quiero que sepas que el objeto socket es diferente para todos los usuarios. Entonces, cuando nuestro usuario se conecte al socket, nuestro socket les asignará este objeto, y por eso, es individual para todos los usuarios. Este usuario de socket tiene nuestros datos actuales de usuarios registrados. Entonces para ver eso, simplemente consola dot log, socket user, y adherimos socket dot user, y luego tenemos siguiente función. Ahora bien, ¿y si este token no se verificó? Tenemos que manejar ese caso también. Así que aquí agregamos try and cache blog y simplemente movemos estas cuatro líneas en el blog Try. Entonces cualquier cosa sale mal en estas cuatro líneas, nuestro método de caché se ejecutará. Entonces en caché, lo que hacemos bien, simplemente rechazamos la conexión. Entonces copiemos esta siguiente función con el error y péguela aquí. Además, en nuestro front-end de degustación actual, necesitamos enviar los datos de usuario de socket dot desde el back end. Así que aquí simplemente agrego socket punto evento de datos de usuario, y simplemente pasamos socket punto usuario. Por este evento, nuestro front end obtendrá los datos de los usuarios registrados. De lo contrario, necesitamos ingresar manualmente el ID de usuario para la degustación. Ahora vamos a esta implementación. Para eso, necesitamos ejecutar nuestro archivo de prueba final. Honestamente, este es el último archivo de prueba. No te preocupes. En nuestra carpeta front-end, obtenemos una carpeta llamada prueba final. Y aquí, como sabemos, tenemos que ejecutar este archivo SDML Pero antes de eso, veamos qué hacía en el archivo JavaScript. En primer lugar, pido un token en el que tengamos que ingresar a Jason Web token. Si ingresamos token, entonces solo conectaremos usuario al socket. Pero espera en este sentido, lo que hice, agrego aquí objeto que enviamos al socket y en ese objeto, pasamos OT y también token a nuestro token. Este objeto lo estamos recibiendo en nuestro back end en el socket dot hang dot th dot Tgon Ahora bien, si se verifica este token, entonces nuestra conexión será exitosa. Y si este token no está verificado o caducado, entonces en el punto socket en el error Connect, obtenemos el error de middleware socket Y también, cuando obtenemos evento de datos de usuario, simplemente configuro esos datos en esta variable de usuario. También todo el código relacionado con socket, agregamos aquí en esta condición if. A ver que está funcionando o no. Así que abre este archivo SDML en las pestañas de cierre del navegador. Ahora, antes que nada, va a pedir token. Pasemos aquí uno, dos, tres, y como sabemos, este token no será verificado por nuestro back end. Veamos qué obtenemos. Golpea Bien. Ver aquí obtenemos error de autenticación, token requerido. Abra cartero y simplemente abra API de inicio de sesión y envíe la solicitud y obtenga el token Copia esto y simplemente pégalo en nuestro archivo SDML. Verás, no obtenemos el error, y si comprobamos nuestro terminal Bend, obtenemos aquí socket user al detalle de nuestros usuarios con ID y nombre de usuario y también conseguimos que un usuario se conecte, lo que significa que nuestro middleware está funcionando bastante bien Ahora, usamos este usuario socket dot en nuestro evento socket. En el evento send message, elimine este ID de usuario del parámetro, y en la parte superior, agregamos cost user ID es igual al socket dot user, y un Score ID. Asegúrate de verificar el nombre de la propiedad ID y también en el evento de tipado en el lugar de obtener el nombre de usuario desde el front-end, podemos pasar aquí socket dot user, dot user name, y hacemos lo mismo en el evento stop typing, socket dot user, dot user name. Ahora también, eliminamos el parámetro de nombre de usuario para ambos eventos. Ahora, volvamos a probar este mensaje de envío. Así que reprime la página y basa el token. Ahora aquí necesitamos el ID de chat, así que copia eso también del MongoiVCMPass Y pégalo en el ID de chat y da clic en Unirse a la sala. Sin unirnos a la habitación, no podemos mandar mensaje. Ahora bien, si enviamos el mensaje desde aquí, digamos que este es el primer mensaje de degustación final. Mira, aquí nos sale el nuevo mensaje, y si revisamos nuestro back end, entonces también se está almacenando en la base de datos con los datos de usuario adecuados. Entonces, para recapitular rápidamente en nuestro socket, no deberíamos obtener datos de usuario directamente desde el front-end. No será seguro. Así que creamos este middleware socket y preguntamos token JWT antes de conectar al usuario a Después de eso, verificamos ese token y simplemente configuramos los datos del token en el usuario socket dot. Así que aquí podemos usar este usuario socket dot en toda nuestra lógica socket. Además, como sabemos, el usuario socket dot es individual para todos los usuarios de socket. Así es como aplicamos y aseguramos nuestro socket usando JSON Web Token. Aquí, como nuestros conceptos anteriores son claros, es realmente fácil entender temas avanzados como el middleware socket Y por eso te estoy explicando socket paso a paso para que puedas entenderlo correctamente. 197. Cómo marcar usuarios como en línea y sin conexión: Cómo sabes, en muchas aplicaciones de chat, obtenemos usuario activo o marca en línea. ¿Crees cómo aplican esa característica? No te preocupes en esta lección, marcaremos a los usuarios como online y offline. En primer lugar, ¿qué opinas cuando un usuario está en línea? Piénsalo en el lenguaje humano. Nuestro usuario está en línea cuando se conecta a socket, y cuando el usuario está desconectado, escribe, cuando el usuario dejó tu aplicación, o podemos decir que se desconectan a socket simple como eso. Aquí antes de estos métodos IO, declaramos un nuevo costo variable usuarios en línea es igual a nuevo mapa. Ahora, algunos de ustedes podrían preguntarse, ¿qué es este mapa? El mapa es un verson avanzado de nuestro objeto. También es colección del par de valor clave. El mapa tiene más entidades que objeto. Entonces como sabemos, en objeto, la clave es la primavera. En valor, podemos fijarlo a cualquier cosa. Pero en el mapa, podemos establecer cualquier cosa cadena, número, lingotes, objeto, matriz, función, cualquier tipo puede ser clave En resumen, para los removedores de adiciones frecuentes, mapa es generalmente más eficiente que el uso de objetos Está diseñado para manejar pares de valores clave de manera más eficiente. En este mapa, cada vez que el usuario se une, podemos agregar ese ID de usuario como clave y su ID de punto de socket como valor. Entonces aquí en el punto io en la conexión, simplemente escribimos usuarios en línea conjunto de puntos. En el primer argumento, pasamos socket dot user dot score ID, que es la clave en el segundo argumento, pasamos socket dot ID, que es nuestro valor. Ahora solo necesitamos eliminar al usuario cuando se perderá su conexión, lo que simplemente significa que este usuario está desconectado. Entonces en la parte inferior, agregamos socket dot on. Aquí, pasamos la desconexión, y luego pasamos la función de devolución El método de desconexión se ejecutará cuando conexión de socket de los usuarios dure. En ese momento, este método de desconexión se ejecutará automáticamente. Además, cuando el usuario cierra la pestaña del navegador, entonces también este método de desconexión se ejecutará automáticamente. Por lo que no necesitamos preocuparnos un método de desconexión desde el front-end. Aquí simplemente agregamos usuarios en línea dot delete, socket dot user dot underscore ID, que es el ID de usuario actual Ver, en el mapa, podemos usar directamente el método set and delete para agregar y eliminar pares de valores clave. Ahora veamos que está funcionando o no. Por lo tanto, simplemente adherimos el registro de puntos de la consola , los usuarios en línea y los usuarios en línea. Así que vamos a copiar esta consola y pegarla cuando agreguemos usuario en este mapa. Ahora, probemos esto. Así que p el archivo SDML en la nueva pestaña, pega aquí tu token Y si revisamos nuestro terminal Bend, vea aquí podemos ver la clave de usuarios en línea para el ID de usuario y el ID de socket como valor. Y si cerramos nuestra pestaña, entonces aquí podemos ver que nuestro usuario en línea está vacío. Entonces es que es fácil. Puedes enviar a estos usuarios en línea a tu front-end y mostrar indicadores como punto verde o algo más. 198. Zócalos múltiples para un usuario único: Aquí hay una cosa en nuestra implementación actual. Como sabemos, nuestra aplicación se utilizará en el navegador o nuestro backend se puede utilizar en aplicaciones Si nuestro usuario se conectó en una pestaña, entonces el ID de usuario y el ID de socket se agregarán en los usuarios en línea. Ahora, si abre una nueva pestaña y se conecta a socket, entonces en nuestros usuarios en línea, obtenemos otra clave como ID de usuario. Pero aquí, la clave anterior y la clave actual es la misma por eso, esta ID de socket será reemplazada por una nueva ID de punto de socket. Ahora imagina que cierra sólo la segunda pestaña. También eliminará ese valor de clave de usuario y marcará a nuestro usuario como offline. Pero aquí sigue en línea. Sigue en línea en la primera pestaña. Entonces aquí tenemos que resolver este problema de duplicación. Entonces, ¿cuál es la solución aquí? Podemos agregar ID de usuario como clave, igual que antes. Pero en el lugar de establecer el ID de socket directamente, podemos agregar array o conjunto de identificadores de socket, lo que significa que dos pestañas tienen dos identificadores de socket. Tenemos ambos en esta matriz, y si el usuario cierra solo una pestaña, entonces podemos eliminar solo ese ID de socket en particular de la matriz. Se puede ver lo avanzado que vamos. Es broma. Implementemos esto en nuestra aplicación. En primer lugar, antes de esto, añadimos costo ID de usuario es igual a socket punto usuario punto subrayado ID Ahora aquí en el conjunto de puntos de usuarios en línea, primero tenemos ID de usuario, y en el segundo lugar como valor, pasamos Nuevo Set. Podrías preguntar qué es lo que está establecido. Set es la versión avanzada de arreglos. No te preocupes. Son realmente simples. La razón por la que usamos aquí establecido en el lugar de la matriz es porque podemos agregar y eliminar fácilmente los ID de socket del socket. Esta línea significa que creamos un nuevo par de valores clave en los usuarios en línea. La clave es el ID de usuario, y el valor se establece que está vacío. Aquí queremos crear un nuevo par de valores clave si nuestro ID de usuario no está ya disponible en usuarios en línea. Entonces aquí pasamos condición. Si los usuarios en línea tienen ID de usuario, si esto es falso, pasamos exclamación Mg. Sólo entonces creamos un nuevo par de valores clave. Así que mueve esta línea aquí. Ahora después agregamos nuevo par, o incluso si el ID de usuario ya está disponible, entonces ¿qué queremos hacer? Bien, simplemente queremos agregar el ID de punto de socket en el valor. Entonces escribimos usuarios en línea punto G, ¿qué queremos obtener? Escribe UserID como clave, y para agregar un valor en set, usamos el método dot add y pasamos aquí socket dot Y por esta línea, agregamos valor de ID de punto de socket en conjunto donde la clave es ID de usuario, simple como eso. Así que aquí en el lugar de socket punto usuario punto subrayado ID, pasamos ID de usuario Ahora en la desconexión, queremos quitar el ID de toma de corriente. Así usuarios en línea punto gt userid punto Dili, socket dot ID. Esto eliminará el ID de punto de socket del conjunto donde la clave es el ID de usuario. Ahora bien, ¿y si nuestro usuario no tiene ID de socket en el valor? En ese caso, también queremos eliminar ID de usuario como par. Por eso, podemos marcar a nuestro usuario fuera de línea. Por lo que pasamos tu condición si los usuarios en línea puntan GET userid el tamaño del punto es igual a cero Entonces simplemente los usuarios en línea punteamos Dilate UserID. Entonces, como puedes ver, podemos agregar y eliminar fácilmente artículos del conjunto. En lugar de usar array donde tenemos que encontrar índice de ese elemento y luego eliminar ese elemento, podemos agregar y eliminar fácilmente elementos del conjunto. A ver que está funcionando o no. Así que reprime la página, página aquí, nuestro token Ahora en la terminal, obtenemos map, que tiene un valor clave, ID de usuario y socket. Ahora en el navegador, abrimos otra pestaña. Aquí abrimos nuestro archivo DML, y nuevamente, déjame pegar el mismo token Bien, y vamos a revisar la terminal. Mira aquí tenemos un ID de usuario, y tiene dos valores, que es nuestro conjunto de identificadores de socket. Ahora intentemos cerrar esta segunda conexión. Nuevamente, revisa el terminal. Mira que el último ID de socket se elimina de aquí, pero nuestro usuario sigue en línea. Ahora si también cerramos la primera pestaña, revisa el terminal. Ver, nuestro usuario es eliminado del mapa, lo que significa que ahora nuestro usuario está desconectado. Entonces así de sencillo es marcar a los usuarios en línea y fuera de línea. Sé que esta sección es un poco larga, pero puedes ver cómo está funcionando esta aplicación en tiempo real. Y si aprendes esto, entonces puedes crear muchos tipos de aplicaciones en tiempo real. Ahora aquí, puedes tomarte un pequeño descanso, beber un poco de agua, estirar tu cuerpo, o escuchar algo de música. Aquí también estoy tomando un pequeño descanso y nos reuniremos en la siguiente lección. 199. Actualizar los mensajes entregados: Veamos cómo podemos actualizar el estado del mensaje a entregado. En primer lugar, descubramos la lógica de la misma para que obtengas una comprensión clara cuando escribas el código. Así que el estado a entregado significa mensaje alcanzado al dispositivo receptor. Ahora hay dos situaciones. Imagine remitente envía el mensaje. Primero, almacenamos ese mensaje en la base de datos con estado a enviar. Ahora, en ese momento, si el destinatario está en línea, lo cual sabremos por nuestros usuarios en línea variable. Entonces, si el destinatario está en línea, inmediatamente marcamos ese mensaje como entregado. Esta es la primera situación. Ahora otra situación es que nuestro destinatario está fuera de línea, lo que también conoceremos por usuarios en línea variable. Entonces, si el ID del destinatario no está disponible en los usuarios en línea, significa que está desconectado. Entonces, si el destinatario está desconectado, inicialmente nuestro estado del mensaje está en envío. Ahora cada vez que el destinatario se conecta al socket, en su momento, recogemos todos los mensajes no entregados y los marcamos como Esta es la segunda situación. Vamos a aplicarlos uno por uno. Nuestra primera situación, nuestro destinatario está en línea. Si él o ella está en línea, entonces simplemente marcamos el mensaje como entregado cuando el remitente envía el mensaje. En el evento de enviar mensaje, aquí en el nuevo mensaje, necesitamos verificar que el destinatario de este chat esté en línea o no. Consors a los usuarios en línea punto, y aquí tenemos que pasar el ID del destinatario. Pero, ¿cómo podemos conseguirlo? Bien, los obtendremos de los participantes, pero es una matriz con ID de remitente también. Entonces a partir de esa matriz, tenemos que filtrar el ID del remitente. Entonces aquí, los destinatarios const es igual a en punto participantes filtro de punto Aquí, obtenemos cada función de flecha ID y simplemente pasamos aquí condición ID punto dos cadena no debe ser igual a ID de usuario. Aquí obtenemos array con ID único porque solo tenemos dos usuarios en nuestros participantes. Por eso aquí en el método He, pasamos los destinatarios paquete cuadrado, índice cero, que es el primer elemento y es Mongo DiBid, necesitamos convertirlo en cadena Por lo tanto, agregamos punto dos cadena. Ahora, ¿qué queremos hacer si nuestro destinatario está en línea? Simplemente, devolvemos el estado a entregado. Si esto no es cierto, entonces en lo demás volvemos enviado. Eso es. Esta es nuestra primera situación. Ahora nuestra segunda situación es que nuestro destinatario está fuera de línea. Entonces, cuando el destinatario abre la aplicación y se conecta con socket, entonces obtenemos todos los mensajes no entregados y simplemente los marcamos como Aquí en socket, escuchamos otro evento socket punto encendido, Marcar mensajes como entregados. Emitiremos este evento desde el front-end cuando nuestro usuario inicie sesión y se conecte con el socket. Ahora dentro de esto, tenemos que hacer algunos pasos. Asegúrese de escribir estos pasos en el comando. De lo contrario, te confundirás. Primero, tenemos que encontrar todos los mensajes de chat en los que nuestro usuario está disponible. Por lo tanto, el costo de los mensajes no entregados es igual a esperar mensaje dot find Además, hacemos esta llamada función web asincrónica. Bueno. Como sabemos en la primera posición, aquí pasamos objeto con condición. Entonces primero, el estado a enviar y también el remitente no debe ser el usuario actual. Remitente en objeto, usamos dólar N para no iguales y pasamos aquí ID de usuario. Entonces no necesitamos todos los campos de los mensajes. Entonces agregamos aquí método select, y dentro de él, pasamos un ID de puntaje, ID de chat y remitente. Ahora, esta consulta encontrará todos los mensajes cuyo estado se envía y su remitente no es nuestro usuario conectado, pero no comprobará que nuestro usuario conectado es participante en el chat o no. Aquí también necesitamos pasar ID de chat. Entonces, antes de esta consulta, necesitamos encontrar todos los jets en que nuestro usuario conectado está disponible. Entonces Const chat IDs es igual a esperar chat dot find. Aquí, pasamos Objeto con participantes a ID de usuario. Esto nos dará una charla así. Pero aquí solo queremos identificaciones de chat porque ese ID lo pasaremos en nuestra consulta de actualización. Entonces, para distraer a los únicos ID de los datos en Mongo Di B, tenemos otro método llamado distins y en los códigos, pasamos fill name que queremos distraer, que que Así que anteriormente, sin método distinto, obtenemos datos como este. Ahora con disting obtenemos nuestros datos así. Así que simplemente podemos pasar estos ID de chat en nuestra consulta fina. Así chat ID dos calibracet dólar en para chatear IDs. Por lo que ahora, solo encontrará aquellos mensajes en que esté disponible nuestro usuario bloqueado. Genial. Ahora necesitamos actualizar solo estos mensajes. Entonces aquí pasamos condición I mensajes no entregados longitud de punto, mayor que cero Sólo entonces queremos actualizar el estado de los mensajes. En este calibracket esperan mensaje punto actualizar muchos. Al principio, pasamos objeto para encontrar esos mensajes no entregados Entonces pasamos subrayado ID a objetar. Aquí, usamos dólar en, y como sabemos aquí, tenemos que pasar matriz de ID de mensaje. ¿Cómo podemos conseguir eso? Los obtenemos de mensajes no entregados, que es la matriz de IDs Escribimos mensajes no entregados mapa de puntos. Aquí, obtenemos cada función de flecha de mensaje, y simplemente devolvemos ID de subrayado de punto de mensaje Por esta expresión, obtenemos la matriz de ID de mensajes no entregados porque método map devuelve una matriz Además, podemos pasar directamente mensajes no entregados aquí. Pero por ahora, me quedo con esto. Si quieres hacer eso por separado, entonces también puedes hacerlo. Ahora, ¿qué quieres actualizar? Para eso, pasamos otro corchetes Cali y pasamos aquí dólar fijado a objetar, estado a entregado. Asegúrate de escribir la ortografía correcta que escribes en el esquema del mensaje. Por lo que actualizamos con éxito los mensajes. Ahora aquí viene una parte divertida. ¿Qué opinas? ¿Qué debemos hacer después de esto? Entonces, para explicar esto con mayor claridad, imagina que Hale y Mike tienen una charla. Actualmente, Mike está desconectado y Hali envió tres mensajes. Como sabemos, por defecto, se enviará su estado. Aquí, nuestro destinatario no está en línea. La lógica en el evento de envío de mensaje no hará nada. El estado permanecerá como enviado. Ahora, igual que Halley, John también envía dos mensajes a Mike Su estado también se establecerá como enviado. Ahora, después de algún tiempo, Mike entra en línea y se conecta con el socket. En el momento en que actualicemos esos tres mensajes de Halley y dos mensajes del John, lo que significa que para un total de cinco mensajes, actualizaremos el estado como entregados Ahora bien, ¿qué deberían obtener Halley y John de la parte de atrás? Simplemente podemos enviar ID de tres mensajes de Halley a Halley y ID de dos mensajes de John a John y decirles mensajes cuyos ID son estos, estos mensajes se actualizan como entregados Entonces nuestro front-end actualizará la parte de la interfaz de usuario usando esos ID, lo que significa que el front-end puede mostrar iconos de verificación doble. Tan simple como eso. Ahora aquí hay una cosa. Imagina que Halley envía 100 mensajes y Mike está desconectado por un año Y cuando se pone en línea, después de la actualización debemos enviar los cien mensajes IDs a Halley, puede aumentar la carga de datos Entonces lo que creo es que en lugar de pasar todos los mensajes ID, podemos enviar jet ID qué títulos se actualizan para entregar, y ese ID de chat único cubrirá todos esos mensajes dentro de ese chat Así que no necesitamos pasar todos los mensajes ID. Entonces aquí, nuestra conclusión es que vamos a crear un objeto donde el nombre de propiedad es el ID de usuario, y como valor, almacenamos una matriz de ID de chat que se actualizan. La razón por la que usamos aquí matriz de ID de chat porque también funcionará para el chat grupal. Para un solo usuario, puede haber varios ID de chat cuyos mensajes se actualizan según se entregan. Ahora, después de obtener este objeto, elegiremos este ID de usuario, encontraremos el ID de socket de nuestro mapa de usuarios en línea y simplemente emitiremos mensaje de evento entregado y enviaremos esos ID de chat. Actualmente, no pienses en cómo front-end actualizará los chats. Se puede gestionar. Aquí nuestro enfoque principal es crear este objeto y enviar mensaje de evento entregado a cada remitente. Resto del trabajo realizado por front end. Nuestro front-end también actualizará todos esos mensajes en la lista de chat y la lista de mensajes la lista de chat y la lista de mensajes o simplemente redirigirá los datos. Vamos a implementar esta parte. Iremos paso a paso. La primera es que necesitamos crear ese objeto que tenga ID de usuario como propiedad y matriz de ID de chat como valor. Const agrupados ID de chat es igual a mensajes no entregados dot reduce aquí tenemos dos parámetros, AEC, que es el acumulador, acumulador es acumulador A medida que obtenemos el mensaje que es el objeto de mensaje único, función de flecha, y en el segundo argumento, podemos pasar el valor predeterminado de este acumulador Entonces pasamos aquí objeto vacío. En primer lugar, lo comprobaremos. El remitente del mensaje ya está disponible en nuestro objeto SC o no. I AC corchete para acceder a la clave del objeto y pasar aquí mensaje punto remitente. Si en acumulador, mensaje punto remitente no está disponible, por lo que agregamos aquí signo de exclamación Entonces dentro de esto, creamos una propiedad por su nombre acumulador, corchete, mensaje punto remitente es igual a matriz vacía Después de eso, simplemente podemos agregar ese jet ID en esta matriz. Acumulador, paquete cuadrado, remitente de punto de mensaje, mensaje push de punto, ID de chat de punto Este mensaje JetD es Object ID, así que tenemos que convertirlo en cadena Al final, simplemente regresamos acumulador. Esto asegura que el acumulador siga creciendo con nuevos mensajes. Ahora en este código, hay un pequeño problema. Si un remitente tiene varios mensajes en el jet, entonces duplicaremos estos ID de jet en la matriz, pero no queremos enviar ID de jet duplicados en la matriz. Así que en el lugar de esta matriz, podemos usar set. Set no agregará valores duplicados. Entonces en el lugar de esta matriz vacía, agregamos nuevo conjunto, y en el lugar de usar el método dot push, usamos el método dot Ed para set. Los ID de chat de grupo devolverán un objeto con el remitente como propiedad y establecerán los ID de chat como valor. Ahora también al final, necesitamos valores en array, así que tenemos que convertir set a array. Para eso, usamos aquí para loop const, remitente en ID de chat grupal En ese bucle, simplemente agrupamos los ID de chat, el remitente de corchetes es igual a matriz vacía y dentro de ella se extendió operador y simplemente agregamos ID de chat de grupo remitente de corchete cuadrado. Ahora tenemos nuestro objeto con ID de usuario como propiedad y matriz de ID de chat como valor. Ahora tenemos que simplemente emitir al remitente y pasar jet IDs array como datos. Aquí nuevamente usamos for loop, const sender ID, jets agrupados El ID del remitente es la clave de nuestro objeto ID de chat grupal. Ahora en este bucle, tenemos que encontrar el ID del remitente está en línea o no. Entonces Const sockets es igual a los usuarios en línea punto Obtener ID de remitente Si tenemos sockets, que ya sabemos que puede ser array y usamos sockets dot para cada uno. Aquí obtenemos ID de socket individual, función de flecha, y dentro de él, simplemente ioda dos socketd.it En el segundo parámetro, pasamos ID de objeto de datos a ID de chat de grupo, ID de remitente de paquete cuadrado. Esto enviará todos los ID CAT a este remitente. Entonces, si quieres, podemos declararlo por separado. Entonces, los ID de chat de costo son iguales a los ID de chat de grupo, corchete, ID de remitente, y en la parte inferior, pasamos ID de chat a ID de chat y listo. Ahora vamos a esta implementación. Entonces los cambios, abrir navegador. En primera ventana, inicio sesión con el token de Hal. Y en la segunda ventana, me conecté con otra cuenta. Genera un nuevo token para otra cuenta. Y pégalo en nuestro sitio web. Ahora, unámonos a Room. Así que copia el ID de chat de la brújula Mongo Dew y pégala y únete a la habitación desde la cuenta Hi Ahora envío mensaje. Esto es probar para primera situación de entrega y enviarlo. Ver, aquí nos entregan. Esta es nuestra primera implementación cuando nuestro destinatario está en línea. Ahora, probemos cuando nuestro destinatario está desconectado. Así que vamos a cerrar esta segunda ventana y otra vez, enviar el mensaje de Hola esto está probando para segunda situación de entrega. Mira aquí no recibimos mensaje entregado. Si verificamos nuestra base de datos, recolección de mensajes, actualizamos la colección, y por fin, obtenemos nuestro estado de mensaje es enviado, lo que significa que no se entrega. Ahora, cuando nuestro segundo usuario se conecte, estado de este mensaje debería actualizarse y Hardy también obtiene los ID de chat cuyos mensajes están actualizados Vamos a abrir la página SDML en la segunda ventana. Inicia sesión con el token de segunda cuenta, dónde está esto, copia esto y agrégalo en token. Ahora, en el momento en que golpeamos Bien, S en la primera ventana, obtenemos el icono de notificación en esta pestaña, y cuando nos movemos a esa ventana, obtenemos que se entreguen tus mensajes de envío. Esto significa que nuestra implementación está funcionando bien, y también en la consola, obtendrá los ID de jet que se actualizan. Es parte muy interesante de la aplicación de chat. Incluso cambiar el estado a escena no es tan difícil ya que este estado de actualización se entrega. Si estás confundido, entonces puedes volver a ver esta lección, entender la lógica y con eso, comparar la lógica con tu código. De esta manera, tus todas tus dudas se aclararán. Ahora en la siguiente lección, implementaremos actualizar el estado de los mensajes como se ve. 200. Actualizar el estado del mensaje para que se vea: Veamos cómo podemos actualizar el estado del mensaje a escena. Estado visto significa que nuestro destinatario vio ese mensaje. Entonces aquí también tenemos dos situaciones. Vamos a entenderlos con el ejemplo. Imagina que Harley tiene cuatro mensajes inéditos de Mike. Se entrega el estado de todos estos cuatro mensajes. Ahora, en el momento en que Halley abre el chat de Mike en ese momento actualizamos el estado de estos cuatro mensajes entregados a escena Por lo que tenemos que buscar los mensajes entregados y actualizarlos como se ve cuando nuestro usuario abre el chat Esta es nuestra primera situación. Ahora imagina que Harley ya está disponible en el chat o sala, y Mike envía un mensaje. En ese momento, también, necesitamos marcar el nuevo mensaje Setters a escena porque Hurley ya está disponible en la sala de chat Esta es nuestra segunda situación. Vamos a implementarlos uno por uno. Así que en la primera situación, tenemos que actualizar las estadísticas cuando nuestro usuario se une a la sala de chat ID. Así que aquí escuchamos un evento más, call socket dot on, Marcamos los mensajes como se ve y pasamos aquí la función callback En primer lugar, volveremos a encontrar todos los mensajes que no son vistos por nuestro usuario actual Entonces const mensajes no vistos es igual a esperar mensaje punto encontrar, y aquí pasamos objeto de comparación primero ID de chat a ID de chat, y obtendremos ID de chat desde el front-end en este parámetro A hagamos esta función asíncrona. Volver a nuestro objeto de comparación, ID de chat a ID de chat, remitente a corchetes Cully, dólar NE no es igual a ID de usuario, que es el ID de usuario actual que estamos obteniendo del middleware socket y A medida que pasamos estado Ahora aquí también, queremos obtener solo rellenos seleccionados, así que seleccione punto y ascore ID y remitente Ahora después de esta consulta fina, adherimos condición si los mensajes no vistos la longitud del punto es mayor que cero, solo entonces ejecutamos la consulta de actualización Entonces en esta condición, escribimos esperar mensaje, actualización de punto, muchos. Al principio, necesitamos el mismo objeto condición. Así que copia este objeto del método find y pégala aquí. Bueno. Ahora en el segundo argumento, necesitamos pasar objeto, set de dólares mojados, Objeto, estado, a escena. Déjame comprobar que pasamos ese valor en nuestro esquema o no. Oh, aquí pasamos leer. Así que mancha esto a la escena porque esto es más fácil de usar. Guarda esto y vuelve a nuestro evento. Ahora, de nuevo, la pregunta es la misma. ¿Qué queremos hacer después de actualizar los mensajes como se ve? Derecho, informaremos a cada remitente cuyos mensajes se actualicen a SN. Entonces aquí solo necesitamos el ID de remitentes porque nuestro jet ID es fijo, que obtenemos del front-end Debido a esto, es mucho más fácil que el evento entregado. Así que los ID de remitente de costo son iguales para decirme qué método usamos para extraer la nueva matriz de la matriz existente. Correcto, utilizamos mensajes no vistos dot Map. Aquí obtenemos la función de flecha de mensaje único y simplemente devolvemos el remitente del punto del mensaje. Este remitente es ID de objeto, por lo que necesitamos convertirlo en cadena. Ahora, como sabemos, este método de mapa recopila todos los ID de chat de los mensajes no vistos, por lo que podríamos obtener ID de remitente duplicados en esta matriz Podemos resolver eso usando set. Envolvemos este método de mapa con paréntesis y aquí mismo, nuevo conjunto Crearemos set, y ahora para convertir este conjunto en array, simplemente lo envolvemos con corchetes y extendemos el conjunto aquí. Este método de mapa nos dará matriz con ID de remitente duplicados. Por eso lo convertimos en set. Yo establecí, no llegamos a duplicar valores, y después de eso, volvemos a convertirlo en simple array. Ahora tenemos ID de remitente, por lo que simplemente podemos hacer for loop const sender, que es el ID de remitente individual de los ID de remitente Asegúrate de que aquí usas not in porque usamos in para obtener claves de objeto, y usamos de olvidar el valor de array. Anteriormente, nuestros ID de chat grupal son objeto. Es por eso que usamos en. Pero aquí, los ID de remitente son array. Por eso usamos aquí fuera. Cometí este error antes y es realmente frustrante porque no me sale el error y aun así el código no funciona de la manera que quiero Así que asegúrate de recordar eso. En este bucle, volvemos a hacer sockets de costo es igual a los usuarios en línea dot get Sender. Aquí, hacemos lo mismo que antes. Si hay enchufes disponibles, entonces enchufes punto fe. Aquí obtenemos ID de socket único, función de flecha, y dentro de él, hacemos Iot dos, ID de socket, escena de mensaje de punto m. Como datos, enviamos el ID de chat a ID de chat, y también enviamos el ID de usuario que envía esos mensajes. Visto por dos ID de usuario, y eso es todo. Se puede ver lo sencillo que es. Esta es nuestra primera situación. Ahora vamos a implementar segunda situación. En eso, nuestro usuario ya está disponible en esa sala. Necesitamos actualizar el estado cuando otro usuario envíe un nuevo mensaje en esa misma habitación. Así que en lugar de escribir lógica en enviar mensaje incluso podemos emitir los mismos mensajes de marca como evento visto desde el front-end cuando el usuario recibe el nuevo mensaje en la sala unida. Por lo que nuestra implementación final relacionada con la escena de estado está completa aquí. Ahora simplemente probemos esta implementación. Entonces en el front end, a medida que nos unimos a una sala, después de eso, emitimos aquí este evento, marcamos los mensajes como se ven y pasamos aquí el valor de ID de chat. También tenemos que emitir el mismo evento cuando recibimos el nuevo mensaje. En el evento GET message, agregamos si condition data dot sender dot guión bajo ID no es igual al ID de guión bajo de punto de usuario Este es el ID de usuario de nuestro usuario que ha iniciado sesión. Si esto es cierto, entonces hacemos socket dot, Marcar los mensajes como se ve. En el segundo argumento, pasamos a valor de punto d. Ver los cambios y echar un vistazo. Refresquemos esta ventana y pasemos aquí el token de Harley. Y también únete al jet. Y desde abajo, enviamos el mensaje. Esto es para el estado de la escena de degustación y enviarlo. Ahora, si en nuestra base de datos, revisamos nuestro último mensaje, vea su estado para enviar. Y ahora si abrimos una nueva ventana, e iniciamos sesión con mi primer token de cuenta. Ahora, nuevamente, si comprobamos el estado de nuestro mensaje, veremos que está actualizado para entregarlo. Ahora, copio este ID de chat, y de otro usuario, me uno a esta sala. Ahora volvamos a revisar nuestra base de datos y actualizar los datos. Mira aquí obtenemos mensaje a escena y también ese usuario obtendrá datos con chat actualizado y quien vio ese mensaje es. Entonces así es como actualizamos el estado como se ve usando socket. 201. Agregar campos de grupo en Esquema: Ahora agreguemos algunas características en nuestra aplicación. Actualmente, en nuestro chat, estamos implementados solo uno a uno chat. Ahora agreguemos también el chat grupal y no necesitamos hacer mucho en él. En primer lugar, agregaremos algunos campos relacionados con grupos en nuestro esquema de chat. Aquí en los participantes, podemos agregar múltiples usuarios que forman parte de este grupo. Después de eso, también necesitamos último mensaje, y después de eso, pasamos este grupo y lo configuramos para que escriba a Bullion y default a false Aquí podemos agregar comandos para grupos. Entonces, cuando implementamos características de grupo, podemos recordar qué campos necesitamos manejar. Ahora, después de eso, el grupo tiene admin, entonces administradores, que pueden ser uno o más de uno Simplemente copiamos la matriz de participantes con ID de objeto y ref al usuario. Agrégalo aquí. A continuación, ¿qué necesitamos? Sí, necesitamos nombre de grupo, que es tipo a cadena, y también el usuario puede agregar icono de grupo o imagen de grupo, que también es tipo a cadena. Creo que esto es suficiente para el chat grupal. También, aquí, asegúrese de no agregar requerido a true para los rellenos de grupo porque si el chat es uno a uno, entonces requerido a true para rellenos de grupo puede darnos un error de esquema. Ahora veamos qué tenemos que hacer en el esquema del mensaje. Aquí para grupo, no necesitamos agregar muchas cosas. Solo necesitamos estatus para todos los miembros del grupo. En mensaje de grupo, el estado no será suficiente. Entonces aquí simplemente agregamos el estado de entrega archivado, que es array, y en el interior, almacenaremos objetos para el estado de cada participante. Entonces primero, usuario en tipo de objeto mongs esquema de punto Tipos de punto punto ID de objeto Ref al usuario. Esta es la ID de usuario de cada participante. También, para ese usuario, agregamos estado, así que copia este mismo objeto desde aquí y pegarlo dentro de este. Ahora, después de eso, también necesitamos tiempo cuando nuestro mensaje sea entregado, entregado en tipo a la fecha, y también necesitamos verlo en y también escribir a la fecha y hecho, no necesitamos más campos. Si en el futuro necesitamos, entonces definitivamente podemos agregarlos aquí. 202. Crear una nueva API de grupo: Ahora vamos a crear API para crear un nuevo grupo. Aquí, no necesitamos usar socket para eso. En la ruta de chat, simplemente podemos copiar esta API de creación de chat y pegarla en la parte inferior. Bueno. Ahora cambia el punto final para crear grupo. Y en esta función, tenemos que hacer pequeños cambios. Primero, en el lugar del receptor, obtenemos la matriz de participantes, que son los ID de usuario de los participantes. Además, obtenemos el nombre de su grupo. Para la imagen de grupo, podemos agregar por separado otra API. Y aquí necesitamos desestructurar el órgano de solicitud. A continuación, también, cambiamos la condición. Si los participantes no están disponibles, entonces devolvemos mensaje de error, se requieren participantes. Ahora aquí no necesitamos encontrar ningún chat porque los mismos participantes pueden tener múltiples grupos. Simplemente eliminamos esta variable de chat y como esta condición si. Y aquí agregamos const chat. Dentro del objeto, agregamos participantes a participantes. Pero aquí también necesitamos agregar el ID de usuario actual en la matriz de participantes. Aquí agregamos array y adherimos ID de usuario. A continuación, nombre de grupo a nombre de grupo. A es group a true, y pasamos administradores a array, y dentro de él, pasamos el ID de usuario actual Si en el futuro, necesitamos agregar más participantes o queremos eliminar participantes, o queremos agregar nuevos administradores o actualizar el nombre del grupo, actualizar la imagen del grupo Por todo eso, podemos crear APIs separadas. Por ahora, no los necesitamos porque nuestro enfoque principal es aprender funciones de chat en tiempo real. Así que vamos a probar esta API. Para eso, abrimos Cartero. Necesitamos otro usuario para agregarlos en grupo. Así que abre registrar una nueva API de usuario. Aquí, pasamos otro nombre de usuario. John subrayado 24, correo electrónico a john en red gml.com, y contraseña, me quedo igual de uno Sabes por qué Porque olvidé las contraseñas. Buen usuario nuevo creado. Ahora vamos a duplicar la solicitud de crear chat y cambiarle el nombre para crear un nuevo grupo y apuntar a cortar API HATS slash Crear También en el encabezado, ya tenemos token y en el cuerpo en el objeto, primero tuvimos participantes para hacer arreglos aquí agregamos todos los usuarios. De la base de datos, simplemente copiamos la identificación de otras dos personas. Asegúrate de no copiar el ID de objeto de tu cuenta corriente, que token pasas en el encabezado. Bueno. Ahora, después de los participantes, pasamos el nombre del grupo, y ¿cómo debemos nombrar al grupo? Digamos ninjas de nodo. Este es el nombre de la escuela, ¿verdad? Sí, y envía la solicitud. Ver, aquí me sale error interno del servidor. Déjame revisar lo que está mal. En una terminal, obtenemos error en los participantes. Oh, aquí paso directamente array dentro de array. Entonces difundimos la matriz de participantes, guardamos los cambios y volvamos a enviar la solicitud. Ver, aquí creamos un nuevo jet grupal. 203. Cómo agregar la lógica del chat de grupo en los eventos de socket: Apliquemos la lógica de chat grupal en nuestros eventos de socket. En primer lugar, comenzaremos con enviar mensaje evento. Imagínese aquí, usuario envía un nuevo mensaje en un grupo. Ahora, en ambos casos, si el usuario envía un mensaje uno a uno o el usuario envía un mensaje grupal desde el front-end, solo necesitamos pasar el contenido del mensaje y también el ID de chat. Entonces en nuestro chat grupal, también, comprobamos que el contenido se pasa o no. También, encontramos el jet por su identificación. A continuación, también creamos un nuevo mensaje con el mismo objeto, pero en el mensaje de grupo, tenemos que adherir el estado de entrega, seleccionar el estado de entrega, y después de eso, pasamos condición si el grupo jette es verdadero, entonces necesitamos crear una matriz de objeto que se vea así Entonces para eso, utilizamos el estado de entrega es igual al jet dot participantes punto Mapa. Aquí, obtenemos la función de flecha de usuario, y dentro de ella, simplemente devolvemos Object. Ahora en el objeto, usuario a usuario, y estado a aquí, pasamos condición. Los usuarios en línea doth usuario. Si esto es cierto, entonces agregamos estado ha entregado. Según lo enviado. Además, agregamos entregado a las dos aquí, también necesitamos la misma condición, por lo que podemos agregar variable antes de esta devolución. El costo en línea es igual al punto de los usuarios en línea como usuario. Ahora en el lugar de esta condición, pasamos en línea y en el entregado en también, si el usuario es verdadero, entonces pasamos nueva fecha, lo contrario, pasamos nulo. Ahora aquí hay una cosa. En estos participantes, también obtenemos el ID del remitente y no queremos agregar ID de remitente en el estado de entrega. Aquí tenemos destinatarios, que es la versión filtrante de los participantes. Entonces en el lugar de los participantes de jet dot, agregamos destinatarios dot Map. Por esto, no necesitamos actualizar el estado explícitamente en la parte inferior. Después de eso, también actualizamos el último estado en el chat. Ahora aquí rellenamos los datos de Sendar y emitimos el evento get message para el ID de chat Ahora también rellenamos los datos, pero aquí también necesitamos rellenar estado de entrega del usuario porque en uno a uno, solo usamos nuestro estado global, pero en el chat grupal, tenemos que mostrar cada tiempo de usuario Aquí agregamos otro método de poblar. Al principio, el estado de entrega punto usuario, y ¿qué quieres rellenar Escribir subrayado ID y nombre de usuario. Ahora veamos qué tenemos que hacer en Marcar los mensajes como evento entregado. Entonces, como sabemos, hacer que el estado de entrega del usuario de inicio de sesión en el mensaje de grupo sea poco confuso. Entonces, en lugar de usar el mismo evento, es mejor que creamos un evento separado para el mensaje grupal. Por lo que estos mensajes de marca, como evento entregado es para un solo chat uno a uno. También, en eso, necesitamos hacer pequeños cambios. Como sabemos, estos ID de chat son todos los ID de chat en los que nuestro usuario está disponible, pero esto también incluirá chats grupales. Entonces aquí en el método de búsqueda de chat, pasamos una condición más. Grupo a falso, lo que significa que devolverá solo uno a un jet, y eso es todo. No necesitamos cambiar ninguna otra cosa. Ahora, vamos a crear un nuevo evento. Así socket punto en evento, digamos, Marcar los mensajes de grupo como entregados, y pasamos aquí una SynclWCFunction Llamará a este evento cuando nuestro usuario inicie sesión en el front-end, igual que emitimos los mensajes de marca como evento entregado. Ahora, antes que nada, necesitamos todos los ID de jet de grupo en los que esté disponible nuestro usuario. Jet IDs es igual a esperar chat dot find. En comparación Objeto, pasamos participantes a ID de usuario. Es el grupo a la verdad. Y aquí solo queremos identificaciones. Entonces qué método usaremos, derecho, usamos punto distinto y pasamos aquí subrayado ID Ahora, después de eso, necesitamos encontrar mensajes no entregados en este grupo IDs cuyo estado se envía Así mismo que antes, const mensajes no entregados es igual a esperar mensaje punto encontrar Objeto, pasamos ID de chat a objeto, dólar en ID de chat. También remitente a objeto, dólar N para nada equivale a ID de usuario, que es el ID de usuario que ha iniciado sesión Ahora necesitamos encontrar también aquellos mensajes que no se entregan al usuario conectado actual. Entonces aquí pasamos estado de entrega. Para objetar, y como sabemos, estado de entrega es una matriz de objeto con el usuario y su estado. Necesitamos verificar usuario como nuestro ID de usuario y el estado está configurado para enviar. Para ello, necesitamos especificar la condición que debe coincidir dentro de los elementos individuales de una matriz. En nuestro caso, es usuario y estado. No te confundas, mira esto. Podemos usar aquí otro Mongoiboperator, dólar Aleem, match to object, y aquí pasamos usuario a ID de usuario, y el estado del usuario se debe enviar Entonces por esta imagen, podemos especificar condición incluso en la matriz de objetos. Además, no necesitamos mensajes ni información, por lo que simplemente agregamos la selección de puntos, y pasamos aquí ID de subrayado, ID jet, remitente y entregamos datos. Genial. Ahora, después de esto, pasamos si condición mensajes no entregados esa longitud es mayor que cero Sólo entonces queremos ejecutar la consulta de actualización. En este registro, usamos cuatro bucles, const de mensajes no entregados Y dentro de este bucle de cuatro, simplemente ponderamos el mensaje punto actualizar uno. Primero, pasamos el objeto de comparación, guión bajo al ID del guión bajo del punto del mensaje, y en los códigos, el estado de la entrega punto usuario a usuario ID y en los códigos, el estado de la entrega punto usuario a usuario En el segundo argumento, pasamos Object with dollar set to object first in codes, delivery status dot dollar dot status, dos entregados. Aquí, este estado de punto dólar nos ayudará a actualizar solo ese relleno cuyo usuario es ID de usuario. Ahora, también, queremos agregar entregado a tiempo, en códigos, estado de entrega dólar punto entregado en, y pasamos aquí nueva fecha. Y hecho. Este bucle for actualizará el estado a entregado para todos estos mensajes no entregados Ahora bien, ¿qué queremos hacer después de actualizar los mensajes? Bien, queremos enviar los ID del jet cuyo estado se actualiza. Entonces, a partir de nuestros mensajes de marca anteriores como evento entregado, simplemente podemos copiar toda esta lógica después de este método de actualización. Y pégalo después del loop de otoño y también asegúrate de que también esté en el blog I. primer lugar, en este blog, estamos creando objeto para remitentes y como valor, obtenemos el conjunto de ID de chat que se actualizan La razón por la que usamos aquí set es porque eliminará todos los ID de chat duplicados y nos dará ID de chat únicos. Después de eso, convertimos eso en matriz, y por fin, ejecutamos este bucle de otoño para su remitente desde los ID de jet de grupo. Y en este bucle, encontramos los identificadores de socket de esos remitentes y simplemente emitimos el estado del mensaje de evento actualizado, y pasamos esos ID de jet a su remitente relacionado Entonces no necesitamos cambiar nada en esta lógica. Se puede ver lo sencillo que es. Sólo tenemos que aclarar lo que queremos hacer. Ahora pasemos al último evento, que es marcar los mensajes como se ve. Aquí también, creamos un evento separado para Marcar mensajes de grupo como se ve. Punto de socket en Marcar mensajes de grupo como se ve. Y aquí pasamos la función de devolución de llamada ASN, y en el parámetro de esta función, necesitamos Jet ID de ese grupo Ahora copiamos la consulta de mensajes no entregados del evento entregado por grupo y la pegamos aquí Ahora aquí cambiamos no entregados a mensajes no vistos, chat, ID de chat, remitente a objeto, dólar NI para no es igual a ID de usuario, estado de entrega, imagen, ID de usuario a usuario, y el estado es objeto, dólar, no es igual a escena Ahora podemos pasar la condición I si los mensajes no vistos la longitud del punto es mayor que cero, entonces queremos ejecutar la consulta de actualización Nuevamente, copiamos este bucle cuatro del evento grupal entregado y lo pegamos en nuestro evento visto. Ahora aquí cambiamos estos mensajes no entregados a mensajes no vistos, y en el dólar de actualización establecido en el lugar de entregado, comercializamos SN y también en el lugar de entregado en, actualizamos SN Asegúrate de no obtener errores en ninguno de estos brackets cli Ten cuidado con eso. Ahora, ¿qué quieres hacer después de que actualicemos los mensajes como se ve? Simplemente, copiamos la lógica del simple evento de escena. Y pegarlo después de nuestra consulta de actualización. Básicamente, aquí nos enfrentamos al remitente sary de estos mensajes, y usando for loop, simplemente emitimos mensaje en evento con ID de chat y visto por, y eso es todo Ahora vamos a probar esta implementación. Aquí, abrimos el archivo SDML final en el navegador, pase token para el usuario Bueno. Ahora necesitamos unirnos al chat grupal. Desde el Mongo Di brújula en la colección de chat, simplemente copiamos nuestro ID de chat grupal y lo pegamos en el ID de chat , y nos unimos a la sala Ahora vamos a mandar el mensaje en este grupo. Hola, esto es chat grupal y envíalo. Bueno. Si revisamos nuestra base de datos, actualizamos la colección, y en la parte inferior, C obtenemos mensaje, y en estado de entrega, obtenemos matriz vacía. Déjame ver qué está mal. Muévete a nuestro evento de envío de mensajes. Aquí en el nuevo mensaje, olvidamos agregar estado de entrega. Así que el estado de la entrega al estado de entrega, guarda los cambios, y volvamos a probar o implementar. Actualizar el navegador, pasar token de usuario. Copia el ID de chat de la colección de chat y pégalo en el ID de chat y únete a la sala. Ahora volvamos a enviar el mensaje. Hola, esto es chat grupal y envía este mensaje. Ahora si nuevamente revisamos nuestra base de datos, actualizamos la colección en la parte inferior, obtenemos nuevo mensaje y en el estado de entrega, ahora obtenemos estado para cada participante. Genial. Ahora agreguemos otra ventana abierta de nuevo sdmlfle aquí agrego un token de Y en el momento en que golpeo Enter, vea en nuestra primera ventana, obtenemos notificación de su mensaje de envío es entregado, lo que significa que nuestro evento de marcar grupo como evento entregado está funcionando. Refresco la base de datos, veo en el estado de entrega del mensaje, ese estado de usuario se entrega, y también nos llega aquí entregado en el momento. Bueno. Ahora déjame unirme al mismo chat. Así que ve con este jet ID. Y pegarlo aquí y unirse a la sala. Ver, en primera ventana, obtenemos notificación tu mensaje es visto por este usuario. Si nuevamente revisamos la base de datos, actualizamos la colección, y en la parte inferior, vemos para ese usuario, actualizamos nuestro estado tal y como se ve y también obtenemos la escena en el momento. Esto significa que nuestros mensajes de grupo de marca como evento de escena también están funcionando correctamente. Es tan sencillo y no confuso porque separamos la lógica en diferentes eventos grupales. Entonces así es como implementamos el chat grupal en el socket. 204. Sección 16: Opciones de despliegue: Bienvenido a la última sección del curso de pelo de nodo definitivo. En esta sección, veremos el proceso de despliegue de aplicaciones de nodo. Por lo que actualmente, nuestra aplicación se está ejecutando en nuestra máquina local. Ahora para usar nuestra aplicación a nivel global, necesitamos implementarla. Es cosa realmente fácil. No te preocupes por eso. Por lo que hay dos formas de implementar aplicaciones de nodo. Podemos usar pass, lo que significa plataforma como servicio, o podemos usar Docker Ahora podríamos preguntar qué es pasar y Docker. Así que pasar o plataforma como servicio significa que podemos usar una plataforma que nos ayude a implementar nuestra aplicación. PAS, contamos con Render, Eoco, Google Cloud Platform, AWS, Microsoft, Azure, etcétera Estas plataformas proporcionan variedad de funcionalidades, por lo que no necesitamos preocuparnos mucho por el proceso de implementación. Es como, imagina que quieres abrir un puesto de comida. Ahora, en lugar de preocuparse por comprar una estufa, configurar la electricidad y obtener conexiones de agua, simplemente alquila una cocina totalmente equipada. Aquí solo necesitas traer tus ingredientes, cocinar tu comida y empezar a vender. Eso es exactamente lo que hace PAS por los desarrolladores. Con PA, no tenemos que preocuparnos por configurar servidores, bases de datos, redes o esquiar. Estas plataformas se encargan de todo eso por nosotros. Simplemente escribimos nuestro código JS de nota, lo implementamos y se ejecuta. Tan simple como eso. otro lado, si quieres Por otro lado, si quieres controlar tu implementación o si quieres implementar aplicación de nodo en tu propio servidor web, entonces Docker es una gran opción Con Docker, podemos crear una imagen de nuestra aplicación e implementar esa imagen en cualquier computadora del mundo Como adivina, usar Docker es un proceso un poco complejo. Por ahora, no tenemos que preocuparnos por eso. Entonces, si no quieres preocuparte por servidores, balanceadores de carga, infraestructura o reiniciar tu aplicación en caso de caída, entonces la plataforma como servicio es una buena opción Por lo que en esta sección, utilizaremos render para desplegar nuestra aplicación de nodo porque tiene la forma más sencilla de desplegar la aplicación de nodo, y además proporciona unas excelentes características. diferentes personas les gusta diferentes plataformas, pero creo que el render es una gran manera de desplegarse y también tiene llanta libre. Por lo que podemos implementar nuestra aplicación de forma gratuita y sin ningún dato de tarjeta. 205. Simplificar el código: Antes de implementar nuestra aplicación, hagamos que nuestro archivo index dot js sea más limpio y legible. Creará una buena impresión en nuestro equipo y también a todos nos gusta trabajar en código limpio. Hagamos que esto suceda. Aquí, creamos un archivo separado para cosas separadas, como para la conexión de base de datos, un archivo separado. Para rutas, tenemos otro archivo, y para socket, también tenemos archivo separado como ese. Es realmente simple. Hagamos esto uno por uno. En primer lugar, separamos la conexión a la base de datos. Aquí en nuestro proyecto, creamos una nueva carpeta llamada startups. Dentro de esto, creamos un nuevo archivo llamado DIBTJs. Ahora en este archivo, queremos agregar código para la conexión a la base de datos. Aquí, del archivo JS de punto índice, corte el método Mongoose dot Connect Y pegarlo en nuestro nuevo cinco. Ahora aquí necesitamos un par de cosas. Primero, necesitamos que los mangos succionado mangosta sea igual a Además, necesitamos este logger, sconct logger es igual a requerir, vamos una carpeta arriba, vamos a config, aquí importamos Ahora, una pregunta que podrías hacer, ¿cómo podemos agregar este código en nuestro archivo JS de punto índice? Es realmente simple. No te confundas. Déjame mostrarte. Aquí en la parte inferior, simplemente módulo de exportaciones de punto es igual a. Aquí agregamos función dentro de esta función, simplemente movemos este método Mangoose dot Connect Volver al índice punto JS archivo. Dime ¿cómo podemos introducir algo desde el archivo db dot js? Utilizamos las startups de slash forward requeridas DV. Esta expresión, devuelve lo que exportemos de este archivo DB y qué función exportamos. Podemos almacenar eso en la variable llamada const DB, y luego podemos llamar a esta función En lugar de hacer esto en dos líneas, simplemente podemos hacerlo en una línea. Aropris de almacenar esa función en DB variable, simplemente podemos llamarla aquí. Cuando llamamos a esa función, se ejecutará el código de conexión, y eso es lo que queremos. Entonces aquí se hace nuestro primer paso. Ahora separemos todas estas rutas de implementación. En la carpeta de inicio, creamos un nuevo archivo llamado routes dot js. Además, igual que antes, exportamos el módulo dot export es igual a funcionar dentro de esta función, agregamos todas nuestras rutas. Así que corta estas rutas de todas las apps con app middleware así curso express dot Json y también middleware de error global Ellos y pegarlos en nuestro archivo de rutas. Ahora aquí necesitamos un par de cosas. En primer lugar, necesitamos esta app y ¿cómo podemos conseguir esta app? ¿Deberíamos crear una nueva app en este archivo y luego usarla? No, no podemos hacer eso porque eso creará una nueva aplicación Express. Pero aquí queremos usar nuestra misma aplicación. ¿Cuál es la solución aquí? La solución es realmente simple. Aquí, desde el archivo js índice, después de este DB, habíamos requerido periodo, inicio de barra, rutas de barra oblicua, que es nuestra función Llamamos a esta función y simplemente pasamos app como argumento. En nuestra función de rutas, simplemente obtenemos app como parámetro. A continuación, ¿qué queremos? curso y cómo podemos obtener sí, podemos usar de la misma manera. Pero como sabemos, por supuesto es nuestro paquete, y podemos usar paquete en cualquier archivo simplemente por entrada. Con app, no podemos hacer eso, solo por eso obtenemos app como parámetro. Entonces en la parte superior, el curso de Costo es igual a requerir Cos. También, necesitamos express, que también podemos importar aquí. Costo Express es igual a requerir express. Ahora después de eso, también necesitamos logger, sconct, logger, es igual a requerir, vamos uno más completo arriba, config, Ahora, a continuación, necesitamos estas rutas, seconstUser rutas, es igual a requerir Aquí, también movemos una carpeta hacia arriba enruta a los usuarios. Ahora duplica esta línea dos veces más usando alter plus tamizar, más flecha hacia abajo o opción punto Tamizar más flecha abajo. Aquí primero, cambiamos el nombre de la variable para publicar rutas y archivo para publicar. A continuación, cambiamos la variable a rutas de chat y archivo a chats y eso es todo. Terminamos con el Paso dos. Ahora separemos nuestra lógica de socket. De esta variable de usuarios en línea, seleccionamos nuestro código hasta que obtengamos el punto del servidor LISN Cortamos esta la carpeta de inicio, creamos un nuevo archivo llamado socket dot js. En este archivo, nuevamente el módulo exportaciones de punto es igual a la función. En esta función, agregamos nuestro código. Ahora, antes que nada, aquí necesitamos este método AO. Dime, ¿deberíamos crear un nuevo objeto Ao? Necesitamos usar ese mismo objeto Ao que creamos usando server. En el archivo index dot js, habíamos requerido socket de startups de periodo. Y aquí llamamos a esta función y simplemente pasamos aquí Ao Object. En el archivo socket dot js, aquí obtenemos el objeto Io un parámetro. Tan simple como eso. Ahora en esta lógica, tenemos que importar muchas cosas, así que no trates de prisa. Vamos línea por línea. Ver, en este ous, necesitamos este JWT En la const superior, JWT es igual a requerir el token web JSON. A continuación, lo que necesitamos. Sí, necesitamos este modelo de chat, y también necesitamos este modelo de mensaje. Entonces en la parte superior, costo chat es igual a requerir aquí vamos una carpeta b modelos chats. Además, si te confundes al importar archivo, entonces déjame mostrarte mi trigonometría cuando estoy importando archivo Aquí queremos importar modelo de mensaje. Mensaje de costo es igual a requerir, en primer lugar, contrajo todas las carpetas usando este botón, y luego simplemente abro la carpeta en la que estoy trabajando. Es startup, y también abrir carpeta desde la que quiero importar. Eso son modelos. Actualmente, estamos en la carpeta Stu Tenemos que salir de esa carpeta, así que agregamos período, barra hacia adelante de período Entonces queremos ir en la carpeta Modelos, e importamos del modelo de mensajes. Ver, es así de simple. Ahora déjame ver qué más necesitamos importar. Creo que eso es todo lo que necesitamos. Si nos perdemos algo, entonces obtenemos error. No te preocupes por eso. Ahora veamos cómo se ve nuestro índice Dsi ver, ya está claro, pero vamos a dejarlo más claro. Aquí tenemos una gran cantidad de entradas no utilizadas. Podemos eliminarlos. Primero, eliminamos la línea de entrada de código, así que presione Control más X o Comando más X para eliminar toda esa línea. Por lo que eliminamos a Mongos y eliminamos todas las importaciones realizadas las cuales no se utilizan todas Ver, ahora nuestro código se ve más limpio, fácil de escalar, y a todos nos encanta trabajar con este tipo de aplicaciones limpias. Así es como debería verse el código de desarrolladores profesionales . 206. Preparación de la aplicación Node para la producción: Ahora, antes de comenzar el proceso de implementación, es mejor que preparemos nuestra aplicación de nodo para la producción. Entonces para eso, necesitamos algunos paquetes como el primero es casco. Ya usamos eso en nuestro proyecto anterior. Básicamente, el casco se utiliza para la seguridad de nuestra aplicación. Es una excelente opción para mejorar la seguridad de nuestra app con una configuración mínima. Además, protege nuestra aplicación de vulnerabilidades web comunes configurando automáticamente los encabezados STDP adecuados En nuestro terminal NPM instalar casco y si quieres usar el mismo erson que el mío, entonces puedes usar a la tasa 8.1 0.0 y golpear Enter Ahora otro paquete es la compresión. Este también es un paquete muy útil para aplicaciones de nodo. Como sabemos, a veces tenemos que enviar datos de big size a muchos usuarios. Por ejemplo, lista de post o lista de mensajes. Este paquete comprimirá esos datos de gran tamaño y reducirá la carga de envío de big data. Entonces NPM instala Compresson en el d 1.8 0.0 y pulsa Enter. Bueno. Ahora, vamos a implementar estos paquetes en nuestra aplicación. No te preocupes, son solo dos líneas de núcleo. Así que aquí en la carpeta de inicio, creamos un nuevo archivo llamado prod dot js. En este archivo, importamos estos dos paquetes. Entonces const, casco es igual a requerir casco y const, compresión es igual a requerir Igual que antes, exportamos la función de este módulo. Entonces módulo dot export es igual a aquí exportamos función. Aquí obtenemos app como parámetro, y dentro de ella, queremos implementar este medio era. App dot U casco cual es la función, nosotros lo llamamos. Por esto solo se aplica casco en nuestra aplicación. También agregamos compresión app.us, y también lo llamamos y hecho Por estas dos líneas de código, aplicamos estos paquetes en nuestra aplicación. Además, puede agregar este código en el archivo route dot js. No hay nada de malo en eso. Ahora aquí solo necesitamos importar este módulo en nuestro archivo principal index dot js. Aquí antes de estas rutas, simplemente requerimos period databsPD que devolverá esa función Entonces tenemos que llamar a esa función y simplemente pasar tu app como argumento. Asegúrese de que se agregue antes de importar esta ruta. Entonces nuestro casco y compresión aplican para todas las rutas, y eso es todo. Al usar esas dos líneas, podemos hacer que nuestra aplicación sea un poco mejor. 207. Descripción del proceso de implementación: Veamos la descripción general del proceso de implementación para que no nos confundamos. Actualmente, nuestro código está disponible en nuestra máquina local, o podemos decir en nuestra computadora. Ahora para hacer que nuestra aplicación viva en Internet, utilizamos la plataforma de renderizado. En primer lugar, subiremos nuestro código en Github, y luego conectaremos nuestro repositorio Github con nuestro servicio, que es render. No te preocupes por eso. Es realmente simple. Te explicaré todos los pasos de manera sencilla y fácil. Además, veremos cómo actualizar nuestro código después de implementar nuestra aplicación. Empecemos con la carga de la aplicación de nodo en Github. 208. Cómo subir una aplicación Node en Github: Veamos cómo podemos subir nuestro proyecto en Github. Si no conoces Github, en definitiva, es un sitio web que permite a los desarrolladores almacenar, compartir y colaborar en código con otros desarrolladores. Además, Github permite a los desarrolladores crear repositorios o podemos llamar a repositorios donde pueden almacenar su código y realizar un seguimiento de los cambios a lo largo del tiempo Esta es la mejor y más fácil manera para que los equipos trabajen juntos en un mismo proyecto sin sobrescribir el código del otro Entonces hay muchas formas de subir nuestro código en Github, pero veremos la forma más fácil y sencilla, que es mediante el uso de la aplicación de escritorio Github. Dirígete a Navegador y busca aplicación Github Dektop y abre este primer enlace Ahora da clic en el botón Descargar. Esto llevará algún tiempo. Y después de completar esta descarga, abra la configuración y se inicia nuestro proceso de instalación. Bueno. Ahora, si abres esta aplicación por primera vez, entonces tienes que iniciar sesión con tu cuenta de Github. Entonces para mostrarte esto, elimino mi cuenta de Github de la aplicación de escritorio Gitub Ahora para iniciar sesión, vaya a archivo y abra Opciones y haga clic en este signo en forgitub.com Continuar con el navegador. Esto nos redirigirá en el sitio web de Gituboficial, llenará su nombre de usuario y contraseña de su cuenta de Gitub y Tengo que verificar mi cuenta y listo. Y ahora da click en esta aplicación de escritorio Open Github. Automáticamente nos redirigirá en nuestra aplicación. No te preocupes, solo necesitas configurarlo por primera vez. Ahora verifiquemos que iniciamos sesión o no. Así que de nuevo, vamos a archivo y Opciones, y en las cuentas, podemos ver que tenemos nuestras cuentas. Ve a la opción Git, y desde aquí, podemos establecer nuestro nombre y correo electrónico para nuestro Github. Entonces, cuando empujemos código en el Github, otros miembros del equipo verán este nombre y correo electrónico. También asegúrate de seleccionar tu correo electrónico oficial aquí y haz clic en Guardar. Ahora, antes de seguir adelante, como sabemos, en nuestro proyecto, tenemos carpeta de módulos de nodo. No queremos publicar esto en Github porque en cualquier momento, podemos generar la carpeta Node Module usando el comando NPM install. Entonces es inútil, subimos toda la carpeta de módulos de nodo, que tiene muchos archivos. Entonces tenemos que ignorar esa carpeta para que no se suba en Github. Para eso, en nuestro proyecto en la raíz, creamos un nuevo archivo llamado dot git ignore. Asegúrate de no cometer ningún tipo de errata en este nombre de archivo. Debe ser punto gitignore. Ahora en este archivo, podemos agregar qué archivos y carpetas queremos ignorar o en palabras simples, qué archivos y carpeta, no queremos subir en Github. Supongamos que queremos ignorar esta carpeta de módulos de nodo, por lo que escribimos módulos de subrayado de nodo, que es el nombre de la carpeta y la diagonal hacia adelante, lo que indica que esta es Del mismo modo, queremos ignorar la carpeta de registros. Entonces, ¿qué escribimos? Escribir registros hacia adelante barra diagonal. Ahora aquí hay una cosa. Cuando subamos nuestro código en Github, como sabemos, este código se hará público y todos podrán ver nuestro proyecto. Ahora supongamos que subimos nuestro proyecto y este donVfle también se suba Por eso, nuestra información toda secreta se hará pública y cualquiera puede hacer un mal uso de ella. Entonces tenemos que añadir también este archivo punto NV y gitignore. Déjame mostrarte cud corto para obtener el archivo Gate Ignorar. Simplemente vaya a su navegador y busque, Get Ignore, Github. Abre este primer enlace, y aquí obtenemos todas las plantillas para diferentes tipos de aplicación. Tener Android Git Ignorar. Además, tienes C plus, C, y muchos más archivos. Ahora busca en la parte superior, nodo gitignore y abre Ver, aquí obtenemos el contenido del archivo GetI Nur. Simplemente copie este código y agregue ese código en nuestro archivo GetI Nur Guarde los cambios, y tenemos nuestro archivo GetI Nur. Fresco. Ahora por fin vamos a subir nuestro código en Github. Para agregar nuestro código al repositorio, vaya a Archivo y seleccione Agregar repositorio local. Y aquí seleccionamos nuestro camino de nuestra aplicación inkifi. Ahora aquí dice que tenemos que crear un nuevo repositorio, así que da clic en ese enlace. Y aquí tenemos que pasar nuestro nombre de repositorio. También, podemos escribir aquí descripción. Esta es la aplicación de redes sociales y haz clic en Crear repositorio. Ahora verifiquemos que teníamos el camino correcto o no. Así que da clic en mostrar en Explorer y vea aquí obtenemos nuestra carpeta Linky five, así que ciérrela, y simplemente haga clic en Repositorio publicado Aquí podemos cambiar el nombre y descripción del repositorio, y también podemos seleccionar la privacidad del código. Además, puedes hacerlo privado, pero quiero darte este código. Por eso lo hago público y hago clic en Publicar. Tomará algún tiempo y listo. Vamos a verlo en Github, así que da clic en ver en Github y vea aquí obtenemos nuestra aplicación. Encantadora. Puedes ver lo sencillo que es subir código en Github. Ahora en la siguiente lección, configuraremos nuestra cuenta de render. 209. Implementación de una aplicación de nodo en el procesamiento: Implementemos nuestra aplicación backend en Render. Así que dirígete a render.com, y antes que nada, registraremos nuestra cuenta aquí Podemos usar Google o Github para el registro o simplemente podemos usar el correo electrónico y la contraseña, y obtuvimos este dashboard. No te preocupes por eso. Simplemente haga clic en el botón Nuevo, y aquí seleccionamos servicio web. Ahora aquí necesitamos conectar nuestra cuenta de Github. Entonces Glicon conecta Github e inicia sesión con tu cuenta de Github Asegúrate de usar la misma cuenta de Github en la que publicamos nuestro código backend Desde esta página, podemos seleccionar qué repositorio queremos agregar en nuestra cuenta de render. También puedes agregar todos los repositorios, pero en mi sugerencia, seleccionar solo la opción de repositorio seleccionada. Desde aquí, podemos seleccionar repositorio, así podemos seleccionar nuestra aplicación inkifi Ahora, esto nos redirigirá al dashboard home. Ver, ahora tenemos aquí nuestro repositorio. Simplemente, da clic en este repositorio, y aquí obtenemos nuestro formulario. Ahora, antes que nada, aquí agregamos nuestro nombre de aplicación, que es nuestro Linkifi Obtendremos este nombre como nuestra URL base de nuestra aplicación. A continuación, tenemos entorno que se establece en nodo. No cambies eso. A continuación, podemos seleccionar la sucursal de nuestro repositorio Github que es principal o master. También, podemos seleccionar región. Ahora para el directorio raíz, agregamos period, y para el comando build, escribimos NPM install. Para el comando start, simplemente agregamos node index dot js. Básicamente, mediante este comando, render ejecutará nuestra aplicación. Desde abajo, seleccionamos nuestro tipo de servicio que seleccionamos de forma gratuita. Ahora da click en este desplegable Avanzado y seleccionamos Agregar Archivo Secreto y dale un nombre punto y V. Ahora volvemos a nuestro proyecto vagón, y en eso abrimos DotyNVFle en el que tenemos Simplemente copie todo el código y en el sitio web de Render, haga clic en Contenidos y pegue nuestro código aquí. Ahora basta con hacer clic en Crear servicio web y ver que se inicia nuestro proceso de implementación. Tomará algún tiempo como de cinco a 10 minutos. C, construir con éxito. Ahora se está desplegando y después de eso, me sale un error en una conexión B golosa. Déjame revisar esto. Es error relacionado con la variable DB. Creo que me equivoqué al agregar archivo secreto. Entonces aquí vamos a la pestaña de medio ambiente, y aquí, déjame revisar el contenido del archivo. Es bueno. Oh, aquí entro mal nombre de archivo. Debería ser DotNV. Intencionalmente creo este error porque quiero mostrarte cómo verificar el entorno de un autobús. S los cambios, y de vuelta a Logstb. Aquí, volverá a iniciar el proceso de despliegue. Y vea aquí nuevamente obtenemos error en la conexión a la base de datos. ¿Por qué? Por lo que actualmente, nuestra base de datos es base de datos local, lo que significa que está funcionando en nuestra máquina local. Ahora cuando implementamos la aplicación de nodo, no podemos acceder a la base de datos local. Entonces en ese momento, tenemos que agregar base de datos Cloud, y lo haremos en la siguiente lección. 210. Cómo agregar MongoDB Cloud: Actualmente en nuestro back end, tenemos la base de datos local de Mongo Debe, por lo que tenemos que crear nuestra base por lo que tenemos que crear nuestra Mongo Dibe en la Nube Por eso, todos los usuarios utilizarán la misma base de datos. Así que dirígete a mongotib.com y simplemente regístrate Solo tardará 1 minuto en configurarlo. Ya me inscribo, así que aquí trato de iniciar sesión con mi cuenta. Gracias a Dios, está abierto. Ahora en la esquina superior izquierda, aquí obtenemos nuevo botón de Proyecto. Da click en eso y aquí escribimos nuestro nombre de proyecto, que es nuestro Linky fi y damos click en siguiente Ahora desde aquí, podemos agregar miembros del equipo a nuestro proyecto. Simplemente haga clic en Crear proyecto. Ahora haga clic en el botón Crear. Aquí, seleccionamos plan, simplemente vaya a la versión gratuita y haga clic en Crear implementación. Y vea aquí obtenemos nuestro nombre de usuario y contraseña para nuestra base de datos. Entonces copio el primer nombre de usuario y en nota pagada, lo pego aquí. Después de eso, copia también esta contraseña aleatoria y pégala también. Este es el paso más importante. Podemos guardar este nombre de usuario y contraseña como respaldo de nuestra base de datos. Ahora haga clic en Crear base de datos. A continuación, hacemos clic en, escogemos un método de conexión. Seleccione aquí Brújula. Ver, aquí obtenemos la URL de conexión de Mangaib para Cloud. te preocupes, simplemente copie este enlace de base y en nuestro archivo ENV en el lugar de esta tinta Mangaibi local, pegamos nuestro Además, aquí olvidé agregar un nombre de base de datos al final de esta URL. Así que asegúrate de agregarlo así. ¿Bien? Ahora vamos a continuar. Tenemos que dar acceso a una red que pueda leer y escribir datos en nuestra base de datos. Desde cualquier lugar, el usuario puede acceder a nuestra base de datos y obtener post de ella. En el lado izquierdo, vaya a Red Xs. Aquí tenemos nuestra dirección actual. Haga clic en Editar y simplemente haga clic en Permitir acceso desde cualquier lugar. Usted establece nuestra dirección en 0.0.0.0, que es el ases para cada uno y da clic en Esto tomará poco tiempo y verá que está activo. Bueno. Además, si quieres verificar la configuración relacionada con el acceso a la base de datos como editar contraseña o algo así, entonces puedes hacerlo desde este paso. Ahora, verifiquemos que esté conectado o no. Así que abre terminal y escribe nodo, index dot js, y presiona Enter. Esto llevará algún tiempo y nos vamos a conectar con éxito, por lo que está funcionando. Ahora tenemos que actualizar nuestro código desplegado. ¿Cómo podemos hacer eso? Simplemente, solo necesitamos empujar nuestro código a Github y render detectará automáticamente esos cambios, y es por eso que no agregamos ningún proyecto a Github. Ahora aquí hay una cosa. Sabemos que ignoramos este archivo Dotty y V para que no se cargue en Github Para actualizar los valores de las variables de entorno, necesitamos ir al sitio web de render. Aquí seleccionamos variables de entorno. Da click en editar y simplemente desde aquí, podemos editar nuestros valores. Sustituyo la URL de la base de datos a la Nube. Aquí también, tienes que agregar tu nombre de base de datos al final de esta URL. Ahora, haga clic en, guarde, reconstruya e despliegue. Bueno. Si revisamos nuestros registros, después de algún tiempo, volveremos a implementar el registro. Y mira aquí conseguimos que Mongo a B se conecten con éxito. Encantadora. Ahora, probemos que nuestra aplicación en realidad está funcionando o no. Así que aquí copiamos la URL de Cspace de nuestra aplicación desplegada. Ahora abierto cartero, y en esto, duplicamos esta creación nueva API de usuario porque solo creamos la base de datos fresca, por lo que no tenemos nuestros datos anteriores en ella Ahora cambiemos la URL del host local con la URL nuestra aplicación implementada y enviemos la solicitud. Mira, aquí obtenemos JWT Token, lo que significa que nuestra API está funcionando. Vamos a verificar eso. En el sitio web de Mongo Deb, ve a nuestra app Linkify aquí obtenemos Browse Colection y vemos, aquí obtenemos todas nuestras colecciones, y yo comprobamos y yo Ver, aquí conseguimos el nuevo usuario. Encantadora. Pero espera, mientras estoy llegando aquí sabor nombre de base de datos. Creo que se me olvidó agregar el nombre de la base de datos en la URL de la colección. Vaya a variables de entorno, haga clic en Editar. Y sí, después de esta URL, agrego forward slas y aquí agrego nombre de base de datos Digamos, nuestro Linky fi y simplemente haga clic en Guardar, reconstruir e implementar Reconstruirá nuestra aplicación, y al final, nos conectamos con nuestra base de datos. Déjame probar de nuevo la API, enviar la nueva solicitud de usuario, y aquí me sale nuevo token. Bueno. Ahora ve al sitio web de Mongoib y actualiza la base de datos. Ver, aquí consigo nuestra base de datos inkifi. Genial. Ahora déjame mostrarte también cómo podemos actualizar nuestro código y volver a implementarlo. Entonces, en nuestro proyecto, ¿qué podemos cambiar? Vamos a este mensaje de Consola, servidor se está ejecutando en portar PT. Esto es solo para demo, guarda los cambios y para actualizar el código en render. Tenemos que simplemente empujar nuestro código en Github, renderizar, automáticamente recuperaremos nuestras actualizaciones y lo volveremos a implementar Así que volvamos a nuestra aplicación de escritorio Github, y aquí pasamos Commit message. Digamos, actualice el mensaje de la Consola y haga clic en Commit one file to main, y al final, simplemente push origin. Ahora en nuestro sitio web de render, vamos a la sección de despliegue, y aquí después de uno a 2 minutos, podemos ver que se está desplegando y al final, conseguimos que el servidor se esté ejecutando en el puerto Nuestro puerto, lo que significa que nuestro código se actualizó con éxito. Puede ver que el proceso de implementación es realmente simple y fácil. Solo necesitas subir tu código en el repositorio Github y luego usando render, implementaremos nuestra aplicación rápidamente. Y si queremos actualizar nuestra aplicación, entonces solo necesitamos empujar los cambios en el Github y en los dos a 3 minutos, nuestro servidor se reiniciará y obtendremos nuestras actualizaciones. 211. ¿Qué es la arquitectura MVC? [EXTRA]: Ahora bien, si estás trabajando como desarrollador, entonces definitivamente has escuchado sobre arquitectura MVC en grandes proyectos Entonces veamos qué es la arquitectura MVC y por qué la necesitamos. Así que MVC significa controlador de vista de modelo. Básicamente, es una forma de organizar nuestro núcleo de aplicaciones. Entonces, en el futuro, será mucho más fácil administrar, mantener y escalar la aplicación. En palabras simples, se trata una estructura de carpetas que separa diferentes partes de nuestra aplicación. En la arquitectura MVC, creamos tres carpetas separadas. Uno para el modelo, el segundo para la vista y el tercero para el controlador. No te confundas. Es realmente simple. Así que la carpeta modelo es donde viven nuestros datos. Aquí, tenemos que definir cómo deben ser los datos de estructura y cómo interactuar con su base de datos. Por ejemplo, en la aplicación Node, ya creamos la carpeta de modelos, y en eso almacenamos todos los modelos y esquemas para cada colección Mongo be, y por eso nombramos a esta carpeta como A continuación, tenemos ver carpeta. Ver significa lo que ve el usuario. Es la parte UI de nuestra aplicación. Por ejemplo, en la aplicación Node, podríamos tener motores de plantillas como EJS o PUG o tenemos archivos SDML o CSS, que queremos mostrar Entonces, si tenemos código relacionado con front end, entonces podemos almacenar ese código en la carpeta view. Ahora por fin, tenemos la carpeta del controlador. En la carpeta Controller, almacenaremos la lógica de nuestra aplicación. Por ejemplo, si abrimos la ruta de nuestro usuario, aquí podemos ver esta es la función de devolución de llamada ASN, que se ejecuta cuando alguien envía solicitud de publicación en este Esta es la parte lógica. En la carpeta de Controller, almacenaremos las funciones ASN por separado, y luego simplemente lo importaremos aquí en las rutas No te preocupes, simplemente tenemos que cortar y pegar estas funciones. Eso lo veremos en tan solo un minuto. Aquí entendemos el modelo MVC para datos, vista para cosas relacionadas con la interfaz y controlador para la lógica de la aplicación Pero podría preguntarse, ¿cuál es el punto de esta arquitectura MVC ¿Por qué les gusta a las grandes empresas? Entonces como sabemos en las grandes empresas, hay grandes equipos que están trabajando en una sola aplicación. Si creamos una carpeta separada para cada parte como modelo, vista y controlador, entonces creará una separación de preocupaciones. Aquí por separación, nuestro código puede ser más fácil de administrar. Supongamos que un equipo trabaja en las características relacionadas con la publicación, segundo equipo trabaja en funciones relacionadas con el pago y otro equipo trabaja en las funciones relacionadas con el usuario. Cada equipo no necesitó tocar modelo de publicación o el archivo de modelo de pago o el archivo de modelo de usuario. Trabajarán en sus características separadas, y es por eso que cuando empujan código en Github, no surgirán grandes conflictos. Además, otro beneficio de MVC es que es fácil de mantener. Queremos actualizar el modelo, entonces no necesitamos actualizar los archivos de vista. Otro beneficio es que es mucho más fácil de escalar. medida que nuestra app crece, es más fácil agregar nuevas funcionalidades porque todo ya está bien organizado, y es por ello que las grandes empresas y hoy en día freelancers también bajan esta arquitectura MVC Ahora aquí está la estructura de carpetas para la arquitectura MVC en Node JS La primera es nuestra carpeta principal de proyectos. Después de eso, agregamos el archivo JS de punto índice, que es nuestro archivo principal. Además, agregamos otros archivos o carpetas como paquete punto sn archivo o punto archivo ENV o carpeta middleware, te quedas aquí en la carpeta te quedas aquí en la Después de eso, agregamos carpeta de modelos en todos los modelos que almacenamos. A continuación, carpeta para todos los archivos relacionados con la interfaz de usuario, y luego carpeta Controllers para toda la parte lógica, y en Node JS, tenemos carpeta rutas. Entonces agregaremos todas las rutas en esta carpeta. Ahora bien, esta estructura de carpetas es buena para proyectos pequeños o medianos, pero las grandes empresas como Paypal y Netflix usan una estructura de carpetas poco diferente. Definitivamente depende de usted y su empresa la estructura de carpetas que seleccione. Te mostraré ambas opciones. Esta otra opción es un poco diferente y es buena para aplicaciones Big Bend. Aquí estamos carpeta principal del proyecto. En eso teníamos index dot archivo JS, que es el principal punto de entrada de nuestra aplicación. Además, nosotros en archivos ENV, paquete dot JCNFLE Docker archivos, y UploadedFles, y carpetas Después de eso, aquí agregamos otra carpeta llamada source o SRC aquí podemos almacenar nuestra carpeta middleware, convey folder, y carpeta Utils , Además, en la carpeta SRC, almacenamos la carpeta de módulos para cada módulo, y en esta carpeta, podemos agregar carpetas para cada característica como carpeta de usuario, carpeta correos, etcétera En esta cada carpeta, podemos definir tres archivos, user dot model dot gs user dot routes dot js, y user dot controller dot js. Así podemos agregar un archivo más usuario punto servicio dot js. Este archivo no es obligatorio, pero a algunas empresas les gusta usarlo. En este archivo de servicio, podemos almacenar consultas de base de datos. No es obligatorio agregar este usuario dot service dot js file, pero a algunas empresas les gusta agregarlo. Entonces así, podemos agregar cuatro archivos para la carpeta post también. Cuando queremos agregar una nueva característica como producto, creamos la carpeta producto aquí en la carpeta de módulos, y luego podemos agregar cuatro archivos en la carpeta del producto. Como podemos ver, esto es mucho complejo, pero es realmente bueno para aplicaciones grandes y complejas. Puedes usar lo que quieras. Depende totalmente de ti. La estructura de la carpeta puede ser un poco diferente para una empresa a otra. No te preocupes por eso. Ahora en la siguiente lección, aplicaremos la arquitectura MVC en nuestra aplicación, y luego implementaremos esos cambios 212. Aplica arquitectura MVC [EXTRA]: Ahora, apliquemos la arquitectura MVC en nuestro proyecto Linky Fi Entonces actualmente en nuestra aplicación, tenemos estructura muy organizada, como ya tenemos carpeta de modelos y carpeta Rutas. Aquí, no necesitamos ver carpeta porque no hay código de motor de plantilla. Así que tenemos que hacer un poco para manejarlo. Entonces hagámoslo. En primer lugar, aquí creamos la carpeta llamada SRC. N S como esta carpeta de configuración, mantenga presionada la tecla Control o Comando, selecciónela hasta las carpetas Stu Asegúrate de no mover esta carpeta de módulos Node. Bueno. Ahora veamos qué tenemos que cambiar en el archivo JS índice. En su mayoría, tenemos que cambiar las partes del archivo de entrada. Mira, aquí tenemos estos caminos startu. Tenemos que actualizarlo. Aquí creamos múltiples cursor manteniendo pulsado alter u opción. Y agrega aquí SRC, para asegurarnos de que estamos obteniendo este archivo o no, déjame verificar quitando este nombre de archivo Mira aquí estamos recibiendo sugerencias de archivos, lo que significa que es correcto. Ahora no necesitamos cambiar nada en el índice a archivo JS. Ahora en la carpeta SRC, ya tenemos modelos y carpeta Rutas Pero como sabemos, aplicamos aquí. Estructura de aplicaciones de nodos complejos. Entonces aquí, creamos una nueva carpeta llamada modules. En esta carpeta de módulos, tenemos que crear principalmente cuatro carpetas porque aquí tenemos cuatro modelos. Vamos a crear la primera carpeta llamada Jet, luego otra carpeta llamada mensaje. Después otra carpeta para post y última carpeta para usuario. Ahora recuerda en cada carpeta, tenemos que crear tres archivos. Entonces hagámoslo. Primero, movemos el archivo JS del usuario de la carpeta models y lo hicimos en la carpeta user. Aquí renombramos su nombre de archivo a user dot model dot js. Aquí, puede pedir entradas de actualización. Asegúrate de hacer clic en, sí. Y si no estás recibiendo ese menú, entonces tienes que hacerlo manualmente. Ahora vamos a mover a los usuarios dot js Route file de la carpeta routes y d it en la carpeta user Module. Ahora está pidiendo actualización. Dile aquí a Actualizar usuario punto js Ruta nombre de archivo. Ahora cambiemos el nombre de este archivo a user dot routes dot js. Ver, ahora no está pidiendo actualización. No te preocupes, lo actualizaremos manualmente. Ahora en la carpeta del módulo de usuario, creamos un archivo más llamado user dot controller dot js. Ahora podrías preguntar qué agregaremos en el controlador. Controller es donde almacenamos la lógica de nuestra aplicación. Es una colección de funciones de devolución de llamada de nuestras API. Déjame mostrarte eso. Aquí en la ruta del usuario, tenemos primero la API de registro, y esta es su función de devolución Este es el controlador para esta ruta. Cortar esta función de devolución de llamada de aquí y en el archivo del controlador, tenemos que exportar esta función Así que Cast register user es igual y pasado esta función de devolución de llamada aquí Ahora para exportar esta función, agregamos exportaciones de módulo es igual a objeto porque a partir de aquí, queremos exportar múltiples funciones. Entonces aquí podemos agregar usuario registrado para registrar usuario, o podemos eliminar este. Guarda este archivo, y ahora tenemos que añadir esta función en la ruta del usuario. Así que en la parte superior, añadimos costo controlador de usuario es igual a requerir aquí importamos desde punto hacia adelante slash usuario dot Controller Ahora en el lugar de API CallwayFunction, simplemente agregamos controlador de usuario, punto registrar Asegúrate de no llamar a esta función aquí, tenemos que agregar referencia de función. Ahora hagamos lo mismo para otras APIs también. Así que corta este controlador API de inicio de sesión. En nuestro archivo, definimos una nueva función, costo usuario de inicio de sesión es igual a pegar callback aquí A continuación, tenemos esta función de devolución de llamada API. Y en nuestro archivo controlador, creamos una nueva función. Costo, obtener usuario es igual pegarlo aquí. Igual que esto, tenemos que cortar cada función de devolución de llamada y separarla en el archivo del controlador Sé que esto es un poco preocupante, así que pon algo de música y podemos completar esto juntos. Cortar la función de devolución de llamada, y en el archivo, Costo, solicitud, restablecer contraseña es igual a pegarla aquí Corta la siguiente función de devolución de llamada, y en el archivo, Cast reset password es igual a pegarla aquí Cortar la siguiente función de devolución de llamada para seguir al usuario, y en el archivo, Cast, follow user es igual a pegarlo aquí Ahora corta la siguiente función de devolución de llamada, para rechazar, solicitar. En el expediente, Emitir, rechazar, seguir, solicitar, es igual a pegarlo aquí. Ahora tengo la siguiente colbkFunction para aceptar solicitud, y en el archivo, costo excepto, follow request es igual a pasado aquí Cortar la siguiente función de devolución de llamada, para la lista de seguidores, y en el archivo, const, obtener otro usuario, seguir, lista, es igual a pegarlo aquí No te preocupes, sólo nos quedan unos pocos. Cortar la función de devolución de llamada siguiente, para la siguiente lista. Y en el archivo, const, consigue otro usuario, siguiente lista es igual a pegarlo aquí Corte la siguiente función de devolución de llamada. Y en el archivo, agregamos costo y seguimos usuario es igual a pegarlo aquí. Además, de vuelta al archivo de ruta, necesitamos esta función general de Cs para registro e inicio de sesión API. Así que también cortamos toda esta función y la pegamos toda esta función y en el archivo del controlador. Aquí es posible que haya actualizado función de generar tokens para el exceso de token y se refiere tanto al token. Aquí tengo mi código antiguo porque esas son actualizaciones después de publicar el curso, pero no te preocupes, es el mismo proceso, corta toda esa función y dt en el archivo del controlador. Además, si tiene ruta de actualización y ruta de cierre de sesión, haga lo mismo con esas API también Aquí, solo necesitamos exportar estas funciones y luego agregarlas en el archivo Routes. Entonces, después de registrar usuario, agregamos usuario de inicio de sesión, obtenemos solicitud de usuario, restablecimiento de contraseña, restablecimiento de contraseña, seguimiento de usuario , rechazo, solicitud de seguimiento, aceptar, seguir , solicitar, obtener otro usuario, seguir la lista, obtener otro usuario, siguiente lista y último usuario dejar de seguir Guarde este archivo, y en nuestro archivo de ruta, agregamosEUuser controller dot login user No estoy desestructurando las funciones aquí porque si algunos desarrolladores nuevos ven nuestro código, entonces él o ella pueden confundirse Ahora, controlador de usuario punto dios usuario, controlador de usuario, punto de solicitud de restablecimiento de contraseña, controlador de usuario dot reset contraseña, controlador de usuario punto Seguidor controlador de usuario, punto rechazar, seguir, solicitar, controlador de usuario, punto aceptar, seguir solicitud Controlador de usuario, punto obtener usuario, lista de seguimiento. A continuación, controlador de usuario, punto obtener otro usuario, siguiente lista, y último, controlador de usuario, punto dejar de seguir usuario Ahora tenemos que importar cosas necesarias para estos controladores. En la parte superior, podemos ver todas las importaciones no utilizadas que califican. Así podemos recogerlos juntos moviendo la salsa hacia abajo y simplemente cortar esas importaciones y pegarlas en la parte superior del archivo del controlador. Bueno. Ahora aquí, tenemos que actualizar la ruta del modelo de usuario, por lo que la cambiamos a period slash user dot model porque está en la carpeta actual Además, podemos asegurarnos de que estos caminos estén bien. Sí, estos están bien. Guarde este archivo. Y si revisamos nuestro archivo de ruta, vea esto se ve muy limpio. De esta manera, podemos ver muy claramente endpoints API con métodos API Ahora tenemos que hacer lo mismo para los jets y publicar también. Hagámoslo rápidamente. Primero, movemos jet model en la carpeta jet Module y renombramos el nombre del archivo a chat dot model dot js. Movamos la ruta de chat en la carpeta de módulos de chat, actualicemos la entrada. Ahora renombra el nombre de archivo chat punto Rus punto js. Ahora tenemos que crear nuevo archivo para chat dot controller dot js. Volver al archivo Rutas. Primero, cortamos esta primera devolución de llamada API y en el archivo del controlador, creamos una nueva función Costo obtener chats, es igual a pegarlo aquí. Después de eso, cortamos la siguiente función de devolución de llamada, y en el archivo, Cast get chat messages es igual a pegarlo aquí A continuación, cortar la siguiente función de devolución de llamada, y en el archivo, costo, crear chat es igual a pegarlo aquí A continuación aquí, no necesitamos la API de enviar mensaje porque eso tenemos manejado con Socket. Podemos eliminar esta buena ahora tenemos la siguiente función de devolución de llamada y en el archivo, cost create group es igual a pegarlo aquí Ahora tenemos que exportar estas funciones desde aquí. Al final, las exportaciones del módulo son iguales a Object, Gchat a GChatso podemos eliminar los mensajes getchat, crear chat, crear grupo Guarda esto y en el archivo de ruta aquí, ingresamos costo, controlador de chat es igual a requerir aquí, parlas chat dot controller Ahora en nuestras APIs, agregaremos esas funciones. Entonces controlador de chat, jets de punto GAD, controlador de chat, punto obtener mensajes, controlador de chat, punto crear chat, y último controlador de chat punto Crear grupo Ahora cortamos estas importaciones de modelos de aquí, guardamos este archivo, y en nuestro archivo controlador en la parte superior, pegamos. Bueno. Ahora aquí, tenemos que actualizar también la ruta de estos dos modelos. Entonces cambiamos la ruta del modelo de chat al modelo de punto de chat de reenvío de período, y para el mensaje A, agregaremos el modelo de mensaje en la carpeta Módulo de mensajes Entonces vamos una carpeta arriba mensaje slash message dot model. Guarde este archivo y tenemos que mover el modelo de mensaje en la carpeta del módulo de mensajes. Ahora cambia el nombre del archivo a message dot model dot js. Ahora solo tenemos que hacer este proceso para nuestro último módulo de post. Primero, movemos post Model en la carpeta post Module y renombramos el nombre del archivo a post model dot js. Ahora vamos a mover post ruta en post carpeta Módulo, actualizar la entrada, renombrar el nombre del archivo, publicar rutas punto punto js Bueno. Ahora tenemos que crear nuevo archivo para controladores post dot dot js. Volver al archivo Rutas. Primero, cortamos la primera devolución de llamada API y en el archivo del controlador, creamos una nueva función Cast create post es igual a pegarlo aquí. Después de eso, cortamos junto a la función de devolución de llamada y en el archivo Cast, obtener mi post es igual a pegarlo aquí A continuación, corte la siguiente función de devolución de llamada. Y en el archivo, Cs get siguiente post es igual a publicado aquí. A continuación, cortamos otra función de devolución de llamada API. Y en el archivo, const, delete post es igual a, y pegarlo aquí No peludo solo duran pocas funciones para ir. Corta la siguiente función de Colbeg para darle me gusta y no me gusta la publicación Y en el archivo, const, como, a diferencia de post es igual a, pegarlo aquí Cortar la siguiente función de Colbeg. Y en el archivo, agregamos costo, agregar comentario es igual pegarlo aquí. Corte la siguiente función de devolución de llamada. Y nuevamente, en el archivo, agregamos costo, agregamos comentario, respuesta es igual pegarlo aquí. Y ahora para la última función de devolución de llamada de la API, cortamos y en el archivo del controlador, agregamos costo, eliminar comentario, es igual a pegarlo aquí Ahora tenemos que exportar estas funciones. Módulo dot export es igual a in object, create post to create post, get my post. A siguiente post, delete post, like post, add comment, add comment reply, and delete command. Guarda esto y en el archivo post routes en la parte superior, agregamos costo post controller es igual a requerir periodo forward slash post dot controller Ahora en nuestra API, podemos agregar esos controladores, copy post Controller y write, postcontroller, dot create post, postcontroller , dot GET MyPost, post Controller, dot GET following Post, post Controller, post Controller, dot delete Post Post controller, dot, a diferencia de post, post controller, dot add command, post controller, dot add comment reply, y post controller dot delayed comment. Bueno. Ahora cortemos las importaciones no utilizadas del archivo Routes. Guarda este archivo y en el archivo del controlador en la parte superior, lo pegamos aquí. Ahora aquí, tenemos que actualizar estas dos rutas, period, forward slash post dot model, y para ruta de usuario, vamos una carpeta hacia arriba, carpeta de usuario, modelo de punto shuser Guarda esto como podemos ver, nuestros archivos se ven más organizados. Entonces aquí nuestras carpetas de modelos y rutas están vacías ahora, así que simplemente podemos eliminarlas, y creo que tenemos que actualizar path en un lugar más, que es rutas punto Jsle en la carpeta de inicio Ver aquí ruta no se actualizó automáticamente. Así que aquí simplemente cambiamos la ruta a módulos, user, slash user dot Routes Módulos post post punto rutas y módulos JET Jett rutas, y hecho Genial. Ahora, vamos a empujar rápidamente este código a Github. Y por eso, nuestro código se puede implementar automáticamente. Así que abre la aplicación de escritorio Github. Y aquí obtenemos todos los cambios. Escribe el mensaje de compromiso. Y cometerlo. Y al fin, simplemente ponemos este código en Github, y eso es todo. Esto se implementará automáticamente. Entonces así es como en el mundo profesional, las grandes empresas gestionan su código no JS. Además, puede haber un enfoque un poco diferente dependiendo de las empresas o el equipo con el que trabajes, pero esta es la estructura de carpetas más común que los desarrolladores profesionales utilizan hoy en día.