Graphql con Apollo y Express: un enfoque práctico | Aymen El Kani | Skillshare
Buscar

Velocidad de reproducción


1.0x


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

Graphql con Apollo y Express: un enfoque práctico

teacher avatar Aymen El Kani, software engineer

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.

      Anuncio de Apollo Graphql

      1:12

    • 2.

      Introducción a Graphql

      2:58

    • 3.

      trabajar con consultas de Graphql

      7:06

    • 4.

      Agrega mutaciones

      6:30

    • 5.

      Instalación y configuración de Typescript

      4:42

    • 6.

      Typescript básico

      14:22

    • 7.

      Tipografía avanzada

      15:28

    • 8.

      Creación de un esquema de graphql

      11:03

    • 9.

      Crear un solucionador de autora

      4:53

    • 10.

      generar archivos de tipo a partir de esquema

      8:22

    • 11.

      Configurar nuestro servidor Apollo-express

      6:53

    • 12.

      Ejecuta y prueba nuestro Api

      10:48

    • 13.

      instalar y configurar typeorm

      4:14

    • 14.

      Crear entidad de usuario

      7:02

    • 15.

      Método de Create-user | user.service

      7:54

    • 16.

      añadir fuente de datos de aplicación

      5:10

    • 17.

      Crear un resolver, signup

      9:19

    • 18.

      Creación de un resolver, signin

      12:13

    • 19.

      trabajar con el contexto de graphql

      13:17

    • 20.

      ¿qué es Docker

      1:36

    • 21.

      Instalar docker Linux

      2:17

    • 22.

      Imágenes a contenedores

      5:58

    • 23.

      contenedores a imágenes

      5:05

    • 24.

      ejecuta la base de datos de postgres con docker

      8:08

    • 25.

      Prueba Graphql endpoint

      10:31

    • 26.

      desde postgres a imagen

      4:29

    • 27.

      Definición de la sala de esquema

      5:56

    • 28.

      Auto generar y fusionar esquemas

      13:00

    • 29.

      crear el resolver, sala

      4:41

    • 30.

      resolver fusionar

      5:09

    • 31.

      creación de la entidad de sala

      7:33

    • 32.

      creación y actualización de habitaciones

      9:24

    • 33.

      CreateRoom resolver 1/2

      8:22

    • 34.

      CreateRoom resolver 2/2

      4:33

    • 35.

      Creación de getRooms resolver

      3:55

    • 36.

      Señala graphql de prueba

      7:33

    • 37.

      Implementación de validación con validador de clase

      2:27

    • 38.

      Catch errores de validación

      6:50

    • 39.

      por qué deberíamos usar ScoketIo

      1:14

    • 40.

      Únete a habitaciones con socketIo

      7:39

    • 41.

      Emite mensajes a una habitación específica

      2:41

    • 42.

      Prueba de servidor de socket Io

      4:15

    • 43.

      Migración de bases de datos con typeorm

      11:15

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

11

Estudiantes

--

Proyectos

Acerca de esta clase

¡Bienvenido al curso GraphQL con Apollo y Express en Skillshare! En esta clase, aprenderás cómo usar Apollo GraphQL con Express y TypeScript para crear aplicaciones web potentes y escalables.

GraphQL es un lenguaje de consulta popular para las API que te permite solicitar solo los datos que necesitas, lo que hace que sea una excelente opción para crear aplicaciones web modernas. Apollo es una implementación de GraphQL que proporciona herramientas para ayudarte a crear API y aplicaciones de clientes de GraphQL. Express es un marco de aplicación web rápido y flexible para Node.js, que es ampliamente utilizado en la creación de API y servicios web. TypeScript es un superconjunto tipado de JavaScript que te ayuda a escribir código más seguro y confiable.

A lo largo de este curso, aprenderás cómo configurar un servidor Express con TypeScript e integrarlo con Apollo GraphQL. También aprenderás cómo definir esquema de GraphQL, resolvers, y fuentes de datos, y cómo usar herramientas de Apollo para extraer y almacenar datos en caché de una API de GraphQL.

Algunos de los temas tratados en este curso son:

  • Comunicación en tiempo real con SocketIO: aprenderás cómo usar SocketIO para implementar comunicación en tiempo real entre el servidor y el cliente.
  • Integración de bases de datos con Postgres: aprenderás cómo integrar una base de datos de PostgreSQL con tu backend usando TypeORM, una biblioteca popular de mapeo relacional con objetos (ORM) y cómo realizar migraciones de bases de datos.
  • Containerization with Docker: aprenderás cómo usar Docker para containerize tu aplicación y simplificar la implementación.
  • Autenticación con JWT: aprenderás cómo implementar autenticación usando tokens web JSON (JWT) y cómo proteger tus endpoints de API de GraphQL.
  • TypeScript: aprenderás cómo usar TypeScript para escribir código seguro de tipo y mejorar la fiabilidad y mantenimiento de tu API de GraphQL.

Al final de este curso, tendrás una comprensión sólida de cómo usar Apollo GraphQL con Express y TypeScript para crear API potentes y flexibles para tus aplicaciones web. También tendrás experiencia práctica con temas avanzados como comunicación en tiempo real, integración de bases de datos, contenerización y autenticación.

Podrás compartir tu proyecto con otros estudiantes en Skillshare al subirlo a la galería de proyectos, donde podrás mostrar tus habilidades y obtener comentarios de otros alumnos.

Ya sea que seas un principiante o un desarrollador experimentado, este curso te proporcionará las habilidades y conocimientos que necesitas para llevar tu desarrollo de GraphQL al siguiente nivel. Así que, ¡únete a nosotros y comienza a crear aplicaciones avanzadas de GraphQL hoy mismo!

Conoce a tu profesor(a)

Teacher Profile Image

Aymen El Kani

software engineer

Profesor(a)
Level: All Levels

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. Anuncio de Apollo Graphql: ¿Estás cansado de las API de descanso tradicionales y quieres aprender lo último y lo mejor y el desarrollo de RPA no busques más allá de nuestro curso GraphQL En este curso, aprenderás todo lo que necesitas saber para comenzar con las chicas Graff, empezando por los conceptos básicos de construir una Graciela BI con Express. Pero ahí no paramos. Profundizaremos en el uso un servidor de borde con TypeScript y Express, trabajando con tipo RM y usando base de datos Postgres con docker. Nuestro curso no pretende ser un gráfico completo de costos de atención, sino que te enseñará todos los elementos esenciales. Aprenderás sobre chicas Graff, tipos de halo, consultas, mutaciones, esquemas, y cómo fusionar esquemas y resolutores con una chica de fotografía también aprenderá TypeScript y tapa socket IO y una migración de base de datos con pañal. Y al final del curso, podrás construir con confianza tu propia API GraphQL y trabajar con algunas de las herramientas más recientes y poderosas de la industria. Entonces, ¿a qué esperas entonces rema ahora por nuestro campo de golf Gail y lleva tus habilidades de desarrollo de API al siguiente nivel 2. Introducción a Graphql: Hola y bienvenidos a esta primera lección sobre engranaje gráfico. En esta lección estaremos presentando al Dr. Gale, discutiendo consultas y mutaciones y explicando qué es un esquema. Entonces, ¿qué es GraphQL? Graphql es un lenguaje de consulta y runtime para APIs desarrollado por Facebook. Permite a los clientes preguntar exactamente lo que necesitan y nada más. Conviértelo en una alternativa poderosa a las API de descanso tradicionales. Una de las características clave de Graph Gil es su Lenguaje de Consulta. El lenguaje de consulta permite a los clientes especificar exactamente qué datos necesitan, incluidas las estructuras de datos anidadas y recuperarlos todos en una sola solicitud. Esto hace que sea muy eficiente para los clientes recuperar datos del servidor. Ya que no necesitan hacer múltiples solicitudes para obtener todos los datos que necesitan. Hablemos un poco más de consultas. En golf. Gayo, una consulta solicita datos. Se especifica el campo que el cliente quiere recuperar, así como los argumentos que se requieran. Aquí hay un ejemplo de una consulta simple en GraphQL. En esta consulta, estamos pidiendo los campos de nombre y correo electrónico para el usuario con un ID de 123, la respuesta del servidor puede verse algo así. Ahora pasemos a las mutaciones. Las mutaciones en GraphQL se utilizan para modificar datos en el servidor. Permiten a los clientes enviar datos al servidor para crear, actualizar o eliminar recursos. Aquí hay un ejemplo de una mutación simple en GraphQL. En esta mutación estamos creando un nuevo usuario con el nombre Jane Doe y enviemos un correo electrónico a Jane Doe a example.com. La respuesta del servidor puede verse algo así. Por último, hablemos de esquemas en GraphQL. El esquema es un contrato entre el cliente y el servidor. Define los tipos de datos que se pueden consultar y mutar, así como las relaciones entre esos tipos. El esquema generalmente se define usando el lenguaje de definición de esquema GraphQL, o SDL para abreviar. Aquí hay un ejemplo de un esquema simple en el lenguaje de definición de esquemas GraphQL. En este esquema, tenemos un tipo de consulta con un campo de usuario que toma un argumento y devuelve un objeto de usuario. Tampoco tenemos el tipo de mutación con el campo create user que toma un objeto create user input y devuelve un objeto user. Binario. Tenemos un tipo de usuario con ID , nombre y campos de correo electrónico. Eso es todo para esta introducción a la gráfica Gail, hemos cubierto lo que es García, nuestra consulta es y las mutaciones funcionan en lo que es el esquema. En la siguiente lección, vamos a sumergirnos en la construcción de APIs de GraphQL. 3. trabajar con consultas de Graphql: Hola y bienvenidos de nuevo a nuestro curso GraphQL. En nuestro video anterior, cubrimos los conceptos básicos de GraphQL, incluyendo consultas, mutaciones y esquemas. En este video, estaremos construyendo una gráfica sencilla gala que expresará PI. Específicamente, usaremos Express para manejar nuestras solicitudes y respuestas de GraphQL. Y estaremos aprovechando el poder de Graff girl para recuperar datos de una fuente de datos. Al final de este video, tendrás una sólida comprensión de cómo crear la API GraphQL con Express. Y podrás aplicar estos conceptos a tus propios proyectos. Entonces, sin más preámbulos, profundicemos y comencemos a construir nuestra gráfica. Gala PI con Express. He preparado el proyecto para que lo sigas dentro de este video, lo puedes descargar desde la sección de recursos. He incluido un archivo index.js en el proyecto. Este archivo contiene el código necesario para comenzar a escuchar conexiones con Express. Además de eso, encontrarás un archivo package.json con tres dependencias. Express, Express, Dutch, Graff, girl, y graph. Aquí. Estas son las principales herramientas que usaremos para construir nuestra API GraphQL que expresaría. Adicionalmente, también se instala y configura el dinero de nodo en el proyecto. Esta herramienta reinicia automáticamente nuestro servidor cuando se realizan cambios en el código, lo que nos ahorrará mucho tiempo y hará que el proceso de desarrollo sea más fluido. Ahora, antes de comenzar a trabajar en el proyecto, es importante asegurarse de que estén instaladas todas las dependencias necesarias. Para instalar estas dependencias simplemente navegue al directorio del proyecto en su terminal y ejecute el comando npm install. Esto instalará todos los paquetes necesarios para nuestro proyecto. Una vez completada la instalación, podemos pasar a construir nuestra gráfica, obtener RPI con Express. Ahora en un proyecto de Gil de grafo, lo primero que hay que hacer es definir el esquema, que es la base de una gráfica. Obtener RPI definiendo sus tipos y campos. Necesitamos comenzar con él antes que nada para garantizar que nuestras API sean claras, autodocumentadas, flexibles y extensibles. Para construir el esquema, necesitamos importar la función con el nombre build schema del paquete GraphQL. Luego crea una constante de esquema y usa la función build schema abriendo dos paréntesis y pasándola en una cadena de plantilla. Aquí vamos a definir nuestra primera consulta agregando el tipo de palabra clave así, y agregaremos la consulta con nombre. Después abre dos llaves rizadas. Y dentro de aquí podemos definir nuestras consultas. Entonces voy a definir una consulta sencilla hola. Entonces necesitamos definir el tipo de retorno de esta consulta. Para ello, agregue dos puntos y, a continuación, especifique el tipo de retorno. Ahora nuestro caso, la consulta hello va a devolver una cadena, asegúrese de agregar una S mayúscula. Sus tipos se utilizan para definir la estructura de los datos, incluyendo tipos escalares como cadenas, enteros y booleanos, y tipos de objeto, que consiste en una colección de campos. Ahora para manejar las solicitudes que llegan a la consulta hello, necesitamos definir un solucionador raíz. La raíz resoluble se encarga obtener los datos solicitados en la consulta o mutación y devolverlos al cliente en la forma correcta definida por el esquema. Esencialmente, el solucionador raíz actúa como un puente entre la API y sus fuentes de datos, convirtiéndolo en un componente crítico de cualquier chica gráfica o PI. Ahora para definir este solucionador de rutas, vamos a crear una constante de ruta así y establecer su valor en un objeto. Y este objeto, necesitamos agregar todas nuestras consultas con el mismo nombre escritas en el esquema. Entonces aquí voy a agregar una propiedad hello de representar la consulta hello y establecer su valor en una función de flecha. Por cierto, toda consulta o mutación debe ser una función. Ahora mismo, aquí solo devolvamos un mensaje de Hello World. Ahora, necesitamos definir un Raphael y boyante en nuestra API. Podemos hacer eso usando Express. Entonces es similar a definir middlewares. Dijo la ruta de punto final para cortar a chica Graff. Y para el manejador de solicitudes, usaremos otra función llamada Dr. Gil HTTP. Podemos importarlo desde el paquete express, es decir GraphQL. Ahora dentro de aquí, vamos a usar la función GraphQL HTTP así. Un objeto como argumento. El sujeto sostendrá nuestro esquema. Puedes configurarlo así o simplemente el esquema de nombre y JavaScript, sabremos que nos estamos refiriendo al esquema constante. La segunda propiedad es la propiedad de valor raíz, que mantendrá nuestro solucionador raíz. Y la última propiedad es Graffiti Girl, que es un cliente gráfico e interactivo basado en la web de GraphQL que permite a los usuarios interactuar con un RPI de GraphQL ejecutando consultas y mutaciones y visualizando los resultados. Cuando se establece en true en la configuración de middleware express GraphQL, la opción gráfica habilita la interfaz gráfica para probar y explorar nuestra API GraphQL. Dicho esto, guardemos nuestro archivo y abramos la terminal y ejecutemos este documento. Entonces abramos el navegador y naveguemos hasta localhost 4,000, como Scarf Girl, donde encontrarás la interfaz gráfica. Aquí podemos escribir nuestras consultas e incluso consultar la documentación de nuestra gala de gobierno PR. Aquí encontrarás nuestra consulta y dentro de ella la consulta hola, que devuelve una cadena. Si haces clic en él, verás la definición del escalar de cadena. Ahora bien, para obtener la consulta hello de este servidor, tenemos que definir la consulta así. Y luego mencionó toda la consulta dentro de ella. Una vez hecho eso, da clic en el botón Reproducir para enviar la consulta al servidor. Si todo está configurado correctamente, deberías ver el resultado recibido de las consultas sobre el lado derecho de tu cliente. Gran trabajo. En la siguiente lección, continuaremos explorando esa escala aprendiendo sobre las mutaciones. 4. Agrega mutaciones: Ahora agreguemos una mutación a nuestra API. Entonces, la mutación GraphQL es una forma de modificar datos en el servidor usando la API GraphQL. Permite a los clientes enviar la solicitud al servidor para crear, actualizar o eliminar datos. Las mutaciones se definen en el esquema GraphQL y se pueden ejecutar enviando una consulta de graffiti en mutación al servidor. Entonces definamos la mutación yendo al esquema y agreguemos un nuevo tipo. Y me encontré con mutación con una M. mayúscula Y supongamos que queremos que el cliente agregue productos a nuestro lado servidor aquí. Eso se agrega el mango de mutación con el nombre add product. Este manejador aceptará un nombre como argumento de tipo string, nuevamente con mayúscula S y un precio de tipo int, que hace referencia a un entero. Entonces, en crecimiento Gil, el tipo int representa un entero numérico sinusoidal de 32 bytes. Se utiliza para definir campos que devuelven o aceptan valores enteros en el esquema de la gráfica G 0. Luego, el tipo se puede usar para imponer validación de tipo en consultas y mutaciones de GraphQL, asegurando que solo se proporcionen valores enteros válidos como argumentos. Podemos definir este tipo como sea necesario agregando un signo de exclamación delante de él. Podemos hacer lo mismo por el argumento del nombre. Bien, ahora necesitamos definir un tipo de retorno para esta mutación. Entonces, la mutación GraphQL necesita un tipo de retorno para especificar la forma de los datos que serán devueltos desde el servidor después de que se ejecute la mutación. Entonces para hacer eso, o los dos puntos aquí y agregar una matriz, porque queremos devolver una matriz de objetos de producto. Y para definir el tipo de este producto objeto, vamos a ir aquí y agregar otro tipo y nombrarlo producto como. Entonces. Este producto contendrá un nombre de tipo cadena con el signo de exclamación para que sea necesario. Y luego pulsa Enter para ir a la siguiente línea y asegurarte de no agregar una coma aquí porque no está permitido en los esquemas branquiales a la deriva. La segunda propiedad es el precio del tipo entero. También podemos hacer que el tipo de retorno requiera para que podamos evitar obtener un nulo como resultado. Podemos hacerlo agregando un signo de exclamación frente al producto y la propia matriz. También podemos cambiar la forma en que enumeramos nuestros argumentos de mutación y reemplazarlos con un argumento y nombrarlo input y establecer su tipo para agregar por entrada directa. Este es un tipo personalizado, no un tipo incorporado de GraphQL. Por lo tanto, necesitamos definirlo nosotros mismos. Nos referimos a ella como tipo de entrada. Entonces en GraphQL, el tipo de entrada es tipo especial usado para argumentos en mutaciones y consultas, se usa para definir la forma de los datos que pueden ser aceptados como entrada por campo. El tipo de entrada puede contener tipos escalares como string into o booleano, así como otros tipos de entrada que permiten estructuras anidadas complejas. Los tipos de entrada son similares a los tipos regulares y al cuidado de gráficos, pero no se pueden usar como tipo de retorno de un campo para definir el tipo de entrada Agregar producto. Sigue aquí y usa la palabra clave input y agrega el mismo nombre. Y dentro de ella agregaremos los mismos argumentos, nombre de tipo cadena y precio de tipo int. Ahora guardemos este archivo y volvamos a la interfaz gráfica. Aquí podemos agregar nuestra consulta de mutación. Comience agregando mutación en la apertura dos llaves son las llaves y la mutación del producto add. A continuación, agregue un argumento de entrada dentro de un objeto, el nombre del producto que dice SPC. Entonces ten cuidado con la entrada de precio como ingresando números como una cadena, uno para trabajar ya que establecemos el tipo en integer, en cambio ingresamos los números directamente, así. El objeto de retorno, queremos obtener el nombre. Y el Bryce. Si pulsas el botón de reproducción, no funcionó. Y eso es porque no definimos el producto add resoluble en el objeto raíz. Eso es muy rápido. Agrega una coma aquí y crea el producto publicitario y resuelve o piernas. Entonces este resoluble aceptará un argumento de entrada. Pero no directamente así, porque el argumento de entrada existe dentro del argumento del objeto primario llamado args. Así podemos tener acceso al argumento de entrada así. Entonces este solucionador debería devolver una matriz de objetos. Entonces eso está codificado y agrega una matriz con un objeto con dos propiedades. Nombre, podemos obtener el nombre de la entrada así. Y precio desde el precio punto de entrada. Entonces vamos a guardar y probar de nuevo. Y ahí lo tenemos. Nuestra matriz con un objeto de producto contiene el nombre y el precio. Podemos decirle al servidor que solo devuelva objetos con la propiedad name quitando el campo price de aquí. Hit play. Y como puedes ver, obtuvimos una matriz de objeto que contiene solo la propiedad name. Genial, Ahora que tienes un conocimiento básico de GraphQL, demos el siguiente paso para subir de nivel tu experiencia aprendiendo a usar un gráfico de portal gail con Express y TypeScript. Apollo GraphQL es una poderosa herramienta que proporciona características como el almacenamiento en caché, manejo de errores y la costura de esquemas, lo que facilita la construcción escalable GraphQL API ice al escalable GraphQL API ice combinar una fotografía Gil donde expresan y TypeScript, tendrá la capacidad de construir API GraphQL altamente mantenibles y seguras para el tipo. Así que prepárate para sumergirte en el premio de una fotografía Gill, y llevemos tus habilidades gráficas de chicas al siguiente nivel. 5. Instalación y configuración de Typescript: Ahora antes de entrar en la sintaxis de TypeScript, primero necesitamos instalar el compilador de TypeScript para comenzar tenía una URL de descarga oval o TypeScript lang.org slash. Y aquí encontrarás una serie de formas de traer el compilador TypeScript a tu proyecto dependiendo qué herramientas puedas estar usando. En este curso. No obstante, voy a estar confiando en el entorno NPM, ya que eso es lo que espero que la mayoría de las aplicaciones JavaScript están usando en estos días. Ahora, independientemente de dónde o cómo instale TypeScript, si aún no tiene nodo, tendrá que instalarlo encabezando no js.org y luego seguir las instrucciones para instalar la última FTC. Ahora, si tienes npm instalado en tu sistema, volvamos a la página de descargas de TypeScript y copiemos esta línea aquí. Entonces lo vamos a ejecutar dijo nuestro proyecto y dentro de nuestra terminal. Así que asegúrate de crear un nuevo directorio aquí, abre el código VS y ejecuta npm install TypeScript. ¿Eso te ahorra esa rigidez si quieres instalar TypeScript dentro de tu proyecto y solo dentro de tu proyecto Pero significa que con el escritorio hace guardado como opción div aquí, solo podrás usar TypeScript dentro de este proyecto. Puedes hacer eso por, para mí, quiero usar TypeScript globalmente dentro por sistema. Entonces voy a agregar el flag dash g for global y luego ejecutar npm install. Y es posible que necesites usar sudo para ejecutar este comando como administrador. Y si estás usando Windows, tienes que abrir una nueva consola de administración. Ahora, ya tengo TypeScript y almacenado globalmente dentro de mi sistema. Entonces no voy a ejecutar este comando. Y para asegurarte de que has instalado TypeScript correctamente dentro de tu sistema, puedes ejecutar TSE, eso es V, y obtendrás la versión de TypeScript. Actualmente estoy en la versión 443. Y no importa si tienes una versión más alta de TypeScript que la mía. Porque todos los centros de TypeScript que vamos a utilizar en este curso van a ser aplicables con cualquier versión superior de TypeScript. Ahora, para usar la sintaxis de TypeScript y el proyecto de dudas, necesitamos agregar algunas configuraciones de TypeScript. Podemos hacerlo automáticamente usando la línea de comandos TSC, luego muere en ella. Y como puedes ver aquí, tenemos un nuevo archivo dentro nuestro proyecto y llamado ts config dot json. Así que vamos a abrirla. Y como puedes ver, TypeScript ofrece muchas opciones aquí. Muchos de ellos están comentados porque no los vamos a usar. Ahora la primera opción no comprometida aquí es el target, que representa la versión de script sigma. En este curso, vamos a usar mi guión seis. Y si te desplazas un poco hacia abajo, encontrarás el conjunto de propiedades del módulo para comentar. Sí. Esto significa que los módulos y los compilan archivos dot js. Usaremos la sintaxis de nivel común porque casi todos los navegadores tienen soporte para este módulo. Pero si quieres que tus archivos se compilen con la sintaxis moderna de JavaScript, puedes intentar usar años 2015, así, ES 2015. Pero como dije, vamos a utilizar venir a nosotros en este proyecto. Ahora bajo esto, tenemos la propiedad root que especifica la ubicación de los archivos que usa la sintaxis de TypeScript. Entonces terminemos comentado y mantengamos apuntando a la raíz de este proyecto. Ahora vamos a desplazarnos hacia abajo hasta la salida de su propiedad, que especifica la ubicación de los archivos compilados. Entonces vamos a incrementarlo. Y queremos que todos nuestros archivos son nuestros archivos compilados se ubiquen dentro de la carpeta dist. No necesitamos crear esta carpeta manualmente dentro nuestro proyecto porque TypeScript lo hará por nosotros. Bien, ahora esto es todo lo que necesitamos para empezar. Entonces, guardemos el archivo ts config y comencemos a usar la sintaxis de TypeScript en el siguiente video. 6. Typescript básico: Es hora de comenzar a aprender sobre la sintaxis de TypeScript. Y para eso, necesitamos un nuevo archivo dentro de nuestro proyecto. Así que adelante y crea un nuevo archivo y asígnele el nombre punto principal ts para TypeScript. Entonces aquí vamos a comenzar declarando una variable y nombrarla FirstName, y ponerla en John. Ahora acabamos de escribir JavaScript normal. Pero si flotaba sobre FirstName, encontraré que FirstName es de tipo string. Ahora, podemos encontrar lo mismo con JavaScript puro, pero intentemos establecer esta variable en cinco. Ahora, tenemos un error. Si pasa el cursor sobre ese error, encontrará que TypeScript se queja del tipo o el asignar un valor a esta variable. Dice type number no es asignable a type string porque cinco aquí es un número y John es una cadena. Entonces es como TypeScript está diciendo que si asignas esta variable desde el principio a una cadena, hay que mantenerla así. Es por eso que TypeScript es útil porque evita que pequeños errores como este aparezcan dentro de nuestro proyecto. Ahora, queremos que la variable firstname sea siempre de tipo string. Pero imaginemos que entra otro desarrollador y cambió el valor de la variable firstname a un número, digamos como diez. Ahora el IRS ha desaparecido de la segunda línea o de la tercera línea aquí. Pero hemos introducido otro dólar va aquí. La variable Firstname ya no es de tipo string, sino de tipo number. Ahora bien, podrías preguntarte ¿por qué TypeScript no nos alertó de que hemos cometido un error? Bueno, es obvio porque no le dijimos que hiciera eso. Entonces, para decirle a TypeScript que solo acepte cadenas para esta variable, tenemos que agregar dos puntos y luego una cadena. Ahora se puede ver que nos dieron dos errores. Bueno, es el mismo error, pero en dos lugares distintos. Tiene el mismo mensaje que antes. Número no es asignable para escribir cadena el mismo mensaje. La podemos encontrar aquí. Para arreglar esto, solo podemos quitar el diez de aquí y reemplazarlo con una cuerda. Juan. En realidad podemos eliminar esto porque es esa variable y asignar esta variable en la tercera línea así. Y aquí podemos ver que el IRS ha desaparecido. Pero mantengámoslo en una línea. Entonces voy a tomar esto de nuevo y voy a mover el FirstName de aquí y asignarle esto a John. Ahora, si quieres declarar un número en lugar de cadena, podemos crear otra variable, nombre y edad, establecer el tipo en número, y luego iniciar sesión en cualquier número, vamos a elegir 22. Y ahora sabes que si haces esto, obtendrás un error diciendo que el tipo string no es asignable al tipo number. Ahora no tenemos solo cadenas y números, también tenemos objetos. Entonces, declaremos otra variable lead. Denle un nombre LPG para el objeto y, a continuación, concéntrelo en un objeto con el nombre de la propiedad establecido en el gráfico. Ahora en la siguiente línea, intentemos reasignar la propiedad FirstName a un número y veamos qué va a pasar. Así objeto FirstName es igual a cinco. Ahora aquí puedes ver que tenemos un error de TypeScript diciendo que el número de tipo no es asignable al tipo string. Y eso es esperable porque declarar las propiedades del objeto es similar a declarar variables normales. Y lo mismo si tratamos asignar el objeto a la variable firstname, obtendremos el mismo error. Y esta vez, time type string no es asignable a type que el objeto que asignamos a la variable desde el principio. Ahora, eliminemos esto y asignemos el tipo de variable a un objeto. Ahora, se puede ver que no obtuvimos ningún error. Pero quiero dejar claro para los ojos que esta variable arbitraria es un objeto que contiene una propiedad firstName de tipo string. Podemos hacer eso quitando el objeto de aquí, reemplazarlo con dos llaves rizadas. Y dentro de aquí están la propiedad de primer nombre y la configuramos para escribir strain. Ahora digamos que quiero agregar una nueva propiedad a este tema, por ejemplo H. Obtendremos un error diciendo que tipo objeto con propiedad firstName, string, y age number. No es asignable al objeto que tiene sólo la propiedad FirstName de tipo string. Ahora bien esto va a ser muy útil si queremos que nuestros objetos solo contengan unas propiedades muy específicas. Y claro, si queremos agregar la propiedad age, que es un número, podemos venir aquí y luego agregar age of type number, y la flecha desaparecerá. Ahora, después de cadenas, números y objetos, veamos cómo podemos definir funciones con TypeScript. Así que vamos a declarar una nueva función y nombrarla. Crear usuario. Esta función aceptará dos argumentos. primero es el primer nombre, segundo es la edad. Ahora puedes ver aquí tenemos dos errores. Firstname o el parámetro FirstName tiene implícitamente un cualquier tipo. Ahora los argumentos de las funciones también son variables. Y JavaScripts establece el tipo de estos argumentos por defecto al tipo any. Pero TypeScript no lo permite, así que necesitamos agregar tipos para estos argumentos. Entonces para el firstName, addString, y para la edad es un número. Ahora vamos a devolver algo de esta función. Retorna firstName más la h. se puede ver que no obtuvimos ningún error porque incluso TypeScript sabemos que queremos convertir la edad una cadena y luego concatenarla con la variable FirstName. Ahora bien, si cambias el signo más por un signo menos, obtendrías un error. Porque TypeScript sabe que realizar una operación de resta entre una cadena y un número, no es lógico. Así que vamos a eliminar todo esto y reemplazarlo con una cadena literal. Y dentro de ella tendremos firstName, luego agregaremos la variable firstname, y luego age, la variable age. Cree otra variable y asígnele el nombre stl string. Y luego ejecutemos la función create user. Ahora puedes ver aquí que necesitamos dos argumentos. Entonces ese es el primer nombre de John y la edad a los 22. Ahora bien, si pasas el cursor sobre la variable STR, encontrarás de tipo string. Podemos especificar el tipo de retorno de una función como podemos hacerlo para una variable usando dos puntos aquí, y luego agregar tipo string. Ahora, digamos que quiero devolver un objeto de esto. Gracias por eso. Va a cambiar esto con objeto. Y vamos a obtener un error diciendo que type string no es asignable a type object, pero la Variable STR es de tipo object. Ahora, arreglemos este error moviendo esta cadena y reemplazándola con un objeto. El otro se ha ido. Pero digamos que quiero devolver este objeto con una propiedad de edad establecida al argumento de las ayudas. Si quiero usar el valor de retorno de la función de usuario actual, que es un objeto que se supone que contiene una propiedad age. Obtendremos un error diciendo que antigüedad de la propiedad no existe en el tipo objeto. Se puede arreglar eso quitando esto, agregar un objeto y la propiedad de la A con el número de tipo. Ahora bien, si pasas el cursor sobre h, verás que sí existe y tiene número de tipo. Vamos a agregar también el firstName dentro este objeto y establecerlo igual al argumento firstname. Aquí tenemos un error porque tenemos que agregar la propiedad FirstName al tipo de retorno de esta función. Así FirstName de tipo cadena. ¿Bien? Ahora digamos que si tenemos unas ayudas superiores a 20, vamos a rechazar esas ayudas y sólo devolveremos el nombre de pila. Entonces aquí, agreguemos una declaración if y verifiquemos que si la edad es igual o mayor que. 20. Si es así, vamos a devolver solo un objeto con la propiedad FirstName. Ahora, TypeScript no quiere dejarme devolver este objeto sin la propiedad age. Eso es porque le dijimos que esta función va a devolver un objeto con solo la propiedad age de type number y la propiedad firstName de type string. Podemos arreglar esto haciendo que la propiedad de edad no sea requerida agregando un signo de interrogación aquí. Ahora el error se ha ido. Y si pasa el cursor sobre las ayudas, propiedad encontrará que h es de tipo número o indefinido. Ahora, se puede hacer lo mismo por el argumento de edad insatisfacción, pero sólo si este argumento es el último en los argumentos siguientes. Ahora bien, si agregamos el signo de interrogación aquí, obtendremos un error diciendo que el objeto es posiblemente indefinido. Ahora, tal vez se pregunten por qué nos hemos molestado aquí, no el número. Bueno, eso es porque en JavaScript, todo es un, un objeto, incluso funciones. Pero puedes encontrar el tipo del argumento de edad como número o indefinido. Si cambiamos la ubicación de este argumento y lo ponemos desde el principio aquí, obtendrías otro error. Decir que un parámetro requerido no puede seguir a un parámetro opcional. Entonces si agregas un signo de interrogación aquí, la flecha desapareció de la lista de argumentos, pero obtendrás muchos errores en la función y fuera la función donde la ejecutamos. Ahora no queremos esto. Queremos cambiarlo todo tal como estaba. Entonces, permítanme quitar esto de aquí, ponerlo ahí, y quitar el signo de interrogación del argumento H. Ahora, digamos que queremos que esta función acepte las ayudas como un número o como una cadena. Podemos hacer eso agregando una barra vertical y agregando el tipo de cadena. Por supuesto que tenemos que hacer lo mismo para el tipo de retorno de esta función. Déjame cerrar esto para tener más espacio y agregar una barra aquí con este tipo de cadena. Ahora la edad aquí es de tipo, cadena, número o indefinida. Podemos hacer lo mismo para una variable, por ejemplo para el FirstName aquí, vamos a agregar ya sea una cadena o un número. O hagámoslo por la edad. Entonces aquí tenemos un número. Vamos a agregar una cadena. ¿Bien? Ahora podemos asignar la variable age ya sea a un número o a una cadena. Así. 7. Tipografía avanzada: Ahora, volviendo a la función de usuario actual, imagina si tenemos más propiedades dentro de este objeto con tipos más complejos. En ese caso, no va a ser conveniente tener un objeto grande frente a esta función. Y para arreglar esto, TypeScript ha introducido algo llamado interfaces. Una interfaz también es un objeto, pero sólo se puede utilizar como referencia a un tipo. Así es como podemos declarar una interfaz usando la palabra clave interface y luego el nombre de la interfaz. Y voy a elegir usuario. Y como dije, vamos a crear un objeto, pero sin ningún signo igual ni columna. Se puede pensar en ello como una clase. Ahora, tomemos todo esto, la edad y el FirstName. Córtalo de ahí, quita el objeto, quita los dos puntos y pégalos aquí dentro de esta interfaz. Ajustemos un poco el código. Se puede escuchar usar una coma, pero también puede usar un punto y coma o simplemente puede eliminar cualquier cosa de ahí. Pero quiero usar punto y coma porque se ve más organizado de esta manera. Ahora, podemos usar la interfaz de usuario como cualquier otro tipo. Aquí, los dos puntos y luego la interfaz de usuario. Y si pasas el cursor sobre las ayudas, encontrarás que la edad todavía tiene el tipo string, number y undefined. Tenga en cuenta que las interfaces solo se refieren a un tipo de objeto. Entonces, si te quitas las llaves rizadas de aquí y solo dejas las ayudas, encontrarás. Obtendrás un error diciendo que cadena o número no es de tipo asignable user porque el usuario tiene, primer lugar, tiene dos propiedades y user es un objeto. Y hacer los cambios. Y vamos a crear otra función y nombrarla login. Esta función va a aceptar un argumento y va a tener el nombre login ox. Va a ser de tipo login. Y por supuesto vamos a definir un login de interfaz. Entonces déjame copiar este nombre. Aquí está la interfaz y define la interfaz de inicio de sesión. Entonces, para que un usuario inicie sesión, necesitará un correo electrónico de tipo cadena y la contraseña de tipo cadena también. En realidad, quiero tener el control del tipo de contraseña mientras uso la interfaz de inicio de sesión dentro de la función de inicio de sesión. Para ello, podemos cambiar la cara central para que sea genérica añadiendo dos corchetes angulares como este. Y entonces se puede pensar en esta interfaz ahora como una función que aceptará un argumento como un tipo. Y podemos elegir el nombre del argumento. Voy a elegir PWD para contraseña, y voy a asignar ese tipo para la contraseña. Ahora, aquí, si pasa el cursor sobre el inicio de sesión, encontrará que el inicio de sesión de tipo genérico requiere un argumento de tipo. Como dije, las funciones tienen argumentos. Entonces para el tipo genérico es el mismo concepto. Ahora aquí podemos definir ese argumento agregando un corchetes en ángulo y el tipo de la contraseña dentro de él como una cadena. Ahora en satisfacción, verifiquemos muy rápido si el email de punto args de inicio de sesión es igual, por ejemplo él hizo y la contraseña de punto de args de inicio de sesión es igual a, por ejemplo, contraseña. Ese caso, vamos a devolver la verdad. Por lo que el usuario está autenticado. Ahora aquí, si no, vamos a devolver False. Va a establecer el tipo del valor de retorno de esta función a body. Y este es un nuevo tipo que podemos usar. Y no necesita una definición porque ellos booleanos es solo o un verdadero. Falso. Ahora, volviendo a la interfaz de inicio de sesión, podemos usar otra variable que solo se refiere a un tipo y contiene el tipo de contraseña para nosotros. Y como la contraseña no es un objeto, no podemos usar la palabra clave interface. Solo podemos usar el tipo alias y luego nombrar el tipo para que sea tipo de contraseña. Y luego podemos agregar estas cadenas a ese tipo. Así que aquí cadena. Entonces podemos usar el tipo de contraseña dentro de la interfaz de inicio de sesión. Si pasa el cursor sobre él, encontrará que el tipo de contraseña es una cadena. Puedes agregar aquí ya sea una cadena o un número. Y puedes agregar cualquier tipo que quieras. Pero las contraseñas sólo pueden ser cadenas o números. También podemos usar el alias de tipo para agregar un tipo a una variable o a un valor de retorno de una función. Así que aquí voy a agregar tipo login, resultado es igual al volumen y asegurarme de que es mayúscula. Y aquí para el cuerpo, y podemos usar una minúscula o una mayúscula. Es lo mismo. Cambiemos esto a los resultados de inicio de sesión. Ahora, imagina que tenemos una función asíncrona. Vamos a usar la palabra clave asíncrona para definir eso. En este caso, obtuvimos un error diciendo que el tipo de retorno de una función o método asíncrono debe ser la promesa global genérica con el tipo de argumento T. Y luego dice: ¿Quiso decir escribir este tipo genérico? Ahora bien, si conoces JavaScript, sabrás que una función asíncrona devolverá una promesa. Y así es como podemos definir un tipo de promesa con TypeScript. Entonces cambiemos el resultado de inicio de sesión para que sea una promesa porque esta función va a devolver una promesa. Y entonces el genérico o el argumento de este tipo genérico representa el tipo de retorno real de esta función, o en otra palabra, el valor resultante, o el tipo de resolución de ese valor. Entonces aquí vamos a resolver un booleano. Y se puede ver que el error se ha ido. Ahora, digamos que si autenticamos al usuario, enviaremos un objeto en lugar de true. Y este objeto contendrá una propiedad de nombre de usuario, dijo a John nuevamente, y otro estado de propiedad establecido en activo. Así que tenemos un usuario activo dentro de nuestra base de datos. Por supuesto que aquí no tenemos base de datos, pero imagínese que tenemos una. Ahora claro que vamos a obtener un error. Y para arreglarlo, agreguemos una interfaz aquí y pongamos un nombre, número, y citemos. Tendremos la propiedad username de type string y la propiedad status establecida en string también. Y aquí vamos a obtener una promesa que resolverá ya sea un booleano o un número. Así que he cometido un error aquí. Ahora mismo la Tierra ha desaparecido y podemos devolver ya sea una fuerza o un objeto. Ahora sobre la propiedad status, solo podemos devolver tres estados, el estado activo, el estado inactivo y el nuevo estado. Entonces aquí hay que devolver siempre una de estas cadenas. Pero si escribía activo así, en este caso, hice un error tipográfico. Pero TypeScript no dijo nada. Debido a que TypeScript no conoce estas cadenas solo se preocupa por el tipo de propiedad status que se dice toString. Y como pueden ver aquí, ya hice un error tipográfico. Entonces, ¿cómo podemos prevenir este tipo de errores o errores? Bueno, es muy sencillo. Tenemos que declarar un tipo enum. Así que aquí, Usa las ideas de NM y luego nombra este tipo de enum status de miembro. Y va a ser un objeto, pero no va a referirse a un objeto. Te diré cómo podemos usarlo en tan solo un segundo. Ahora aquí podemos definir estos tres tipos agregando activos e inactivos. Y luego el nuevo estatus. Ahora tenemos que reemplazar esta cadena aquí con la enum de estatus de miembros. Y para eso, tenemos que usar números estado enum también a 2s para seleccionar el estado activo. Que activo. Puedes ver aquí que VSCode tiene los tres tipos aquí como un éxito ya que esto es muy útil para acelerar el proceso de desarrollo. Ahora vamos a elegir activo. Y si pasas el cursor sobre él, encontrarás que el estatus de miembros que activo es igual a cero. Ahora, puede referirse al estado activo como una cadena agregando igual. Después activa. Lo mismo para los inactivos. Aquí, cadena, copia inactiva. Y para lo nuevo también sabía. Ahora, si pasa el cursor sobre active, lo encontrará activo igual activo como una cadena. Ahora dentro de la interfaz miembro, solo podemos aceptar una de estas propiedades. Entonces ahora no vamos a tener miedo de escribir mal uno de ellos. Ahora, vamos a guardar este archivo y vamos a abrir el terminal e intentar compilar. Podemos hacerlo fácilmente usando el comando TSC y simplemente golpear Enter. El comando TSC va a comprobar si tenemos algún error o algún tipo de error de script. Y luego si todo está bien, tendremos una carpeta dist que contiene el archivo main.js. Si lo abres, aquí encontrarás mucho código. Pero todos los tipos de antes, del archivo main.js ha desaparecido y solo tenemos JavaScript puro. Se puede ver cómo TypeScript compila el tipo enum. E hizo todo esto por nosotros. Calaveras, el punto principal, archivo dot js. Y ahora puedes decir que aprendiste prácticamente todo sobre TypeScript. Antes de terminar el video, déjame mostrarte muy rápidamente cómo puedes usar el método de inicio de sesión. Entonces aquí, toma el no-juego y pasa el objeto con el correo electrónico configurado a correo electrónico, contraseña, a contraseña. Y luego debido a que esta es una función asíncrona, vamos a usar entonces método para obtener el resultado. Y luego vamos a comprobar si el estado está activo o no. Y para ello, vamos a crear una sentencia if y comprobar primero si el resultado es una instancia de la clase Boolean. Y por cierto, el booleano con la B mayúscula es de vidrio. Y es un remolino para el tipo Booleano con la minúscula b. Así que este tipo aquí se refiere sólo a un verdadero o falso. Pero el booleano con B mayúscula se refiere a una clase que contiene el tipo Boolean. Entonces voy a hacer esto. Si es una instancia de Boolean, entonces regresa. De lo contrario tomar el resultado ese estado. Cheque. Si esto es, este estado es igual a iniciar sesión o un miembro. Estado activo. Si es así, vamos a devolver la verdad. O tal vez registro de consola. El usuario está activo. El usuario está activo. Ahora bien, si quieres usar body y con minúsculas, cambia esto y puedes verificar el tipo de booleano con tipo de palabra clave y luego resultado es igual para asegurar su volumen. Y si quieres hacer una comprobación como esta con el signo de exclamación, puedes quitar el tipo booleano de aquí y reemplazarlo por nulo. Y en vez de devolver falso, va a devolver nulo. Esto es mejor. Y se puede ver que null también es un tipo. Ahora encontrarás este archivo adjunto a este video con otros recursos de TypeScript. Así que asegúrate de descargarlos y aprender más sobre TypeScript por tu cuenta. 8. Creación de un esquema de graphql: Estoy dentro de VSCode y aquí tengo dos cincos, el archivo ts config y el banco tiene el archivo JSON. Ahora para el archivo ts config, tenemos algunas opciones nuevas aquí, como la biblioteca está establecida en yes, 2021. Y la resolución del módulo también se puso a notar con los tipos también establecidos a la nota. Ahora, para la opción de inicialización estricta de propiedades, asegúrate de que esté establecida en false o simplemente puedes eliminarla de tu archivo ts config. Ahora, cierra esto y por cierto, agregaré un archivo zip a este video para que lo puedas encontrar en los recursos y descargas. Ahora vamos a agregar algunos paquetes de MPM. Entonces aquí tengo el terminal del Código VS. Puede abrirlo haciendo clic aquí debajo de la terminal y dar clic en nueva terminal. Entonces aquí voy a instalar nuevos paquetes como el express con los tipos para express. Y vamos a trabajar con servidor Apollo con express. Entonces voy a instalar un polo Server Express. Y por supuesto necesitamos GraphQL y los tipos para GraphQL. Así que aquí en los tipos de engranaje gráfico de barra diagonal. Y por si acaso voy a instalar los tipos por nota. Ahora vamos a ejecutar este comando e instalar todos estos paquetes. Bien, entonces ahora déjame borrar esta terminal y dentro del directorio raíz, vamos a crear una nueva carpeta fuente. Y dentro de aquí tendremos un archivo main.js y un archivo txt de punto módulo. Y por ahora no vamos a tocar estos dos archivos porque tenemos que crear primero el esquema GraphQL. Y para eso, asegúrate de que estás de nuevo dentro del directorio raíz y crea nuevo archivo y nombra esquema. Ese Rafael. Bien, ahora aquí está el esquema GraphQL consiste en mutaciones y consultas. Usamos mutaciones cuando queremos cambiar los datos dentro de la base de datos. Y utilizamos consultas cuando queremos obtener datos de la base de datos. Puedes pensarlos como publicaciones en solicitudes si estuviéramos usando una API RESTful. Dicho esto, definamos nuestra primera mutación. Y para ello, tenemos que usar la palabra clave type y luego escribir mutación. Y dentro de aquí tendremos la mutación de registro. Así que bien, regístrate y regístrate. Se va a aceptar la entrada del usuario. Así que aquí vamos a escribir input como argumento para este método. Y tenemos que definir el tipo de esta entrada para que cuando usemos esta mutación con nuestra API, sepamos qué argumentos se requieren y cuáles no. Y definir tal tipo. Tenemos que usar la palabra clave input aquí, ¿verdad? Ingrese, y luego nombre este tipo de entrada Regístrese aquí, y asegúrese de que tiene una S mayúscula aquí para nosotros, por su tipo o es entrada nítida y no es requerida, pero es algo común que ver con GraphQL. Entonces aquí, el lado de entrada de registro aquí vamos a definir los argumentos de registro. Y por cierto, es posible que no tengas la sintaxis de GraphQL coloreada así. Porque si quieres eso, necesitas instalar una extensión para GraphQL. Así que dirígete a la sección de extensión aquí y busca la extensión GraphQL. Ya lo tengo instalado aquí. Así que asegúrate de instalar la misma extensión. Y entonces puede, es posible que tenga que crear un archivo de configuración después de instalar este paquete. Así que desplázate hacia abajo aquí y tienes que crear un archivo dot graphQL fc dot YAML y copiar estas dos líneas y pegarlas dentro de tu proyecto. Y puedes ver aquí que este archivo de configuración, nuestro inicio apuntando a los archivos GraphQL más antiguos dentro de nuestra carpeta fuente. En nuestro caso, todavía no necesitamos eso, pero en el futuro, vamos a tener múltiples archivos GraphQL. Por lo tanto, es posible que deba copiar también esta línea y pegarla dentro del archivo de configuración. Y también voy a hacer eso de mi lado. Sólo para asegurarnos que no vamos a olvidar esto en el futuro. Así que vuelve a nuestro proyecto y en el directorio raíz, crea un nuevo archivo y nombra punto GraphQL LRC que el GMO. Y aquí, pega ese código aquí y ciérralo. Y entonces tendrás los mismos estilos para GraphQL. Y no sólo estilos, sino también autocompletar. Sí. Por eso te recomiendo instalar esta extensión y usarla. Siempre que crees un esquema de matanza de grafos solo para evitar tipográficos y depuración innecesaria si cometiste algún error aquí. Sí. Así que solo para asegurarnos de que tengo el GraphQL dentro del directorio raíz aquí, continuemos con la entrada de registro. Entonces, para crear un nuevo usuario, necesitamos un correo electrónico de tipo string. Y asegúrate de tener una S mayúscula aquí. Y también asegúrate de no tener punto y comas ni viene aquí. Y ahora definimos también la contraseña de tipo string. Y también necesitamos un nombre de tipo string también, y el apellido del tipo string. Y ahora usemos este tipo aquí para la entrada de registro. Y como puedes ver aquí, es, es similar a la TypeScript a la hora de definir y usar tipos. Sí. Entonces tal vez no tengas dificultades para entender la sintaxis de GraphQL, ¿verdad? Entonces ahora definamos el tipo de retorno de la mutación de registro. Ahora, cada vez que firmemos, recuperaremos el usuario, el documento del usuario y el token JWT. Entonces definamos eso. Y esta vez tenemos que usar la palabra clave type, porque la palabra clave input solo se usa cuando queremos definir las entradas para mutaciones o consultas. Y el tipo se utiliza para definir mayormente los tipos de retorno de mutaciones y las consultas. Ahora aquí definir un tipo y nombrarlo respuesta tierra. Y aquí tendremos un usuario. Y entonces éste va a ser de tipo usuario. Y vamos a definir esto en tan sólo un segundo. Y aquí necesitamos también el token JWT de tipo string. Ahora, encima de todos estos van a definir el usuario ingresado. Tenemos que definir el ID también para el usuario, porque cuando comencemos a usar la base de datos, vamos a devolver el ID. Sí, así que tenemos que definir que de otra manera no lo haremos, no obtendrá el id del esquema GraphQL cuando solicitemos el documento de usuario. Entonces la identificación aquí. Y debido a que estamos usando el tipo rep, usaremos pañal alrededor. Con Postgres. El id va a ser de tipo número. Pero en GraphQL, no podemos usar, no tenemos un tipo de número como este, pero tenemos un tipo N. Sí. Y solo para asegurarnos de que vamos a obtener el ID cada vez que solicitemos por el usuario, agregaremos aquí un signo de exclamación. Y con este símbolo, podemos definir un campo requerido dentro de nuestro esquema. Ahora, el usuario también tiene todos estos aquí. Entonces déjame copiar esto y pegarlos aquí. Y eso es todo. Ahora usemos el tipo de usuario aquí o el tipo de respuesta del autor. Entonces aquí, fuera de balance, y luego guardar. Ahora tenemos que asegurarnos de que la entrada de registro también sea necesaria para evitar obtener entradas indefinidas. Y lo mismo para la respuesta terrestre. Sí, y ahora tenemos que definir nuestro esquema. Y para ello, voy a usar la palabra clave schema. Entonces cita esto. Vamos a definir la mutación. Y va a ser de tipo mutación. Entonces cuando creamos la consulta, las consultas, podemos venir aquí y crear consulta como esta y luego darle el tipo de consulta. Pero por ahora solo tenemos mutación y asegurarnos de que al menos tengas ya sea una mutación o consulta aquí o ambas. De lo contrario, usted es el gateway GraphQL no resolverá. Ahora, vamos a guardar esto y crear un solucionador que se encargue de estas lógicas de registro. 9. Crear un solucionador de autora: Ahora que tenemos nuestro esquema GraphQL definido, vamos a crear un solucionador. Y debido a que definimos una mutación de registro que está relacionada con la autenticación, vamos a crear una carpeta dentro de la carpeta fuente. Y dentro de él, vamos a tener un archivo resolvers. Y aquí vamos a definir el objeto que contendrá nuestra lógica de mutaciones y consultas. Así que crea una nueva constante y nombra como resolutores. Y va a ser un objeto con una propiedad de mutación. Y dentro de eso, vamos a definir el método de registro. Y claro que se inscriben método es un método asíncrono. Ahora es GraphQL resolvers va a tener un argumento padre y un objeto que contiene el valor de entrada y también un argumento o un argumento de contextos constantes. Vamos a explicar el argumento context cuando definamos el principal y el módulo. Pero por ahora, sabemos que vamos a obtener una entrada de nuestro solucionador de registro. Y todos los argumentos dentro de la entrada de registro se van a definir aquí. Para el argumento padre, vamos a tener el valor de retorno del solucionador padre. Y eso es sólo cuando tenemos un resolvers anidado. Pero en nuestro proyecto no vamos a usar eso. Pero puedo, puedo mostrarte un ejemplo. Así que imagina si quisiéramos encontrar una mutación de registro, pero no de esta manera. Crearemos otro tipo y le daremos un nombre, inscríbase. Y aquí vamos a tener como un con correo electrónico. Y este método devolverá el conjunto de usuario. Y también tendremos, como con Google, registrarse con Google. Y éste devolverá un token de tipo string. Entonces para usar esto, también podemos agregar la entrada al método width aquí y luego eliminar estas enfermedades parentales. Y aquí la mutación de registro es que vas a ser de tipo regístrate. Y con esto, hemos definido un resolvers anidado dentro de los resolvers de autor aquí, tenemos que definir la mutación de registro así. Y sólo volveremos como un objeto vacío. Y luego fuera del objeto de mutación, vamos a tener un tipo de registro. Así que crea una propiedad de registro aquí. Y dentro de él, vamos a definir el ancho del correo electrónico y con los métodos de Google. Sí, entonces aquí con correo electrónico y luego va a ser un método. Por supuesto que es asíncrono. Pero ahora podemos conseguir al padre de familia. Sí. Y en nuestro caso, este ejemplo, el padre va a ser un objeto vacío, pero así es como podemos obtener el resultado anidado de cómo construir resolvers anidados y usar el argumento padre. Pero como dije, no íbamos a usar esto porque se acabó de matar. En mi opinión. Sólo queremos un simple resolutores. Devolvamos todo como antes y eliminemos el tipo de registro. Bien. Ahora bien, dentro de los resolutores de la Tierra, se puede ver aquí que tenemos un tipo de errores de script diciendo que todos estos argumentos aquí no tienen tipos y eso no está permitido con TypeScript, como ustedes saben. En el siguiente video, vamos a aprender a generar automáticamente tipos de TypeScript a partir del archivo de punto de esquema GraphQL. 10. generar archivos de tipo a partir de esquema: Ahora, para generar automáticamente tipos de tipo struck a partir de nuestro esquema GraphQL, necesitamos instalar algunos paquetes nuevos. Así que dirígete a tu terminal y ejecuta npm install dash, mayúscula D para la dependencia de dev. Y luego Derecha el nombre del bucket, GraphQL, eso es cogent slash CLI. Y también necesitamos algunos otros plug-ins para este paquete. Entonces otra vez, co-gen. Y necesitamos el plug-in TypeScript. Y también de nuevo, GraphQL slash o un dash co-gen slash TypeScript resolvers. Y ejecuta este comando. Y ahora dentro de nuestro archivo package.json, vamos a crear otro comando aquí y nombrarlo generar. Y vamos a usar el coaching de GraphQL. Y luego vamos a especificar un archivo de configuración y nombrarlo cogen punto YAML. Por supuesto que aún no tenemos este archivo. Así que vamos a crear dentro del directorio raíz y guardar este archivo de configuración. Vamos a especificar la ruta del esquema. En nuestro caso está dentro del directorio raíz, luego Esquema punto GraphQL, y luego bajo genera. Vamos a guardar nuestros tipos generados dentro de la carpeta fuente. Y luego lado generado carpeta. Y luego dicen los resolvers tipos dot txt file. Y ahora tenemos que especificar los plugins. Entonces plugins, instalamos el plugin TypeScript, e instalamos también los resolvers de TypeScript. Y ahora tenemos que agregar algunas configuraciones relacionadas con TypeScript. Entonces usaría la firma de índice para true. Y esta opción aquí nos permite generar tipos dinámicos de TypeScript. Ahora agrega dos puntos aquí y guarda este archivo y vuelve al archivo package.json y guárdalo también. Entonces ejecutemos este comando desde el terminal npm, ejecutemos, generemos y esperemos por ello. Bien, hemos generado con éxito nuestros divs dentro de los tipos resolvers. Puedes ver que tenemos nuestro usuario, nuestra respuesta de autor aquí en nuestros tipos de entrada de registro de mutación. Sí, el usuario está aquí y todo está declarado. Por supuesto que hay muchas configuraciones y otros tipos relacionados con graph girl. Sí, entonces cerremos este archivo ahora y volvamos a los resolvers del autor e importemos los resolvers de los resolvers generados. Cerremos este archivo y volvamos aquí. Y así ellos los tres solucionadores y usan estos tipos enumerados que tenemos que importar desde el origen o desde la carpeta generada. Y a partir de resolvers tipos file, vamos a importar resolvers. Y tenemos que implementar ese tipo aquí. Y ahora podemos ver que todos los errores de TypeScript han desaparecido. Porque ahora TypeScript sabe que la propiedad de mutación tiene un método de registro. En el método de registro es un resolutores GraphQL y su borrador, su resolvedor tiene un padre tiene una entrada y un contexto. Y ahora si escribes entrada, entonces obtendrás sugerencias para el desde el tipo de entrada de registro. Ahora, sigamos construyendo el método de registro. Y sólo voy a regresar y datos ficticios aquí. Entonces necesitamos devolver una identificación. O en realidad tienes que devolver una propiedad de usuario. Y dentro de él, tendremos el ID de usuario y es de tipo número. Agreguemos ID1 y el correo electrónico. Entonces solo agreguemos un correo electrónico aleatorio aquí y devolvamos el nombre y el apellido. Esto es solo para probar porque deberíamos empezar a trabajar en los archivos principal y del módulo y probar nuestros resultados. Ahora mismo, agreguemos el apellido. Va a ser solo de usuario y seguro. Así que en realidad tenemos que usar la entrada aquí. Tenemos que devolver la entrada proveniente del usuario, del cliente. Así que voy a difundir todas las propiedades dentro del argumento de entrada. Y se puede ver que no tenemos ningún error de TypeScript. Entonces significa que estamos devolviendo las mismas propiedades que existen para citar al usuario. Así se puede ver ese lado, el esquema punto GraphQL, tenemos contraseña de correo electrónico, FirstName, LastName es que el tipo de usuario y lo mismo dentro de las entradas de registro. Por eso no tenemos ningún error. Ahora, todavía tenemos que devolver el token JWT. Y esta va a ser solo una cadena aleatoria. Ahora bien, si te diste cuenta, no obtuvimos ningún error cuando nos faltaba el token JWT. Sí. Y eso es porque el esquema del sábado punto GraphQL, no agregamos un signo de exclamación aquí. Entonces tenemos que agregar esto o hacer que estas dos propiedades sean requeridas y guardar este archivo. Y ahora tenemos que ejecutar de nuevo el comando generate para que podamos asegurarnos de que el autor resuelva. Estamos devolviendo el token JWT con la propiedad user. Entonces aquí hemos generado el esquema, y aquí vamos tenemos un error de TypeScript diciendo que nos falta el DWT. Entonces aquí si agregamos la propiedad DWT, la Tierra desaparecerá. Y por ahora sólo vamos a enviar algunos datos ficticios. Después después de que hayamos terminado los archivos principal y el módulo, vamos a volver aquí y terminar todas las mutaciones y consultas. Y eso es porque todavía necesitamos conectarnos a una base de datos y crear la entidad de usuario dentro de esa base de datos. Entonces con eso dicho, el siguiente video, vamos a empezar a trabajar en el módulo y los archivos principales. 11. Configurar nuestro servidor Apollo-express: Ahora dentro del módulo, el archivo ts, vamos a configurar nuestro servidor Apollo para que funcione con nuestro esquema GraphQL. Y el autor es solucionadores. Entonces comencemos importando pocos paquetes. primero es el servidor Apollo de Apollo server express e import express desde Package Express. Y también necesitamos el http del paquete HTTP. Y no es necesario instalarlo porque lo tenemos por defecto con NodeJS. Bien, ahora vamos a exportar y crear una nueva clase y nombrarlo módulo de aplicación. Dentro de esta clase vamos a tener un constructor que aceptará un resolvers. Entonces aquí crea una variable pública y nombra resolvers, y va a ser de tipo resolvers. Tenemos que importar eso desde la carpeta generada y desde el archivo de tipos resolvers. Y aquí estamos recibiendo un error porque tenemos que importar y usar resolvers, no resolvedores. Entonces agrega una S ahí. Y aquí vamos a crear un método que iniciará el servidor Apollo. Entonces la guinda inicia Apolo. Y este método debería regresar. Por supuesto que es una promesa, y la promesa debe resolver un objeto con servidor HTTP, propiedad de tipo servidor HTTP. Y tenemos que devolver un servidor o propiedad de tipo servidor Apollo. Ahora vamos a crear una constante y nombrarlo servidor, y usar la clase de servidor Apollo para crear una nueva instancia de servidor Apollo con algunas configuraciones. Entonces aquí tenemos que pasar nuestro esquema GraphQL y resolvers. Y voy a empezar con resolvers y voy a pasar esta variable aquí. Y claro, estamos dentro de una clase, así que necesitamos usar la palabra clave this y luego los resultados. Ahora para el esquema, tenemos el tipo muertes propiedad. Y tenemos que tomar este archivo, el esquema punto GraphQL, y pasarlo aquí. Y para eso, vamos a utilizar el método read file sync de nuestros paquetes de alfas. Así que aquí Lee File Sync e importado de fs. Y antes de esto, el servidor, vamos a crear constantes de muertes de tipo. Y aquí vamos a usar el Read File Sync para leer el esquema GraphQL desde el esquema de ese archivo GraphQL. Entonces déjame borrar esto. Y aquí, continuemos. Necesitamos especificar la ruta. Y como tenemos este archivo esquemático GraphQL en el directorio raíz, podemos escribirlo así. Esquema gráfico chica. Y vamos a leer este archivo con codificación establecida en UTF ocho. Porque sin la opción de codificación, vamos a recuperar un búfer. Pero aquí necesitamos una cadena. Así que quita el colon y solo dale al tipo muertes así. Ahora tenemos que iniciar el servidor, así que espera servidor que inicie. Y entonces necesitamos crear o usar el middleware apply. Y aquí vamos a agregar una médula express. Así que primero vamos a crear una app con Express y usarla aquí como medieval. Ok, ahora, necesitamos devolver un servidor HTTP. Pero la app aquí no es de tipo HTTP. Ese servidor es este es de tipo express. Entonces vamos a usar los paquetes HTTP para crear un servidor HTTP usando la aplicación app, me refiero a la aplicación Express. Entonces aquí, crea una nueva constante y nombra servidor HTTP, y luego usa http punto, crea servidor y pasa el ahí arriba. Entonces aquí, eso es devuelto el servidor HTTP con el servidor Apollo. Ahora, tenemos que iniciar una nueva instancia y exportarla desde el archivo del módulo. Entonces aquí, exportar audio constante y luego crear una nueva instancia de módulo de aplicación. Aquí tenemos que pasar los resultados. Entonces tenemos que importar primero el autor es overs. Entonces aquí importamos nuestros resolutores, y creo que no lo exportamos del archivo ogros del autor. Entonces hagámoslo aquí. Exportación, exportación. El autor es solucionadores. Y luego déjame copiar esto, volver a un módulo e importar los resolvers del autor de salir o dentro de la carpeta Tierra y dentro de los resultados del autor. Ahora, volvamos aquí y usemos los resolutores aquí, y luego guardemos este archivo. Y en el siguiente video, vamos a empezar a trabajar dentro del archivo main.js. 12. Ejecuta y prueba nuestro Api: Dentro del archivo main.js, tenemos que importar el módulo desde el archivo del módulo y luego crear una función bootstrap. Y va a ser asíncrono. Y dentro de aquí, extraeremos el servidor HTTP y el servidor del módulo que inician un método de botella. Y luego usaremos el servidor HTTP para iniciar o empezar a escuchar conexiones son ambas para miles. Después devolveremos un mensaje a la consola diciendo que servidor está listo en http localhost. Y luego el puerto 4 mil. Y aquí necesitamos obtener la ruta de la puerta de enlace GraphQL desde el servidor Apollo. Así que voy a añadir aquí otra cadena del servidor, esa propiedad de ruta GraphQL. Y luego obtendremos la ruta a para la puerta de enlace GraphQL. Bien, ahora, todavía tenemos que ejecutar la función bootstrap se llaman la función bootstrap. Y ahora guardemos el archivo main.js y pasemos por archivo package.json y agreguemos algunos scripts para ejecutar nuestra aplicación. Entonces aquí, crear un nuevo comando de inicio y tenemos que compilar nuestro código y luego ejecutar el archivo main.js. Y esta vez vamos a usar el dash, dash qué opción sin Ts, en lugar de usar paquetes de Node man. Y para poder utilizar esta opción, hay que tener la última versión de notas. Sí. Entonces tengo la versión 19 debería tener al menos 18. Así que asegúrate de actualizar tu versión Node.JS. Entonces aquí, vamos a la ruta al archivo main.js. Entonces esta carpeta, luego carpeta fuente y luego el archivo principal dot js. Y ahora tomemos aquí el comando TSO y lo pongamos en otro comando. Entonces aquí, crea un comando de compilación y pega ahí el TSC. Entonces aquí vamos a ejecutar npm, ejecutar compilar. Entonces compilaremos nuestro código y luego ejecutaremos el archivo main.js y estaremos atentos a las actualizaciones o a los cambios. Ahora vamos a guardar el archivo package.json y los clubes. Y aquí en la terminal, vamos a correr npm, correr inicio. Y tenemos un error. Y eso es porque necesitamos agregar una consulta a nuestro esquema. Entonces por ahora no estamos usando consultas, pero voy a agregar consulta muy simple. Entonces aquí, bajo mutación, voy a ejecutar o crear nueva consulta de tipo dentro de ella, voy a crear una consulta que devolverá una cadena. Y aquí el esquema define una consulta. Y luego aquí también consulta y guarda. Y esta vez necesitamos regenerar los tipos y crear un solucionador para eso. Entonces npm ejecutar, generar. Y luego dentro del autor resolvers. Vamos a crear una consulta aquí y obtener método. Entonces debería ser una propiedad y luego citarla. Tendremos el método get y solo devolveremos una cadena. Entonces voy a devolver una cadena LK y luego guardar y ejecutar la aplicación nuevamente. Aquí, npm, corre, empieza. Bien, ahora tenemos nuestro servidor en localhost 34,000 slash GraphQL. Y aquí parece que agregamos un slash, pero lo arreglaremos más adelante. Ahora vayamos a nuestro navegador y naveguemos a localhost 4,000 GraphQL y demos clic en Consulta tu servidor para que podamos acceder a él. Estudio Fotográfico. Y a partir de aquí vamos a probar nuestras mutaciones y consultas. Bien, ahora estamos dentro del sandbox de Apolo y bajo root aquí encontrarás la consulta y la mutación. Ahora, comenzaremos con desempolvar la mutación e intentaremos inscribirnos. Por supuesto, tenemos un dato ficticio, pero aquí solo probaremos la puerta de enlace GraphQL. Entonces, para agregar la consulta de registro, haga clic en el icono más y obtendrá la mutación y luego el registro con la entrada. Y así definimos nuestra mutación desde la luz, desde el front-end o desde el cliente. Entonces aquí, la entrada aquí es una variable y es de tipo Entrada de registro. Así que estamos obteniendo este tipo del esquema, claro. Y aquí estamos definiendo la mutación de registro o el método de registro. Sí, así que este es solo el tipo de mutación, y esta es la mutación real. Y estamos agregando o configurando el argumento input para que sea igual a la, esta variable. Y podemos, ah, editar la variable de entrada desde aquí. Como puedes ver aquí estamos dentro de la sección de variables y aquí podemos definir todas las variables requeridas. Ahora dentro del método de registro, también definiremos el tipo de retorno y el esquema del sábado GraphQL. Se puede ver que la mutación de registro devolverá una respuesta y el otro cónyuge tendrá un campo de usuario donde se encuentra el campo JWT. Entonces aquí podemos especificar qué propiedad vamos a obtener. Entonces en nuestro caso, vamos a conseguir usuario y solo nos interesa y el id. y luego obtendremos x, o estamos esperando el DWT. Y eso es todo. Esto es lo genial de GraphQL. Le permite decidir qué datos desea obtener como respuesta. Entonces, en lugar de devolver todo el documento de usuario con la contraseña de correo electrónico, FirstName y LastName, podemos decirle a draft girl que solo devuelva el ID y también el token JWT , claro, porque lo usaremos para autenticar al usuario. Ahora vamos a ejecutar esta consulta haciendo clic en el botón Regístrate aquí. Y claro, nos olvidamos de agregar la entrada. Por lo que esta solicitud fallará. Dice que la entrada variable no es, no debe ser nula. Entonces aquí, cambiemos eso. Y en su lugar los argumentos aquí, sección de argumentos, podemos encontrar la entrada de tipo Sign-up input y puede agregar los tipos necesarios aquí. Así que déjame borrar todo esto en correo electrónico, contraseña y FirstName, LastName. Todos ellos son requeridos. Ahora para el correo electrónico va a elegir solo el usuario uno en email.com, y para la contraseña, va a enviar solo contraseña, FirstName, usuario uno, y último año apellido, usuario. Ahora enviemos de nuevo esta consulta o esta mutación y esperemos la respuesta. Bien, tenemos el ID de uno y el token JWT como esta cadena aquí. Y puedes verificar que esta cadena es la misma cadena que definimos dentro de la sentencia return aquí. Entonces el JWT o propiedad. Así que tenemos nuestro gateway GraphQL trabajando con el servidor Express y Apollo. Y vamos muy rápido también a probar la consulta. Sí, así que vamos a ejecutar el método get, asegura de simplemente dejarlo ahí y agregar la consulta get. Así que agrega esto aquí en el GetMethod. Y para esta consulta, no esperamos obtener ninguna entrada. Por lo tanto, podemos simplemente escribir el método get así sin paréntesis, n sin ningún argumento, luego ejecutar la consulta y deberíamos obtener, bien, String. Bien, tenemos esto aquí. Y ahora sabemos que todas nuestras consultas y mutaciones están funcionando y que podemos ejecutar nuestros resolutores. Ahora, tenemos que terminar de trabajar en la mutación de registro y también terminar aquí todos los resolutores. Pero antes de eso, necesitamos usar type around para crear una entidad de usuario para que podamos crear un usuario y guardarlo en la base de datos. 13. instalar y configurar typeorm: En este proyecto, vamos a usar type round para administrar nuestra base de datos. Hay muchos organismos por ahí, pero el más popular es el tipo rampa. Y eso es porque tiene muchas características y es fácil de usar, especialmente con TypeScript. Ahora un OR es un Asignador Relacional de Objetos. Puedes hacer clic en este enlace aquí y te llevará a una página de Wikipedia. Y puedes leer más sobre el mapeo relacional de objetos aquí. Sí. Pero TypeScript o nuestra rampa de tipos representan en conjunto TypeScript, objeto relacional, mapeador y type around. Es una biblioteca que facilita vincular nuestras aplicaciones TypeScript hasta una base de datos relacional. Y en nuestro caso, vamos a utilizar Postgres como nuestra base de datos relacional. Y por supuesto, los amplificadores de pañales admiten muchas otras bases de datos, incluso MongoDB, pero aún está en etapa experimental. Entonces, si quieres usar MongoDB, puedes hacerlo, pero tienes que agregar muchas otras configuraciones. Porque como sabes, cuando usamos Mongoose, tuvimos algunas dificultades cuando queremos implementar TypeScript con modales de Mangoose. Sí, entonces pasa lo mismo aquí con pañal m, pero tenemos muchas otras opciones como Postgres, C-Corps, y mi SQL o secuela light y todas las demás bases de datos. Ahora puedes navegar para escribir el título del parámetro y conocer más sobre sus características. Pero claro, en este proyecto, te voy a enseñar cómo instalar el tipo Rahm, cómo usarlo, cómo crear una entidad, qué tipo alrededor, y muchas otras cosas. Entonces abramos nuestro Código VS. Y dentro del terminal, comencemos instalando type around y el driver Postgres. Y también necesitamos otro paquete llamado reflect Meta data porque vamos o tecleamos o M está usando los caracteres. Y para usar los caracteres con TypeScript, necesitamos instalar el reflejarme los datos aquí. Entonces este soy yo ese dato. De lo contrario obtendremos, no podremos ejecutar nuestra aplicación. Así que asegúrate de instalar eso. Y además si no instalaste los tipos por nota, asegúrate de hacerlo. Sí, lo he instalado desde el primer video. Entonces voy a ejecutar este comando y esperar la instalación. Bien, ahora dentro del archivo main.js, tenemos que importar los metadatos reflejados Beckett para poder usar los caracteres. Entonces déjame copiar esto. Y la razón por la que eliges main.js es porque es nuestro archivo principal para este proyecto. Entonces voy a importar todo desde la importación. Me reflejan que Theta entre corchetes aquí. Y tenemos que añadir algunas configuraciones aquí. Y así los ts config que dicen algo de diversión. Entonces necesitamos agregar dos propiedades más. primero es el emit, los caracteres, metadatos y set a true. Y también los decoradores experimentales también se pusieron a la verdad. Y estas propiedades son muy importantes cuando queremos ejecutar o usar los caracteres dentro de nuestra aplicación. Ahora bien, si no sabes qué, cuáles son los personajes, aprenderemos sobre ellos cuando empecemos a crear nuestras entidades. 14. Crear entidad de usuario: Ahora que tenemos tipo rampa dentro de nuestro proyecto, Empecemos por crear la entidad de usuario. Entonces dentro de la carpeta, crea otra carpeta y nombra el lado del usuario aquí, crea otra carpeta llamada entidad. Y luego dentro de la carpeta de entidad, crear el usuario, esa entidad, el archivo ts. Ahora lado aquí, vamos a importar la entidad de carácter de type wrap. Y luego exportaremos un nombre de clase, un teaser. Y aquí vamos a usar la entidad decoradora. Y así definimos entidades con pañal m. Ahora, los personajes son simplemente funciones simples. Sí, That's devuelve otra función, pero también usa unos argumentos muy específicos y necesitan el reflejarme el paquete de datos para funcionar. Sí, entonces si quieres crear un decorador, puedes buscar en línea, pero te voy a dar un ejemplo muy sencillo. Así que imagina que tenemos entidad aquí. Imagina que queríamos crear una entidad, el personaje. Entonces voy a hacer, voy a crear una constante y nombrarla entidad. Y entonces voy a crear una función. Y esta función tiene que devolver otra función. Ahora, la segunda función aquí debería aceptar un target y aceptar una clave de propiedad. Para Tiki puede ser de tipo cadena y también un algo llamado distribuidor. Este agarre ahí. Y éste es de tipo descriptor de propiedad. Por supuesto, no debemos usar el distribuidor de funciones para una clase. Por eso tenemos un error aquí. Sí, pero puedes conocer más sobre los distribuidores dentro de la documentación. Por mecanografiado aquí, puedes leer más sobre los personajes. Entonces copia este enlace y puedes saber muchas cosas aquí sobre los distribuidores de clase, por ejemplo aquí, cómo los construimos aquí. Entonces aquí creamos una función con un constructor. El constructor es solo una función. Y luego usamos muchos métodos JavaScript aquí para manejar o para extraer las propiedades y los métodos de la clase y hacer algo con ellos. Sí, ahora, asegúrate de, si quieres leer más sobre ellos, asegúrate de venir aquí y, por ejemplo tratar de construir tus propias herramientas o tus propios decoradores. Sí, pero por ahora, eliminemos esto y continuemos con nuestra entidad de usuario. Ahora, necesitamos un nombre dentro de nuestra entidad de usuario. Entonces aquí, escribe nombre de pila. Y éste va a ser de tipo string. Y asegúrate de que sea una cadena de TypeScript. Quiero decir, con una minúscula como. Y tenemos que usar otro personaje aquí. Y a este personaje se le llama columna. Entonces columna de tipo alrededor y úsalo aquí. Columna. Ahora tenemos el FirstName, el lastName, apellido de tipo string. Y claro que voy a volver a usar la columna. Y también necesitamos el correo electrónico de tipo string. Y luego la columna. Y lo genial del tipo donde está m, incluso si usaste un MongoDB o cualquier otra base de datos, puedes definir, tienes que definir las entidades siempre en la misma con la misma estructura. Excepto Mangosta. Porque como dije antes, todavía está en la etapa experimental. Sí. Y estuvo ahí desde hace mucho tiempo, pero aún se puede trabajar con él, pero hay que crear un esquema. No podemos crear una entidad con Mangosta con pañal. Ahora continuemos con la entidad de usuario. Todavía necesitamos la contraseña, y siempre es escribir cadena aquí. Y voy a agregar una configuración para la contraseña. Y para ello, podemos pasar un objeto aquí y decir o una propiedad, seleccionarlo y establecerlo en falso. Y esto quiere decir que no queremos no queremos que la contraseña sea devuelta al cliente. Sí, nosotros queremos ocultar la contraseña y así es como lo hacemos con tipo. Ahora podemos agregar muchas configuraciones, por ejemplo para el correo electrónico aquí, podemos. Mencioné que no queremos que la imagen no sea. Entonces usamos la propiedad nullable y la establecemos en false. Entonces el correo electrónico no será, No. Esto es como una validación con pañal n, pero vamos a usar otra forma para la validación, de manera más avanzada. Sí. Ahora todavía, todavía necesitamos la identificación aquí. Pero debido a que la idea es generada automáticamente por los posteriores, vamos a usar otro decorador para definir el id y que el carácter se llama columna primaria generada. Y aquí usaremos a ese decorador. Entonces primaria se genera columna. Y aquí vamos a definir el id. Y como dije para PostgreSQL, vamos a conseguir números de ideas. Ahora vamos a guardar este y el siguiente video, vamos a crear el servicio de usuario y comenzar a usar la entidad de usuario. Entonces nos vemos ahí. 15. Método de Create-user | user.service: Ahora dentro de la carpeta de usuario, vamos a crear otro archivo y nombrarlo niveles de servicio de usuario. Y aquí vamos a exportar y crear la clase user service. Y luego se va a agregar un constructor. Y dentro de ella vamos a definir una variable pública y nombrarla repositorio de usuarios. Y va a ser de tipo repositorio. Y vamos a importar la interfaz del repositorio desde máquinas de escribir, así sucesivamente, repositorio desde type ramp. Y aquí en repositorio. Y tenemos que pasar la entidad aquí. Si pasas el cursor sobre esto, encontrarás que es necesario para poder usarlo dentro de nuestra clase. Entonces aquí agregaremos la entidad de usuario y tenemos que importarla desde la entidad de usuario de archivo. Entonces para cada usuario desde la entidad de usuario o dentro del archivo de entidad, luego use o esa entidad. Ahora, podemos comenzar creando el primer método, que es el método create, donde crearemos un nuevo usuario. Así asincrónico crear. Y luego aquí para el, para los argumentos, va a ser un insumo de registro. Y aquí también vamos a usar los tipos generados automáticamente. El tipo para la misma entrada aquí. Así que vamos a asignar el argumento de entrada de registro para registrar entrada, interfaz y tipo. Y vamos a importar eso de un nivel hacia fuera y luego dos niveles. Y Site Generated va a seleccionar el tipo de resolvers y la entrada de registro. Y si pasa el cursor sobre la entrada de registro, aquí encontrará todas nuestras propiedades requeridas, como el nombre y apellido del correo electrónico y la contraseña. Por supuesto, sin la identificación porque está, se genera automáticamente. Y aquí arregla la asincrónica. Ahora, lo primero que tenemos que hacer dentro del método create es hash de la contraseña. Para eso necesitamos el otro paquete. Entonces abramos la terminal. Y voy a parar el Beckett llamado descifrar. Y lo usaríamos para pasar nuestra contraseña y también comparar las contraseñas cuando queramos iniciar sesión al usuario. Entonces aquí, npm instalar la cripta. Y también necesitamos instalar los tipos para, ser correctos. Entonces ejecuta este comando. Espera la instalación, y ya está. Déjeme aclarar esto y cerrar la terminal. Y aquí, déjame abortar la clase Big Rip desde la cripta. Y aquí vamos a crear nuevas contraseñas, una contraseña hash. Espera a que el cifrado. Ese hash. Y lado aquí, vamos a pasar la entrada de registro. Así que inscríbase aquí. Ingresa esa contraseña. Y entonces tenemos que elegir unas rondas de sal. Entonces aquí, vamos a elegir diez como las rondas de Sal. Y aquí estamos recibiendo un error porque la contraseña, si pasas el cursor sobre esta, encontrarás que no se requieren todas las propiedades dentro del tipo de entrada de registro . Para cambiar eso. Tenemos que ir al esquema que GraphQL. Y aparte aquí agregue un signo de exclamación en todas las propiedades aquí. Y hagamos lo mismo por el usuario. Entonces necesitamos solo para la contraseña. Sí. Porque no lo íbamos a enviar de vuelta. Y luego se pone, Vamos a guardar esto. Y necesitamos abrir la terminal y generar los tipos. Entonces aquí, npm run, generate. Y eso es todo. Déjeme aclarar esto o simplemente cerrar la terminal. Vuelve al servicio de usuario y el error ha desaparecido. Y ahora la contraseña es de tipo cadena antes de que fuera de tipo tal vez o algo así. Usarán otra interfaz o una clase aquí para definir propiedades no requeridas. Pero cuando se requiere, estamos usando este tipo aquí, pero es automático, degenerado. Eso no nos importa. Ahora sigamos construyendo el usuario. Ahora, cree una constante de usuario, luego use este repositorio de usuarios de punto y luego cree el método desde el repositorio de usuarios. Y aquí vamos a difundir el usuario o la entrada de registro, registrarse entrada. Y luego vamos a agregar la contraseña aquí. Entonces sé que dentro la entrada de registro ya tenemos una contraseña, pero cuando difundimos las propiedades más antiguas como esta dentro de un objeto y luego agregamos otra propiedad con el mismo nombre que existe en la entrada de registro. En realidad vamos a actualizar esa propiedad. Y vamos a tener la contraseña establecida en este valor a la contraseña de HashSet aquí. Ahora, déjame, tenemos que salvar al usuario. Y para ello, necesitamos usar este método de guardado de punto de repositorio de usuarios y pasar el documento de usuario recién creado. Por supuesto, vamos a devolver este documento al cliente. Entonces se le devolvió esto y esperarlo. Y luego guardar. Ahora con el fin de utilizar el servicio de usuario dentro de los resolutores de la Tierra. Y debido a que el autor es solucionadores, es un objeto, no podemos agregar una variable pública y establecerla al tipo de servicio de usuario de usuario. Entonces tenemos que crear una instancia desde el servicio de usuario y exportarla para que podamos usarla dentro de los resultados del autor. Sí, entonces, bien, exportar, luego constante Servicio de Usuario y va a agregar una nueva instancia de servicio al usuario. Y aquí tenemos que pasar el repositorio de usuarios. Y para eso, necesitamos crear la fuente de datos. Y a partir de la fuente de datos, vamos a obtener el repositorio de usuarios. Eso lo haremos en el siguiente video. 16. añadir fuente de datos de aplicación: Ahora vamos a crear la fuente de datos de la aplicación y luego volver aquí. Entonces dentro de la carpeta fuente, crear un nuevo archivo y nombrarlo, hace fuente de datos, los Ts. Y aquí tenemos que importar la clase de fuente de datos de pañal. Y aquí tenemos que exportar una constante, nombrarla fuente de datos. Y va a ser igual a una nueva instancia de clase de fuente de datos. Y aquí vamos a tener el tipo de la base de datos. Y en nuestro caso, vamos a utilizar la base de datos Postgres. Puedes ver aquí que tenemos muchas bases de datos, como dije antes, tengo mi enfermo o tenemos muchas otras bases de datos como MongoDB aquí. Entonces para nosotros vamos a usar Postgres. Y hay que elegir Postgres en este proyecto porque luego después de esto vamos a usar Docker para ejecutar base de datos Postgres dentro de nuestro sistema local. Sí. Entonces, si quieres seguir este curso, debes elegir también Postgres. Ahora, necesitamos el host para la base de datos y nuestro caso, vamos a ejecutar la base de datos en el host local. Y vamos a elegir el puerto. Y para Postgres, tenemos el puerto 5432, y necesitamos un nombre de usuario para la base de datos. También se agregaría toda esta información, se utilizan cuando iniciamos nuestra base de datos Postgres con Docker. Así que aquí el nombre de usuario va a elegir Admin. Y para la contraseña, voy a elegir también admin. Y luego el nombre de la base de datos, va a ser base de datos principal. Y ahora tenemos que definir nuestras entidades. Las entidades. Es una matriz que contiene todos los archivos de entidades. Por lo que se puede especificar la ruta de su entidad. Pero hay una mejor manera de hacerlo es por primera vez, hemos deseleccionado dist folder y luego agregamos dos estrellas para elegir o para buscar dentro de cualquier carpeta. Y luego agrega una estrella aquí, luego entidad de punto que G tiene. Ahora, al usar esta ruta, vamos a seleccionar todos los archivos dentro de la carpeta dist y dentro cualquier carpeta que exista dentro de esta carpeta que tenga una entidad punto al final de su nombre. Sí. Ahora, todavía necesitan más propiedades como el registro. No queremos obtener una secuela de consultas dentro de nuestra terminal. Entonces para la tala, voy a elegir false. Y tenemos que agregar la opción de sincronizar aquí. Pero asegúrate de establecerlo cierto solo para cuando desarrollemos nuestra base de datos o nuestro proyecto. Y puedes leer aquí la documentación de esta propiedad. Y eso es una advertencia de que si usas la opción y el modo de producción, perderás como usarás datos de producción. Entonces básicamente esta opción aquí, actualizaremos la base de datos. Y porque estamos usando Postgres, es una base de datos relacional. Será, el posterior actualizará las tablas de base de datos entre todas las entidades. Pero esta no es una forma segura de actualizar el esquema. Por lo tanto, sólo lo usaremos. Usa esta opción aquí. Después trabajaremos con, agregaremos make pacientes, y aquí nos desharemos de esta opción. Entonces, por ahora, mantengámoslo establecido en true y volvamos al servicio al usuario. Y tenemos que importar la fuente de datos, fuente de datos de un nivel hacia fuera, dos niveles que la actualización. Entonces está ahí y lo usaremos aquí. Fuente de datos, luego repositorio de punto Git. Y tenemos que sumar el objetivo. Y el objetivo es un tipo de entidad. Entonces tenemos que pasar la entidad de usuario aquí para que podamos obtener el repositorio de usuarios. Ahora en el siguiente video, vamos a empezar a trabajar con el autor es solucionadores. Y vamos a terminar este registro o no terminado, pero empezar a trabajar en este método de registro. Entonces nos vemos ahí. 17. Crear un resolver, signup: Ahora dentro de la mutación de registro, eliminemos aquí este código. Y lo primero que tenemos que hacer es crear un nuevo usuario. Tan constante usuario que esperar por el servicio al usuario. Y puede darse el lujo de que los usuarios recorten el servicio de usuario. Y luego vamos a usar el método create y pasar la entrada o la entrada de registro. Y para nosotros, es solo el argumento de entrada aquí. Ahora, el tipo de retorno de la mutación de registro es objeto que tiene un campo de usuario con el campo JWT. Entonces necesitamos crear un token JWT. Y para eso, abramos nuestro terminal e instalemos npm JSON Web Token. Y por supuesto necesitamos los tipos, tipos JSON Web Token. Y déjeme aclarar esto, cerrar la terminal. Y aquí tenemos que generar un token JWT usando el paquete JWT. Importar JWT desde el token web JSON. Ya sabes cómo hacer esto, tenemos que usar JWT que el método de inicio de sesión. Aquí. Pasaremos la carga útil. Y esta vez voy a agregar una carga útil con correo electrónico de la entrada ese correo electrónico y un ID de usuario desde el ID de usuario. Y necesitamos un token JWT. Entonces tenemos que crear un archivo de longitud de punto y agregar allí la variable token JWT. Entonces, en el nivel de router de nuestro proyecto, vamos a crear un archivo. Y dentro de aquí una clave JWT, y añadir algunos caracteres aleatorios. Y luego guardar. Entonces necesitamos el paquete que nos va a leer los archivos dentro de un proyecto TypeScript. Y esos son los corchetes. Así npm instalar punto. Entonces eso es, eso es seguro. No guardar dev. Permítanme aclarar esto ahora. Cierra la terminal y vamos a usar el punto m que se mete dentro del archivo main.js. Entonces aquí importo todo como en. A partir de aquí vamos a utilizar en el gótico y llamar a este método. Y asegúrate de importar esto en la parte superior aquí para todos los estados de importación, y luego Guardar. Y aquí dentro del método bootstrap, vamos a comprobar si tenemos un proceso que en el token JWT o no. Sí. Entonces, si no tienes la clave GDB T aquí, si no tienes esta, vamos a regresar o lanzar un nuevo error. Y va a tener un mensaje que diga base de datos. Bien, ahora vamos a guardar esto, volver aquí, cerrar el archivo main.js, e ir al proceso que en esa clave JWT. Entonces tenemos que agregar un signo de exclamación aquí porque ya lo comprobamos dentro del archivo main.js. Si no lo hicimos, no obtuvimos la clave DWT. Cuando ejecutemos la app, vamos a lanzar un error y no vamos a iniciar la API. Ahora necesitamos agregar un nuevo objeto aquí. Y agregaremos los caducos en propiedad. Y aquí podemos definir el tiempo en el que queremos que este token JWT esté caducado. Entonces en mi caso, quiero caducar esta ficha en siete días. Para que puedas elegir en cualquier momento que quieras. Vamos a guardar esto. Y claro que podemos sumar días como va este. Si pasa el cursor sobre expuesto en propiedad aquí, encontrará que excepto como tiempo con segundos o con solo algunas cuerdas como esta, dos días o 10 h, siete días. hay muchas maneras de Aquí hay muchas maneras de definir el tiempo. Entonces ahora después de crear el token JWT, tenemos que devolver un objeto con el usuario y el JWT, y se va a establecer en el token JWT. Ahora bien, el error ha desaparecido porque aquí estamos devolviendo el valor correcto. Y aún necesitamos verificar si tenemos un usuario con el mismo correo electrónico que ya existe dentro de la base de datos. Entonces para eso, tenemos que crear un nuevo método dentro de User Service. Y se va a nombrar buscar uno por correo electrónico. Y vamos a recibir el correo electrónico como cadena. Y luego vamos a devolver 08 y usar el repositorio de usuarios para encontrar uno por rápido el correo electrónico aquí. Ahora guarda esto y vuelve a los resolutores. Y aquí, crear una nueva constante y nombrarla, existir o usuario existente. Y aquí vamos a utilizar el Servicio de Usuario que encuentre uno por correo electrónico y el correo electrónico de las entradas de ese correo electrónico. Y tenemos que esperar esto. Y luego guardar. Y necesitamos verificar si tenemos un usuario existente, entonces tenemos que devolver un error. Y para el error, necesitamos usar un tipo muy específico de errores que provenga de o con GraphQL. Y esto es un GraphQL. Y podemos importarlo de un trato gráfico. Sí, así que si no instalaste graph aquí, asegúrate de instalarlo y también instalaste los tipos para GraphQL. Y aquí necesitamos agregar un mensaje. Entonces el mensaje va a ser usuario ya existe. Y podemos simplemente devolver un mensaje o podemos agregar algunas otras configuraciones, como la extensión o las extensiones. Y aquí podemos agregar el código de este error. Entonces otro objeto aquí, la propiedad Code. Y voy a devolver un mal código de solicitud. Entonces si quieres devolver alguna información sobre este error, como tal vez los campos o el tipo de error como este. Puede agregar todo eso dentro del objeto extensions aquí, y se enviará al cliente. Por supuesto, si quieres crear un error personalizado con crear los mismos que hicimos dentro de los otros dos proyectos. Crear clases separadas para su error. Y claro, todavía tienes que usar el GraphQL aquí para crear esas clases. Pero realmente no es necesario porque ya tenemos una clase y podemos usarla cada vez que queramos lanzar un error. Y será analizado como el cuidado de la gráfica o sí, no necesitamos crear ninguna clase nueva a partir de eso. Ahora, eso es todo para el método de registro. En el siguiente video, vamos a crear el inicio de sesión. 18. Creación de un resolver, signin: Ahora no podemos trabajar en el signo una mutación aquí. Entonces los resolutores, porque todavía no definimos las mutaciones de inicio de sesión son el esquema. Entonces primero hagamos eso y luego volvamos a los resolutores de la Tierra. Justo aquí. Vamos a establecer la mutación, Vamos a crear el sitio en mutación. Y obtendremos una entrada de tipo, entrada de inicio de sesión. Y por cierto podemos, podemos usar otra estructura aquí. Entonces, en lugar de agregar un argumento y el tiempo para ese argumento, podemos definir todos los argumentos aquí, como y correo electrónico de tipo string. Y se requiere. Y luego añadimos una coma y necesitamos una contraseña como cadena. Sí, pero debido a que estamos usando los tipos también dentro de nuestros resolvers, dentro de nuestro servicio de usuario, necesitamos definir su tipo de entrada como un objeto aquí. Entonces vamos a cambiar esto a entrada de entrada de inicio de sesión, y este va a ser requerido. Nuevamente, vamos a devolver una respuesta terrestre. Y por supuesto que se requiere. Ahora, necesitamos agregar el inicio de sesión aquí, entrada que se crea aquí. Entrada y entrada de inicio de sesión. Solo necesitamos el correo electrónico como cadena, y se adquiere con la contraseña como cadena requerida. ¿Correcto? Ahora, vamos a guardar esto y abrir la terminal. Y tenemos que generar el esquema. Entonces npm run, generar originaria el tipo del esquema. Bien, ahora cierra la terminal y cierra el esquema punto archivo GraphQL y vuelve aquí dentro del autor es solucionadores. Bajo el inicio de sesión. Definamos el o debajo del registro, definamos el método de inicio de sesión. Deberíamos obtener una sucesión para este método aquí. Sólo espera un segundo aquí. Iniciar sesión. Y si pasas el cursor sobre él, encontrarás que sine n es de tipo resolvedor. Entonces sí generamos los tipos correctamente. Entonces aquí, eso es entrada de corriente definida y los contextos. Y como dije antes, vamos a hablar de los contextos y solo de los videos futuros. Sí, así que aquí tenemos que comprobar si tenemos un usuario con ese correo electrónico guardado dentro de la base de datos. Entonces voy a copiar estas dos líneas aquí desde el método de registro y pegarlas aquí. Y cambia esto con solo usuario. Aquí. Si no lo hacemos, si no tuviéramos un usuario, vamos a devolver un largo escrito así error. Entonces aquí, mal, cree potenciales, exterior y el código sigue mal pedido. Y luego tenemos que verificar si tenemos, si las contraseñas dentro de la entrada son iguales a la contraseña de peligro de la base de datos de usuarios. Entonces vamos a agregar una constante y nombrarla PWD correcta, y luego esperar a cripta B. Y tenemos que importar eso. Así que este perro Alport ser corrupto clase de los paquetes de descifrar. Y aquí va a usar el método comparar. Y este método acepta el buffer o la entrada y luego lo compara con la contraseña ácida. Sí. Así que aquí ingresa la contraseña. Y luego obtendremos la contraseña de peligro de la contraseña de usuario. Pero en nuestro caso, no podemos obtener la contraseña del usuario. Eso es porque dentro de la entidad de usuario, dijimos la palabra de moda canon, seleccione false. Y por eso llegaremos hasta aquí y definimos o no. Sí. Pero podemos cambiar ese sitio, el servicio al usuario, y en su lugar encuentran uno por correo electrónico que lo haya eliminado, encuentren uno por método. Aquí. Vamos a crear un generador de consultas. Entonces, desde el repositorio de usuarios, cree un generador de consultas. Y aquí vamos a declarar una variable y nombrarla usuario. E igual al constructor de consultas. Aquí. Agregar un Ideas para usuario, y luego usaremos un método para seleccionar la contraseña del usuario. Entonces aquí, contraseña de usuario, ahora la consulta. Pero hay un método que ayuda a construir consultas SQL simplemente agregando algunos otros métodos como este. Sí, así que vamos a crear, degenerar una consulta secuela aquí usando el Constructor de Consultas para seleccionar la contraseña de usuario. Y luego vamos a encontrar o seleccionar un usuario donde el correo sea igual al correo electrónico. En aquí definiremos la variable email. Entonces lo que está pasando aquí es que vamos a comprobar si el correo electrónico es igual a esta variable, sí. Y para definir variables dentro de esta consulta aquí, agregamos los dos puntos y luego el nombre de la variable. Y luego en el segundo argumento aquí, tenemos un objeto que contiene los valores de esa variable aquí, y debería estar en el mismo nombre que escribimos aquí. Es por eso que cuando ejecutemos el generador de consultas aquí, esto se cambiará a email igual y luego al correo electrónico del usuario. Ahora, necesitamos otro método aquí para conseguir un usuario. Y si pasas el cursor sobre el usuario ahora, encontrarás a ese usuario como una promesa que devolverá ya sea un usuario o no. Por lo tanto, tenemos que esperar aquí, y esta vez obtendremos ya sea usuario o no. Y ese caso, vamos a devolver al usuario y guardar el servicio al usuario. Regresa aquí. O en realidad volvamos al servicio al usuario. Y aquí, olvidé mencionar que deberíamos agregar un selecto aquí. Sí, esta va a ser la selección primaria y vamos a seleccionar el documento de usuario o todas las columnas en lugar del documento de usuario. Y luego agregaremos un selecto donde usaremos la contraseña. Y luego haremos el filtro aquí y luego devolveremos al usuario con la contraseña. Ahora, desafortunadamente, la fuerza de selección aquí solo oculta la contraseña de los métodos de búsqueda. Entonces, o encuentra uno o encuentra por algo. Sí, pero no oculta la contraseña. Cuando guardamos al usuario aquí o guardamos nueva entidad. Por lo tanto, necesitamos crear una constante aquí dentro del método create. Cree una constante que mantenga al usuario del servicio, y luego cree otro método Find después de esto aquí. Y buscar al usuario con el ID. Sí, pero esto va a ser una pérdida de tiempo, especialmente cuando se trabaja con GraphQL. Porque con GraphQL, podemos ocultar contraseñas o cualquier cosa simplemente eliminando los campos aquí. Entonces, para la contraseña, podemos eliminar el campo de contraseña. Y luego dentro de la respuesta off, dentro del usuario, no obtendremos la contraseña. Así es como ocultamos las credenciales usando GraphQL. Pero aquí solo quería mostrarte cómo puedes obtener un campo de altura de la base de datos usando el Create Query Builder si no estás usando GraphQL. Entonces voy a dejar este código así solo para que recuerdes cómo conseguir un túnel alto, como la contraseña y la triste entidad de usuario, voy a eliminar el select false aquí porque no quiero cambiar o escribir el mismo código cada vez que quiera obtener la entidad. Y voy a añadir un nivel común dos. Para indicar que esto, puedes usar este enfoque solo cuando tengas un escondite. Entonces aquí, sólo si la entidad que Carlin y usted tiene el set select en false. Ahora guarda el servicio al usuario y cierra estos dos archivos y vuelve aquí. Y eso es una continuación muy rápida con el método de inicio de sesión. Entonces ahora necesitamos verificar si no teníamos o no obtuvimos la contraseña correcta, entonces devolveremos un error. Y aquí me falta el aire, corregir o ver y escuchar, lanzar nueva gráfica chica error. Y va a ser el mismo mensaje que credencial, credencial equivocada. Y la misma extensión. Entonces déjame copiar esto. Y aquí voy a copiar la extensión. Y luego tenemos que regenerar el token JWT y luego devolver al usuario con el JWT. Entonces voy a copiar esto y pegarlo aquí. Ahora el usuario va a ser devuelto con la contraseña. Pero debido a que cambiamos eso dentro del esquema, no volveremos o el engranaje gráfico no seleccionará la contraseña de la declaración return de las mutaciones aquí. Ahora, por supuesto, necesitas abrir tu terminal y ejecutar npm run degenerate porque actualizamos el esquema. Entonces hagámoslo. Npm ejecutar generar. Y eso es todo. Terminamos de trabajar en el método de inicio de sesión. 19. trabajar con el contexto de graphql: Ahora vamos a crear una consulta que devolverá el correo electrónico del usuario y el ID de usuario. Y nuevamente, vamos a partir del esquema. ¿GraphQL y crea crea una nueva consulta y la nombra usuario actual Y aquí vamos a devolver una carga útil JWT. Ahora tenemos que definir este tipo. Así que copia el nombre de JWT y aquí crea tipo, luego JWT, desvanece y citarlo. Tendremos el correo electrónico de tipo string, y tendremos el id de usuario de tipo int. Y ambos son requeridos. Ahora vamos a guardar esto, cerrar el esquema que GraphQL y tenemos que generar los tipos. Ejecute npm, ejecute, genere y cierre la terminal. Volver al autor resolutores. Y aquí dentro de la consulta, vamos a eliminar el método get de aquí. Y el método de usuario actual. Al escucharlo. Padre, necesitamos la entrada y los contextos. Bien, ahora tenemos un error aquí porque no agregamos una variable de entrada a la consulta de usuario actual, como si no asignáramos la mutación, así que no obtendremos un argumento de entrada aquí. Así que vamos a quitar esto y reemplazarlo con nuestro x así. Y sólo para dejar claro que no tenemos ningún argumento, voy a reemplazarlo por un objeto vacío. Bien, ahora aquí vamos a extraer la carga útil JWT del token JWT. Pero solíamos agregar esa lógica dentro un middleware y luego usar ese middleware dentro de otros routers. Y luego obtener un objeto de las solicitudes que contienen la carga útil del usuario. Pero eso es por supuesto dentro de una API RESTful. Pero como estamos usando Express con GraphQL, podemos hacer lo mismo. Podemos agregar. Podemos usar una Crear Imagen y luego usar el método 2s para aplicar el Medio Oeste aquí. Y luego obtendremos el, podemos extraer la carga útil JWT del token JWT. Pero podemos implementar el mismo proceso con el servidor Apollo agregando un contexto que contendrá la solicitud y las cargas útiles JWT. Entonces aquí, digamos el servidor Apollo en un contexto. Y va a ser una función que devolverá un objeto. Ahora, antes de empezar a trabajar en esta función, tenemos que añadir una nueva interfaz y nombrarle contextos. Entonces aquí, interfaz de exportación, luego mi contexto. Tenemos que ampliar los contenidos Express para que podamos acceder a la solicitud. Y aquí agregaremos nuestras propiedades personalizadas. Pero primero, tenemos que importar los contextos Express desde el servidor Apollo. Así que aquí, Airport Express contexto a partir de una foto Server Express. Ahora aquí, esa es nuestra primera propiedad personalizada, que es el usuario actual. Y va a ser de tipo T, W T de carga útil. Y la carga útil DWT se importa de los tipos incinerados. Así que asegúrate de importar eso de esta ruta aquí. Entonces tenemos que agregar otra propiedad, que es la propiedad autorizada. Y con esta propiedad, podemos verificar si tenemos un usuario autorizado o no. Por lo que esta propiedad va a ser de tipo booleano. Y guarda esto. Regresa aquí. Y necesitamos agregar la interfaz de contextos mike con el servidor Apollo. Así que voy a devolver servidor Apollo con mis contextos de tipo, mis contextos. Bien, Ahora, vuelve dentro de este método aquí. Y ahora podemos extraer. De la disfunción, extraer la solicitud y la respuesta porque ampliamos los contextos Express. Y aquí, vamos a crear una constante y nombrarla carga útil, y luego usar los paquetes DWT de DWT, tenemos que importar eso. Entonces hagámoslo. Importante, JWT de Jason token aquí atrás, CWT punto verificar para verificar el token. Y vamos a obtener el token esta vez, no de la sesión, sino de los encabezados. Entonces usaremos la carga útil de la solicitud o las ataduras. Asegúrese de seleccionar encabezados, sin ataduras. Y luego vamos a obtener el token del encabezado de autorización. Sí. Entonces los Heather pueden ser no. Entonces agreguemos ahí un signo de interrogación. Y ahora tenemos que pasar la clave secreta JWT. Entonces puedo obtener eso del proceso que la clave DWT y agregar un signo de exclamación. Entonces podemos decirle a TypeScript que esto no es nulo. Y ahora tenemos que devolver esa carga útil aquí. Así que tenga un pedido aquí, porque parece que la solicitud también es puede ser nueva o indefinida. Entonces agreguemos un signo de interrogación ahí. O solo vamos a verificar si no teníamos no recibí una solicitud. Sí, vamos a devolver un objeto y volveremos aquí en sólo un segundo. Ahora definamos la propiedad de usuario actual y le demos la carga útil. Y luego también enviaremos vuelta o pasaremos la solicitud a los resolutores. Y luego vamos a la propiedad autorizada, y la propiedad autorizada es una booleana. Por lo que comprobaremos si tienes una carga útil o no. Entonces, si no tenías un pago significa que el usuario no está autorizado. Entonces para eso voy a usar una sintaxis especial. Entonces nuestros dos signos de exclamación y luego Abby pagaron. Entonces, si la carga útil es nula o indefinida, el primer signo de exclamación va a devolver true. Entonces el segundo signo de exclamación va a devolver lo contrario de verdadero, que es falso. Y luego autorizaron, se va a establecer en false significa que el usuario no está autorizado porque tenemos un nulo, un piloto. Ahora bien, si no teníamos una solicitud, lo cual es un problema para nosotros porque no podemos extraer el token JWT. Entonces vamos a enviar un sobre el mismo objeto pero con el selector coreano establecido en null y la solicitud, por supuesto, y el autorizado a false. Tenemos que devolverle esto. Bien, ahora, quitemos los signos de interrogación de aquí. Y en realidad aquí tenemos que verificar si no obtuvimos o no teníamos un encabezado de solicitud de autorización aquí, entonces simplemente devolveremos este objeto. De lo contrario, extraeremos la carga útil y enviaremos la propiedad requerida. Ahora déjame ajustar un poco este código para hacer esto y guardar este archivo. Después ciérrala y vuelve al usuario coreano resolvedor o consulta aquí. Y vamos a comprobar si la propiedad autorizada dentro del contexto. Verdadero o falso. Sí. Entonces si la propiedad autorizada así que aquí lo autorizó. Y no estamos obteniendo lo autorizado del contexto. Eso es porque aquí tenemos que actualizar la cadena de códigos. Sí, y actualizar los tipos de resultados. Entonces necesitamos especificar el tipo de contexto y decirlo bajo la configuración aquí. Y en el mismo nivel de sangría, contextos, tipo, o contextos, tipos por tipo, y especificamos la ruta o el archivo que contiene nuestro contexto. En nuestro caso, son mis contextos existen dentro del archivo del módulo. Así que asegúrate primero de exportar la interfaz de contextos mike y ven aquí y agrega el nacimiento de acuerdo a estas carpetas generadas. Entonces según la carpeta generada, el módulo o según el tipo de resolución que es existir lado la carpeta generada. El archivo del módulo es un nivel hacia fuera, luego el módulo. Y tenemos que seleccionar la interfaz. Entonces vamos a agregar un hashtag aquí y agregar el nombre de los contextos. Entonces mis contextos. Y en este caso, estamos seleccionando a, a, una interfaz o variable exportada del archivo usando una sintaxis YAML. Ahora vamos a cerrar el archivo de configuración co-gen y abrir el terminal. Entonces aquí tenemos que ejecutar los comandos del generador. Entonces npm run generar, y luego obtendremos nuestro contexto de tipo, mi contexto. Sí. Entonces esperemos. Ahora mismo. Si pasas el cursor sobre contextos, deberías tener el tipo de contextos de bicicleta aquí. Ahora déjame cerrar la terminal y autorizado es de tipo Booleano. Entonces vamos a comprobar si el usuario no está autorizado, entonces vamos a devolver un error no autorizado. Entonces Garganta sabía GraphQL y MS no está autorizada. Y necesitamos agregar una extensión. Prórroga. A continuación, agrega el código. Y aquí agregaremos el código. No autorizado. ¿Bien? Ahora si tenemos un autorizar a ese usuario o vamos a regresar del contexto, el usuario actual. Ahora vamos a ahorrar. El usuario actual es de tipo G adjunto carga útil contener el correo electrónico y el ID de usuario. El nombre del tipo es simplemente algo relacionado con GraphQL. Pero dentro del esquema GraphQL o una respuesta, solo vamos a obtener el correo electrónico y el ID de usuario. Bien, ahora vamos a guardar esto. Y para poder probar aquí todos estos resolutores, tenemos que tener una base de datos que funcione. Entonces en los próximos videos, vamos a aprender a usar Joker, claro, cómo instalar Docker y luego usar Docker para instalar la base de datos Postgres y ejecutarla en nuestro sistema local. 20. ¿qué es Docker: Docker construye un sistema Linux en ejecución en pequeños contenedores, que es su propio pequeño mundo con sus propios programas y su propio todo, todo aislado de cualquier otra cosa. Estos contenedores están diseñados para ser portátiles para que puedan ser desplazados de un lugar a otro. Y Docker hace el trabajo de llevar estos contenedores hacia y desde sus sistemas. Ahora bien, ¿qué es el contenedor? Ya sabes, cuando construyes algo con, por ejemplo un OTS y luego empujas tu código en GitHub y alguien más intenta tirar y ejecutar tu código dentro de su sistema local, pero no funcionó para él. Y entonces pensará que tu código es basura. Y también puedes pensar que no eres un buen desarrollador. Pero a veces ese no es el caso porque tus aplicaciones Node.JS requieren de un software muy específico y un entorno único para funcionar. Y estos requisitos solo existen dentro de su sistema local, donde se encuentre, donde desarrolló su aplicación Node.JS. Como si tienes Linux y en vez de Windows o tienes una versión anterior de nodos, sí, todas estas variables no pueden ser iguales en todos los sistemas. Por lo tanto, Docker ha introducido algo llamado contenedor. Un contenedor es una unidad estandarizada de software que permite a los desarrolladores acceder fácilmente desde su entorno. Para que pueda desarrollar, por ejemplo su aplicación Node.JS y construir un contenedor a su alrededor y empujarlo a Docker Hub como una imagen. Y entonces cualquiera puede sacar esa imagen y ejecutarla en su propio sistema local. En ese caso, tu app NodeJS se ejecutará en el mismo entorno que en tu sistema local. 21. Instalar docker Linux: Ahora para iniciar Docker en tu ventana o en el sistema Linux en general, tienes que pasar por unos pasos. Así que dirígete sobre etiquetas más oscuras. Y puedes usar esta ruta aquí o esta URL. Y o tal vez puedas buscar en Google para instalar el motor Docker en tu pinto porque URL's se pueden cambiar en el futuro. Ahora, lo primero que tienes que hacer aquí es asegurarte de no tener ninguna versión anterior de Docker. Al ejecutar este comando aquí, puede eliminar todas las versiones desactualizadas. Ahora, el siguiente paso es que tienes que actualizar tus paquetes APT. Y luego voy a empezar con unos pocos mendigos y ver si eso va a ser usado en los siguientes pasos. Sí, entonces tienes que ejecutar estos comandos para decirle a tu sistema que está bien usarlo. El software es del Docker Engine. Y luego tienes que ejecutar este comando para configurar tu repositorio. Y la razón por la que tenemos que sumar nuestro repositorio o configurar un repositorio que esté conectado al Docker Engine es porque vamos a sacar imágenes de Docker Hub. Y a veces tenemos que empujar las imágenes hechas por nosotros al Docker Hub. Entonces necesitamos aeropuertos era así. Es similar a los repositorios con GitHub. Sí. Ahora el siguiente paso es instalar el Docker Engine. Después de establecer su repositorio. Por supuesto, tienes que actualizar tus paquetes de nuevo. Y si tienes algún error, ejecuta estos comandos. Y luego finalmente, puedes instalar Docker ejecutando este comando. Después de eso, si quieres verificar si has instalado Docker correctamente, puedes ejecutar una imagen que existía por defecto con Docker llamada kilovatio. Así que ejecuta este comando, sudo docker ejecuta hello-world, y deberías recuperar una cadena con HelloWorld. 22. Imágenes a contenedores: Ahora que tenemos instalado Docker y hablamos un poco sobre lo que es Docker, intentemos usarlo. Entonces con Docker, todo comienza con una imagen. Una imagen es cada archivo que compone lo suficiente del sistema operativo para hacer lo que necesitas hacer. Ahora, el comando para buscar en tus imágenes de Docker son simplemente imágenes de Docker. Se puede ver aquí que tengo muchas imágenes y cosas pasando aquí porque solía ocurrir todo el tiempo. Y para ti, es posible que tengas algunas imágenes como las que has estado en o HelloWorld. Ahora es imagen tiene un nombre y una versión, moto más reciente o algo así. Y también su imagen tiene una identificación. Y aquí podemos encontrar cuándo se ha creado esta imagen. Y aquí se puede ver el tamaño de esa imagen. Ahora, tomemos una imagen y luego ejecutemos dentro del contenedor usando Docker. Déjame despejar esta terminal y luego ejecutar docker derecho. Ejecutar comando. Ahora, este comando toma una imagen y la convierte en un contenedor vivo corriendo con un proceso en él que está haciendo algo. Ahora, después de docker run, voy a especificar la imagen que quieren usar. Y para mi, voy a usar quien ha estado en. Y para ti, si no te encontraste has estado a instalado por defecto en tu comodín. No te preocupes porque al ejecutar este comando, Docker intentará sacar al humano a imagen con la última versión del Docker Hub. Entonces, claro, hay que tener una conexión a Internet para hacer eso. Ahora, todavía no terminé de este comando de aquí. Así que Docker corre, has estado en. Y luego dijimos que vamos a ejecutar un proceso en esta imagen. Así que vamos a ejecutar el shell bash porque quiero ejecutar algunos comandos dentro de los que has estado con la terminal. Y también para eso, necesitamos una bandera para interactuar con la terminal. Y la bandera es la bandera D. Entonces D significa terminal y yo significa interactivo, terminal y directivo. Entonces has estado en bash. Y ahora vamos a ejecutar este esquema por ti. Si no has estado en, verás un proceso de descarga. Bien, estamos dentro de la imagen de Ubunto. Ahora bien, si le echo un vistazo aquí, encontraré que estamos dentro del tenemos el, has estado en medio ambiente. Y sólo para asegurarse de que va a ejecutar este comando para echar un vistazo a este archivo LSB dash release. Y deberíamos obtener la versión de la que vas a tener aquí, la versión 20 y el ID de distribución. Vas a ahora a tu salida esta imagen. Puedes escribir exit así o Control D hace para exit. Ahora, para poder ver la última imagen que salió, podemos abrir una nueva terminal aquí y docker ps y luego dash latest. Entonces, si corres solo ps, lo encontrarás, obtendrás todas las imágenes de running. Y con L, podrás obtener la última imagen salida. Si ejecutas este comando, encontrarás que la imagen es, has estado en. Y encontrarás el comando aquí que estaba ejecutando sitio esta imagen. Y claro, ¿dónde lo crea? Y salió en hace aproximadamente 4 min. Sí. Y este no es el nombre de ese contenedor, no la imagen. Entonces este contenedor está corriendo lo urbano a la imagen y manejando la tierra de canasta. Sí. Y fue creado hace 6 min y salió hace 4 min. Y esta es la idea del contenedor. Y dijeron el nombre del contenedor. Y por cierto, este nombre es generado aleatoriamente por Docker. Ahora volvamos aquí y ejecutemos el, has estado en imagen de nuevo con el caparazón bash. Y dentro de eso has estado a la imagen. Vamos a crear un nuevo archivo con el comando touch y ponerle el nombre a mi archivo. Y echa un vistazo aquí y encontraremos mi archivo. Entonces salgamos de esto. O dejo saltar este contenedor corriendo y volver aquí y luego ejecutar el mismo comando, docker, ejecutar TI para terminal interactivo. Y entonces has estado y ejecutas el cascarón de bash. Entonces estamos ejecutando la misma imagen con la misma bandera en el mismo proceso. Y aquí, si echamos un vistazo, no encontraremos el archivo que se creó aquí. Por lo que su contenedor ejecuta una imagen y no se ve afectado por otros contenedores que están ejecutando la misma imagen. Entonces, cuando creamos un archivo aquí, no significa que vamos a obtener el mismo archivo dentro este contenedor que ejecuta la misma imagen. Por lo que su contenedor está aislado del otro. A pesar de que ambos ejecutan la misma imagen, puedes pensar en ellos como dos computadoras que ejecutan la misma versión en la que has estado. 23. contenedores a imágenes: Ahora podemos ver que pasamos de una imagen a un contenedor en funcionamiento. Y cuando arrancamos un contenedor, el contenedor sigue ahí. No se borró. Así puedo ver el contenedor más recientemente salido con un comando docker ps. Pero claro, necesitamos la bandera dash l para obtener el último contenedor parado. Entonces aquí se puede ver que tengo un contenedor que estaba funcionando hace apenas un momento. Y puedes ver toda la información sobre este contenedor aquí. Ahora, digamos que tengo un contenedor parado. Empecé a partir de una imagen base. Ion comenzó mi propio software. Tengo un contenedor que tiene mi software instalado en él. Ahora, quiero usar el mismo contenedor que tenga mis propios softwares en él en el futuro, o tal vez compartirlo con la comunidad. Entonces para hacer eso, tenemos que usar el comando docker commit que toma contenedores y hace imágenes de ellos. Entonces, para usar el commit de docker, primero vamos a crear un nuevo contenedor. Vamos a aclarar esto. Y uno. Has estado en, por supuesto con la bandera TI y luego has estado y ejecutas el comando batch. Ahora dentro de este contenedor, vamos a crear un archivo, y necesitamos usar ese archivo en el futuro con este contenedor. Así que vamos a crear una imagen a partir de este contenedor aquí que está usando el comando touch y crear archivo y nombrarlo como secretos. Tenemos nuestro archivo aquí. Vamos a salir de este contenedor con Control D o simplemente escribir salida. Y luego tomemos la idea de este contenedor ejecutando docker ps dash L. Entonces tenemos aquí la idea de este contenedor. Entonces copiemos este id Y luego usemos el comando docker commit y peguemos aquí el más oscuro o el ID del contenedor, luego ejecutemos el comando docker commit. Ahora, sacaríamos una imagen de este contenedor. Y esta es la idea de esa imagen. Pero usar un ID largo como este, no es algo bueno porque puedes perder este id o tal vez te resulte difícil ejecutar comandos usando esta cadena larga. Entonces lo que voy a hacer a continuación es ir a etiquetar esta imagen con un nombre legible por humanos. Y para hacer eso, no usamos la bandera de etiqueta. Después agregamos el ID de esta imagen desde los dos puntos hasta el final de esta cadena y la pegamos aquí. Y luego elige un nombre para esta imagen. Entonces imagina lo que por ejemplo y ejecuta el comando Docker. Y ahora si queremos comprobar si tienes una imagen con el guión de imagen o subrayado un nombre, puedes ejecutar imágenes de Docker y luego buscar el nombre de la imagen aquí. La puedes encontrar aquí. Entonces tenemos imagen subrayado uno, y aquí tenemos el ID. Y fue creado para hace minutos. Entonces así es como podemos crear imágenes a partir de contenedores. Ahora, hay otra forma de cometer imágenes en lugar de usar el comando commit. Y es perspicacia. Y eso es por, antes que nada, vamos a crear un contenedor Docker y tomar la idea de ese contenedor. Entonces vamos a usar el commit de docker de otra manera. Así que aquí vamos a crear un archivo como mi archivo. Y volvamos a salir. Y luego vamos a revisar o a hacernos la idea de este contenedor Docker. Y ahora podemos tomar el nombre del contenedor. Aquí, un nombre legible por humanos, y cópielo y luego ejecute docker, commit, luego el nombre del contenedor, y luego el nombre de la nueva imagen que desea crear. Y esta vez voy a elegir la imagen dos. Ahora estamos ejecutando este comando. Obtendríamos la misma salida de antes. Pero si ejecutas imágenes de Docker ahora, puedes encontrar una imagen para presentarla en nuestro repositorio local de Docker. 24. ejecuta la base de datos de postgres con docker: Ahora vamos a conocer más sobre docker, y al mismo tiempo vamos a ejecutar nuestra base de datos Postgres. Y para eso, necesitamos sacar la imagen postgres SQL de Docker. Para ello, tenemos que correr Docker, jalar. Entonces el nombre de la imagen que es Postgres. Puedes agregar dos puntos y luego la última etiqueta. Pero por defecto, bueno, instala la última versión. Ahora no voy a ejecutar este comando porque ya tengo esta imagen en mi sistema local. Entonces ahora voy a usar el comando docker run para ejecutar la imagen postgres. Por supuesto, con la bandera DI aquí y la imagen postgres. Ahora, no vamos a ejecutar este comando. Toma esto porque tenemos que agregar algunas configuraciones. Y esta vez quiero agregar un nombre personalizado para mi contenedor. Y para eso tenemos que usar el escritorio llamado flag y luego elegir un nombre como arriba. Subrayar. Ambos estrés. Ahora, para establecer una conexión a la base de datos Postgres, tenemos que exponer un puerto y Postgres utiliza de forma nativa el puerto 5432 para aceptar conexiones. Entonces tenemos que exponer este puerto desde el contenedor usando el indicador dash P. Y ahora tenemos que mapear este puerto Postgres con un puerto del contenedor. Y voy a elegir un 545 5 v y agregar dos puntos aquí. Ahora, probablemente no entendiste de lo que estoy hablando aquí. Por eso preparé aquí un diagrama para simplificar la idea de exponer publicaciones. Así que aquí tenemos el Postgres, postgres app container o outputs glass container. Entonces déjame cambiar el nombre aquí en Postgres. Y este contenedor tiene una imagen corriendo dentro de él. Entonces esta imagen es la imagen postgres. Y Postgres utiliza de forma nativa el puerto 5432. Pero no podemos conectar una app a la esta a la imagen Postgres desde el puerto 5432. Cuando ejecutamos esta imagen desde el contenedor. Porque como saben, los contenedores están aislados unos de otros y del sistema local. Por lo que este enfoque no va a funcionar. Por lo tanto tenemos que usar otra forma, que es exponer otra placa del contenedor y mapear este puerto al puerto Postgres o a la imagen que se está ejecutando dentro de este contenedor. Y luego para poder conectarnos a la base de datos Postgres, tenemos que conectarnos al host local colon 5455. Entonces tenemos que conectarnos al contenedor, no a la imagen misma. Ahora, si tienes más de uno de, por supuesto puedes conectarlos al mismo contenedor que está ejecutando la imagen postgres. Porque aquí estamos usando localhost. Pero claro que no se recomienda usar la misma base de datos con otras aplicaciones porque puedes perder datos y destruir tus tablas de base de datos, como por ejemplo si App one está registrando un usuario en la base de datos con un correo electrónico a, entonces al mismo tiempo tenemos la app también, registrando también a un usuario con el mismo correo electrónico. Ese caso, tendrás en lugar de tu base de datos a usuarios con el mismo correo electrónico, pesar de que tengas validaciones ejecutándose en tus aplicaciones, no impide que tal error a B ocurriera. Entonces lo que tienes que hacer es crear otro contenedor con la misma imagen. Pero esta vez hay que nombrar a ese contenedor con otro nombre y luego usar también otro puerto aquí. Pero claro que guardarás el mismo puerto para la imagen postgres. Entonces aquí cambió el nombre a, hasta y aquí el icono de Postgres. Entonces tenemos la imagen de Postgres aquí y hay que cambiar este puerto. De lo contrario, no puede conectarse al contenedor, o incluso no puede construir este contenedor porque está usando el mismo puerto en otro contenedor aquí. Así que lo voy a cambiar a 5456. Y luego déjame quitar esto. El outdo se va a conectar a esta dirección, a este contenedor. Y así es como puedes tener, como si estás construyendo un microservicios, este es el enfoque correcto para conectarte a la base de datos. Entonces es app tiene que tener sus propios contenedores que ejecuten la base de datos. Ahora bien, no sé por qué me estoy desplazando hacia arriba y hacia abajo una y otra vez así, pero vamos a ignorar eso y volvamos aquí dentro nuestra terminal y terminemos el contenedor postgres de la aplicación. Entonces tenemos nuestras publicaciones aquí. Ahora. Tenemos que definir algunas variables de entorno. Y se requiere para ejecutar Postgres o para conectarse a Postgres. Ahora bien, estas variables de entorno se definen también aquí. Entonces tenemos que definir la misma información como el nombre de usuario, contraseña, el puerto, y cambiamos el puerto 25455. Ahora cambiemos esto aquí. Y la primavera, la terminal aquí, y tratar de copiar la misma información. Ahora, para agregar a, una variable de entorno, tenemos que usar el indicador dado e y luego nombrar la primera variable. Y la primera variable es la Truss Post. Y debería estar todo en mayúsculas. Ahora, Postgres subrayan usuario. Debe ser lo mismo que el nombre de usuario aquí. Entonces va a ser igual a admin. Y para definir otra variable de entorno, tenemos que volver a usar la bandera dash g, y luego escribir la contraseña de Postgres. Nuevamente, todo mayúscula. Y entonces la contraseña es la misma contraseña dentro de la fuente de datos de la aplicación. Entonces la contraseña es admin, y la última variable de entorno es el nombre de la base de datos. Entonces otra vez, canalla, luego Postgres. Así que lo más burdo. Después subrayado db para base de datos. Y el nombre de la base de datos DB es principal. En minúsculas. Debe ser el mismo nombre que se presenta aquí. Por supuesto, el nombre de host es host local porque este contenedor se va a ejecutar dentro de nuestro sistema local. Ahora, ejecutemos este contenedor y esperemos el resultado. Aquí vamos. Tenemos algunos inicios de sesión aquí. Y estos, estos datos están relacionados con Postgres. Entonces estamos iniciando una nueva conexión a la base de datos. Y aquí vamos, tenemos sistema de base de datos está listo para aceptar conexiones. 25. Prueba Graphql endpoint: Ahora, para que nuestra aplicación conecte a la base de datos de Postgres, necesitamos iniciar la fuente de datos de la aplicación dentro de module.js fall. Así que lado aquí, primero vamos a importar la fuente de datos de la aplicación. Fuente de datos. De una fuente de datos. Y dentro de estos arranca Apolo, y desde el principio, tenemos que esperar a que la fuente de datos se inicialice. Ahora el método initialize se va a conectar a la base de datos Postgres y tomar todas nuestras entidades y guardarlas como tablas de base de datos. Y ahora antes de probar la API, necesitamos arreglar algo y estudiar el contexto aquí. Entonces, si tenemos un token JWT válido, verifican que el método va a fallar. Y cuando falle, no podremos conectarnos al endpoint GraphQL. Y no podremos usar resolvers que no requieran autenticación porque el método va a lanzar un error y romperá toda nuestra aplicación. Entonces lo que voy a hacer es que voy a poner el método verificado dentro de un bloque try catch. Y de esa manera, podemos evitar que los errores provenientes del método verify sean arrojados al exterior del método context aquí. Entonces lo primero que voy a hacer es crear una variable lead aquí. Luego quita la constante de aquí, y luego copia todo esto o gato o esto, y crea el bloque try catch, catch. Así que aquí, intenta atrapar el error. Entonces lado aquí, básicamente carga útil con el método verify. Y si fallamos aquí, vamos a coger el error dentro del bloque catch. Pero no vamos a tirar el error aquí porque en ese caso, vamos a hacer lo mismo que ellos verifican método estaba haciendo. Entonces aquí voy a establecer la carga útil para que sea no. Ahora bien, si no obtuvimos el token de autorización, verifican que el método va a fallar y la carga útil se va a establecer en No, Sí. Y la propiedad autorizada va a establecer en false. Entonces no necesitamos la declaración if aquí. Y cuando no tenemos el token de autorización, vamos a pasar una cadena vacía y el método verify va a fallar de todos modos. Ahora bien, la razón por la que estamos haciendo esto y estábamos usando la sentencia if aquí, es porque verifican método solo acepta cadenas como token, no acepta tipos indefinidos o nulos aquí. Entonces, si no tuviste teorización, vamos a pasar una cadena. Ahora bien, de esta manera, podemos llegar a nuestros resolutores aunque no obtuvimos una ficha. Ahora vamos a guardar esto y abrir la terminal. Y finalmente, probemos nuestro punto final GraphQL. Entonces aquí déjame expandir esto y ejecutar npm, run, start. Y antes de ejecutar este comando, tenemos que cambiar algo en lugar de mendigos archivo adyacente. Entonces usamos el nodo dash, dash swatch aquí, pero este comando no vigila los cambios dentro de los archivos TypeScript. Y tenemos que agregar el reloj de bandera así. Pero en este caso, tenemos que añadir sólo uno y psi. Porque si usamos dos y signos aquí, esperaremos a que se ejecute este comando y termine de ejecutarse, y luego ejecutaremos el comando node. Pero el modo reloj aquí no termina, no, no tiene n. Si, por eso lo nombramos modo reloj, Si. Y en ese caso, no vamos a ejecutar este comando. Entonces tenemos que quitar esto y usar solo uno y seno. En ese caso, ejecutaremos estos dos comandos al mismo tiempo. Pero esto es muy peligroso porque imagina si no tuviéramos aquí la carpeta dist, y ejecutamos el comando node, node. Y en ese caso, denotar comando se romperá, pero el comando compile que se ejecutará. Y vigilará los cambios en firmar los archivos ts. Pero cuando el comando DOS genera la carpeta dist. Encontraremos que el comando node no funciona y no vigila los cambios, por lo que no lo sabrá. Ahora tenemos esta carpeta y en ese caso, nuestra aplicación se va a quedar atascada en la etapa de compilación. Sí. Entonces el punto que estoy haciendo aquí es que no podemos usar el comando dash, dash watch aquí. Y tenemos que volver a usar node man dentro de este proyecto. Así que asegúrate de instalar Node man nuevamente en las dependencias de dev. Entonces úsalo aquí con el comando node sin la palabra fumado. Entonces, eliminemos eso, luego tome este comando y póngalo aquí. Entonces eliminemos esto y usemos el nodo uno. Y con la bandera e y luego ts, luego se alistan exactos. Entonces vamos a ejecutar el comando, el comando compile. Aquí, npm, buy-in, compile, guarde esto. Y vamos a tratar de iniciar nuestra app. Derecha. Ahora. No obtuvimos ningún error relacionado con una base de datos, significa que iniciamos con éxito una conexión a la base de datos Postgres. Ahora, sigamos adelante y el polvo son GraphQL endpoint lado el sandbox Apollo, tenemos aquí un icono verde significa que nos conectamos con éxito a nuestro punto final GraphQL. Ahora, intentemos inscribir aquí a un usuario con las mismas credenciales un usuario con las mismas credenciales y comprobemos si podemos guardar usuarios en la base de datos. Así que vamos a ejecutar estas consultas de registro aquí. Y si no lo haces, si no tuviste esto de los videos anteriores, puedes simplemente volver a la raíz aquí y hacer clic en mutación, luego elegir el registro. En realidad, voy a volver a generar la consulta por si acaso. Entonces agreguemos la consulta de registro o una mutación. Y los dos campos, el usuario. Y aquí solo esperaremos el ID para asegurarnos de que guardamos con éxito usuario dentro de la base de datos. Ahora, vamos a utilizar las mismas entradas aquí. Y a partir de la mutación de registro. Bien, tenemos aquí el token JWT, y lo más importante, tenemos el ID establecido en uno. Entonces, si registramos a un nuevo usuario, tenemos que conseguirlo. Tenemos que hacernos una idea de dos. Entonces cambiemos el correo electrónico aquí al usuario dos y al FirstName user2, y luego volvamos a ejecutar el registro. Y esperemos la respuesta. Tienes que conseguir la identificación dos. Y él iría. Ahora, estamos seguros de que estamos guardando usuarios y en la base de datos y también estamos obteniendo resultados de la base de datos. Ahora vamos a probar el selector coreano resoluble porque la mutación sine n es, tiene la misma lógica que el Sign-up. Sí, así que vamos a probar al usuario coreano. Y para eso necesitamos enviar un encabezado de Autorización. Entonces copiemos el token JWT. Y aquí vamos a dar clic en el icono de Configuración y añadir los encabezados de autorización. Entonces aquí en la teorización, puedes empezar a escribir autorización y obtendrías alguna sugerencia aquí. Elija autorización y pegue el token. Sí, se asegura de que tengas la galleta puesta en marcha. De lo contrario, no podemos conectarnos a nuestro punto final GraphQL. Ahora vamos a guardar esto. Y vamos a ejecutar la consulta de usuario de gradiente. Así que vuelve a la raíz aquí. Eliminemos todo esto y hagamos clic en query, luego agreguemos la consulta de usuario actual. Y esperemos el correo electrónico y el ID de usuario para que no necesitemos la entrada. Así que vamos a ejecutar la consulta de usuario actual. Y deberíamos recibir el correo electrónico y la identificación. Aquí vamos. Conseguimos que el usuario, porque usamos el token JWT cuando nos registramos como user2. Ahora podemos obtener el correo electrónico y el ID de usuario. Significa que nuestro contexto está funcionando y podemos extraer nuestra carga útil del token. Ahora, en el siguiente video, vamos a crear una imagen a partir de este contenedor. 26. desde postgres a imagen: Ahora vamos a crear una imagen que ejecute este contenedor para nosotros. Entonces salgamos de este contenedor. Y luego despejemos la terminal. Y usemos el comando docker commit para crear una nueva imagen desde el contenedor postgres de la aplicación y nombrar esta base de datos de mensajes de imagen y ejecutar este comando. Y ahora intentemos ejecutar esta imagen donde Docker corre que TI para dirección de terminal. Y luego mencioné el nombre de la imagen. Y antes de ejecutar este comando, tenemos que exponer también un puerto aquí, porque al ejecutar una imagen usando Docker run, vamos a crear un contenedor y el mensaje, nuestra imagen de base de datos se va a ejecutar dentro de ese contenedor. Así que vamos a exponer los mismos puertos que expusimos dentro del contenedor postgres de la app usando el indicador desk P en el puerto 5455 y luego dos puntos, luego el puerto de la base de datos Postgres 5432. Ahora bien, probablemente no entendiste por qué estamos usando los mismos puertos aquí. Y eso es porque estás pensando que cuando ejecutemos la imagen NSG add DB, realidad vamos a ejecutar el contenedor postgres de la aplicación. Sí, pero ese no es el caso porque cuando ejecutemos esta imagen, no vamos a ejecutar el contenedor postgres de la app, sino que vamos a ejecutar la imagen postgres con todas las variables de entorno y todas las configuraciones. Por lo que el contenedor postgres de la aplicación no tiene nada que ver con la imagen MSG AB DB. Y ahora cuando ejecutemos este comando, vamos a obtener un contenedor que ejecutará la imagen postgres también con todas las variables de entorno y las configuraciones. Entonces espero que ahora puedan entender por qué tenemos que volver a exponer los mismos puertos. Ahora cada vez que ejecutemos este comando, vamos a obtener un contenedor generado aleatoriamente. Porque cuando salimos de un contenedor, el contenedor no se elimina. Pero eso no queremos. Queremos que cada vez que terminemos de usar un contenedor, ese contenedor tiene que ser donado. Y podemos hacerlo automáticamente agregando una nueva bandera al comando rand, que es el comando RM. Y ahora podemos ejecutar este comando. Y cuando terminemos de trabajar con el contenedor, significa que cuando salimos del contenedor, el contenedor se elimina y no vamos a obtener un montón de contenedores generados aleatoriamente dentro de nuestro repositorio Docker. Entonces ahora ejecutemos este comando y esperemos a que se establezca la conexión a la base de datos. Bien, tenemos nuestra base de datos funcionando. Volvamos a nuestro proyecto y a la terminal. Vamos a ejecutar npm. Corre, empieza. Asegúrate de que aún tienes las balas 5455 aquí. Ejecutemos el comando. Podemos ver que no obtuvimos ningún error en la base de datos. Ahora tengo aquí una doble diagonal para el punto final de GraphQL, y eso es porque no cambió eso aquí y decir el archivo main.js. Entonces voy a hacer eso ahora y guardar el archivo main.js. Espera la recarga, y luego tienes que obtener el año correcto. Ahora, navega a esta URL. Y dentro del sandbox de Apollo, esa es la API. Así que puedes ver aquí estaba probando la validación para el repositorio de registro. Entonces, si nos registramos con el mismo correo electrónico, vamos a recibir un mensaje de error de solicitud incorrecta diciendo que el usuario ya existe. Entonces sabemos que esa parte del solucionador de registro está funcionando. Ahora, vamos a inscribirnos como de costumbre. Y aquí, FirstName user1 y ejecutar registrarse. Y deberíamos conseguir un usuario con un ID establecido en uno. ¿Correcto? Tenemos el ID y tenemos el token JWT. 27. Definición de la sala de esquema: Ahora es el momento de comenzar a trabajar en el servicio de habitaciones. Y como antes, vamos a comenzar en el esquema que grafica el archivo DO. Pero no voy a escribir el esquema GraphQL del room service dentro del gráfico esquemático Gail fail porque es, sabes, siempre es una buena práctica dividir archivos en trozos pequeños, sobre todo si tienes un archivo grande. Entonces eso es lo que vamos a hacer aquí. Empecemos por crear una nueva carpeta dentro de la carpeta de origen y ponerle un nombre. Booms. Y entonces aquí vamos a tener las habitaciones o habitación que GraphQL. Y entonces aquí vamos a escribir nuestro esquema GraphQL que está relacionado con el servicio de habitaciones. Y luego vamos a hacer lo mismo por el servicio fuera de servicio. Y aprenderemos los, los, los archivos DO gruff y luego agregaremos todo eso automáticamente, automáticamente dentro del esquema gráfico de puntos TO archivo. Entonces aquí, comencemos, comencemos definiendo el tipo de habitación. Así que vamos a crear tipo y nombrarlo. Habitación. Y ROM va a contener, por supuesto, un id de tipo int y es requerido y una matriz de usuarios. Entonces tenemos que usar el tipo de usuario. Y como puedes ver aquí, no tengo un error porque ya usamos el tipo de usuario o declaramos que estos son tipo aquí. Y como dije antes, vamos a fusionar los dos archivos, el gráfico Tierra Gill y su propio GraphQL dentro del esquema, ese archivo GraphQL. Entonces tendremos acceso al tipo de usuario. Entonces aquí definamos la habitación con el usuario y los mensajes. Entonces los mensajes, va a ser una matriz de objeto de mensaje. Y tenemos que definir esto arriba. Aquí. Declarar otro tipo, nombra mensaje. Y su mensaje va a tener un campo de formulario. Y es el ID del usuario. Para que podamos saber quién envió el mensaje y el contenido de los mensajes. Y éste es de tipo string. Ahora, para poder mandar un mensaje, necesitamos el mensaje mismo. Significa el contenido. Y también necesitamos el bromuro D y luego guardar ese mensaje dentro de la habitación. El mensaje, el mensaje es array. Entonces todos los usuarios dentro de la matriz del usuario van a tener acceso a este mensaje. Entonces si tenemos aquí dos usuarios, Usuario a y el Usuario B, el mensaje del usuario a va a ser recibido al usuario B. Y claro, ambos usuarios, va a tener acceso al mismo mensaje. Así que vamos a crear una entrada aquí, tipo de entrada y nombrarlo, enviar entrada de mensaje. Y necesitamos el mensaje de tipo string, y necesitamos el ID de habitación de tipo int. Ahora vamos a crear la mutación que aceptará esta entrada. Entonces aquí tipo mutación, la primera mutación es la mutación del mensaje arena. Y aquí, así lo está MSE, significa Mensaje. Y aquí aceptaremos un insumo. Puedes nombrar esta variable como quieras. Me gusta ponerle nombre entrada. Entonces aquí, esta entrada es de tipo entrada de mensaje enviado. Y vamos a devolver la regla. Ahora, vamos a guardar esto. Por supuesto que no terminamos, pero quiero crear el archivo DO ortográfico aquí. Sí, así que vamos a crear un nuevo archivo dentro la carpeta y ponerle el nombre earth dot GraphQL. Y aquí vamos a copiar todo esto dentro del esquema GraphQL y asegurarnos de cortarlo. Y luego guarda este archivo y vuelve al autógrafo Gill y pega todo esto aquí. Ahora bien, no deberíamos agregar el esquema aquí porque esto romperá nuestro punto final GraphQL porque vamos a definir esto dentro del archivo de punto de esquema GraphQL automáticamente. Así que vamos a eliminarlo. Y seguro también se asegura de que dentro todo el subgrafo falla la matanza. Tenemos una mutación y una consulta y aseguramos de que ambos estén en mayúscula. Entonces también dentro del GraphQL equivocado tienen mutación. Y luego crearemos la consulta y deberíamos nombrarlos la misma manera que lo hicimos dentro de la Tierra GraphQL. Y puedes cambiar el nombre aquí. Sí, porque no lo es, no se trata del nombre sino de un lugar que tiene el mismo nombre. Para que puedas tener esto así. Y en este caso hay que cambiar la notación de sala GraphQL con una minúscula, minúscula m. Pero no quiero eso. Quiero una M mayúscula, así que voy a cambiar esto como antes, y ya está. El siguiente video, vamos a escribir la lógica que manejará la fusión de estos dos archivos dentro del esquema punto GraphQL automáticamente. 28. Auto generar y fusionar esquemas: Ahora vamos a crear el archivo dentro de la carpeta fuente y nombrarlo, generar el esquema. El lado Ts aquí vamos a escribir la lógica que fusionará todos los subgrafos tus esquemas en el archivo de punto de esquema GraphQL. Entonces lo primero que tenemos que hacer es importar todos los archivos que termine con un punto GraphQL de la carpeta fuente. Y para eso tenemos que instalar un nuevo paquete. Así que abre tu terminal y ejecuta el comando npm, instala el globo del paquete, y también instala los tipos para ese paquete. Y ejecuta este comando. Bien, ahora cerremos la terminal y volvamos aquí. Y comencemos importando el paquete globo. Entonces aquí, globo de resplandor. Entonces globo es en realidad una función a la que podemos llamar y especificar la ruta de nuestros archivos que queremos buscar. Entonces para nosotros, vamos a buscar dentro la carpeta fuente y dentro de cualquier carpeta, y luego cualquier archivo que termine con GraphQL. Y entonces aquí tenemos que definir una devolución de llamada que aceptará un error y archivos. Entonces si tenemos algún error, vamos a lanzar un error, lanzar nuevo Error, o lanzar solo el, continuemos. Lo primero que tenemos que eliminar el esquema existente punto GraphQL archivo usando el método unlink del FS Beckett. Entonces desde los paquetes del sistema de archivos. Entonces eso es importante. El desenlace no sólo de nosotros, sino fs promete aquí farmacéuticos. Y tenemos que esperar un enlace y luego eliminar el esquema punto GraphQL. Bien, ahora vamos a declarar una variable y nombrarla types array. Force va a ser de tipo array y va a contener cadenas. Entonces va a sostener todos los esquemas como cuerdas. Y eso se inicia a una matriz vacía. Y luego aquí, vamos a leer todos los archivos y empujarlos como cadenas en el array types. Entonces para eso, tenemos que recorrer los archivos usando el para cada método. Aquí, tome cada archivo y extraiga el esquema del archivo usando otro método del paquete del sistema de archivos, que es la sincronización de archivos de lectura. Entonces vamos a leer en realidad un archivo. Y aquí pasemos el expediente aquí. Entonces este archivo es una ruta o simplemente el nombre del archivo aquí es la ruta del archivo. Y eso es realmente cambiarlo a ruta de archivo aquí. Ruta de archivo, aquí, ruta de archivo. Y aquí tenemos que definir la codificación porque tenemos que extraer el esquema como una cadena. Así que vamos a codificar a un UTF ocho y luego tomar el esquema y empujarlo en la matriz de tipos. Entonces los tipos de matriz, empujan el esquema. Ahora después de hacer eso, tenemos que crear otra variable y nombrarla tipo muertes. Y aquí tenemos que fusionar todos los borradores de sus esquemas. Así que todas las cadenas dentro de la matriz de tipos en un solo archivo. Y para eso, necesitamos la herramienta merge de los paquetes de herramientas GraphQL. Así que vayamos a nuestra terminal y diseñemos el GraphQL hacia los mendigos NPM. Entonces, en GraphQL, las herramientas de tablero y luego se fusionan con granizados. Bien, cerremos la terminal y volvamos aquí. Y primero importemos la herramienta de fusión desde la especificación inferior. Así importar, importar nutrir devs de tipo desde el GraphQL. Entonces herramientas que merch. Y vamos a usar este método. Entonces vamos a copiar el nombre aquí y pegarlo aquí, y luego citarlo. Vamos a pasar la encuesta tipo. Ahora bien, este método va a generar una nota de documento, pero necesitamos, para poder anexar algo a la a un archivo, necesitamos generar una cadena. Entonces para eso, necesitamos otra herramienta de GraphQL. Así que importa desde GraphQL otro método llamado print. Entonces el frente va a tomar el typedef superior y convertirlo en una cadena. Entonces digamos aquí, esto puso esto dentro de los métodos de la planta. Ahora el tipo, este es de tipo cadena. Así que vamos a agregar la cadena dentro del archivo de punto de esquema GraphQL usando el método append del equipaje FS. Así que asegúrate de importar el aquí. Y ahora vamos a usarlo y mencionamos el esquema punto GraphQL. Y aquí tenemos que agregar los tipos que podemos agregarlos en el gráfico esquemático archivo Gil. Y esta función también acepta una devolución de llamada. Así que definamos la función y aceptaremos un error. Y entonces si tenemos algún error, vamos a tirar eso mejor. Bien, ahora, si terminamos, quiero ver un mensaje de confirmación en mi sitio, mi terminal. Así que voy a consola registrar el mensaje generado por el esquema GraphQL. O tal vez usemos la consola dot info. Y antes de añadir al esquema, ese archivo GraphQL, tenemos que crear ese archivo porque aquí estamos. Vamos a eliminar la matanza de schema.gov. Entonces, para crear un archivo, tenemos que usar el método correcto de sincronización de archivos de los paquetes FS. Y nuevamente, asegúrate de importar eso desde el paquete del FSLR. Aquí también agregaremos el esquema punto GraphQL. Entonces este es un camino para la culpa de la gráfica de esquema. Y al mencionar solo el nombre, estamos convirtiendo este método en el que el esquema gráfico Gill realmente existe dentro de la raíz de este proyecto. Entonces aquí, gráfico de esquema. Y quiero anexar a este archivo un mensaje diciendo que se trata de un esquema generado. Entonces aquí, digamos que no. ¿Correcto? Ahora, vamos también a una nueva línea. Y aquí necesitamos agregar una bandera en un objeto y dentro de ese div como opción. Y como vamos a agregar algo a este archivo, vamos a usar la bandera a para anexar. Y también porque aquí estamos borrando el esquema GF q cinco, tenemos que usar el signo más para crear el archivo si no existe. Ahora déjame ajustar el código aquí. Y vamos a agregar también otra línea aquí. Barra diagonal n para nueva línea. Ahora hemos terminado de crear este script y vamos a ejecutar la función globe como un comando desde el archivo package.json. Tenemos que hacer eso antes de generar fuerza los tipos para nuestro esquema GraphQL. Entonces antes de este comando, vamos a ejecutar note y luego referirnos a la carpeta dist y a source generar esquema que Z, S. Y aquí en el comando compile, vamos a compilar nuestro código, y luego vamos a ejecutar comando degenerate. Entonces aquí, npm, correr generar dos y la ciencia también aquí. Y luego guardar. Ahora, vamos a abrir la terminal y correr degenerado salir. Y claro tenemos que compilar primero el código. Entonces, vamos a ejecutar TSE. Y luego vamos a ejecutar el npm run generate. Y aquí vamos, tenemos el esquema GraphQL se genera mensaje. Y ahora tenemos que analizar el esquema graph girl y agregar todos estos tipos de TypeScript generados ahí. Ahora vamos a revisar el esquema que el equipo de golf. Y aquí vamos. Tenemos nuestro esquema generado. Contamos con nuestros tipos e insumos. Y aquí la mutación, se puede ver que tenemos las mutaciones off, el registro y el inicio de sesión. Y tenemos la Mutación, la mutación enviar mensaje, automáticamente añadida dentro del tipo de mutación. Y por supuesto solo tenemos una consulta, la consulta del usuario actual. Y se puede ver también aquí que tenemos el esquema también generado aquí automáticamente. Sí. Y recuerda cuando dije que aquí vamos a tener acceso al usuario, si no entendiste eso. Quiero decir que cuando generemos el esquema, el esquema, el GraphQL, vamos a tener todos los tipos en un solo archivo. Entonces vamos a tener acceso también al tipo de usuario. Sí. Entonces está bien usar los tipos de usuario dentro del archivo room dot GraphQL, aunque no lo declaramos aquí. Ahora, en el siguiente video, vamos a crear los resolutores de sala. Y luego dentro del módulo, el archivo ts, lo vamos a fusionar con los resolutores. 29. crear el resolver, sala: Ahora dentro de la carpeta rooms, Vamos a crear un nuevo archivo y nombrarlo de ese resolvers punto ds lado aquí, Vamos a exportar una constante con un nombre, resolvers de sala. Y esta constante va a ser un objeto de tipo. El resultado se ve. Es importante que a partir de nuestros tipos generados. Entonces un puerto resolvers de salir Cuando nivele y seleccione estos carpeta integrada y luego seleccione los resolvers. Los archivos de tipos de tablero ahora están dentro de aquí. Vamos a definir la mutación. Y sólo tenemos una mutación, que es la mutación enviar mensaje. Ahora como no creamos la entidad, vamos a devolver un dato creado manualmente. Aquí, definamos primero la estación de mensajes de arena. Y tenemos al padre, tenemos la entrada y el contexto. ¿Bien? Ahora, solo los usuarios autorizados pueden establecer el mensaje. Así que vamos a verificar si tenemos un usuario autorizado comprobando los contextos que autorizaron la propiedad. Y luego si tenemos fuerza aquí, vamos a lanzar un nuevo error de GraphQL y asegurarnos de importarlo desde GraphQL. Y luego voy a enviar de vuelta y método no autorizado o me mensaje. Entonces un mensaje autorizado, y eso es una extensión. Entonces aquí las tensiones. Y vamos a mandar aquí el abrigo no autorizado. Y para rised. Y ahora vamos a enviar de vuelta un objeto de habitación. Entonces déjame comprobar cómo se ve el objeto. Entonces tenemos un id, mensajes de usuarios. Entonces agreguemos eso. Todo ese retorno id uno. Y para los usuarios, tenemos que crear una matriz de objetos users, pero podemos simplemente enviar de vuelta una matriz vacía y también la matriz de mensajes. Pero eso es una bolsa de arena, sólo un mensaje aquí. Déjame comprobar cómo se ve el mensaje. Tenemos desde y campos de contenido de objeto arena de, digamos uno y el mensaje de prueba de contenido. Bien, ahora vamos a guardar este archivo de resolución. O en realidad usemos la entrada para el objeto message solo para asegurarnos de que podemos ser los datos del cliente. Para el contenido, voy a devolver el mensaje de punto de entrada. Y aquí tenemos el mensaje, ya sea una cadena o indefinido porque aquí no agregamos un signo de exclamación. Entonces hagámoslo. Guardar. Por supuesto que tenemos que volver a generar el esquema. Así que vamos a ejecutar NPM, generar npm, estado en, ¿verdad? Bien, ahora hemos generado el esquema y los tipos. Entonces volvamos a los servidores normalmente y podemos ver que el error ha desaparecido. Podemos quitar el signo de interrogación de aquí. Y el mensaje es ahora solo de tipo string. Y aquí dentro del ID, vamos a enviar de vuelta la entrada esa ID de sala. Porque esta es una habitación molesta. Sí, vamos a guardar esto. Y en el siguiente video nos vamos a fusionar. El autor ha terminado y la sala de resolver aquí dentro del archivo module.js y luego probar el punto final GraphQL. 30. resolver fusionar: Ahora para fusionar los resolvers, necesitamos otra herramienta del GraphQL para cortar paquetes de fusión. Así que en la parte superior de este archivo, vamos a importar la nueva herramienta, nutrir resolvers de GraphQL, dash tools that smells package. Y también necesitamos importar el solucionador de sala. Entonces aquí, los resolvedores de reglas de la carpeta de habitaciones y del archivo de resolvedores de sala. Bien, ahora, en la parte inferior aquí, vamos a usar la función o herramienta merge resolvers dentro de la clase del módulo app. Entonces déjame cortar esto y luego usar los resolvers de fusión como una función. Y esta función acepta una matriz de resultados. Entonces voy a agregar una matriz y luego pegar aquí la oficina de autores. Y se puede ver que el error ha desaparecido porque los resolvedores mercantiles devolverán el tipo resolvers. Y aquí podemos agregar muchos resolutores tanto como queramos porque estamos aceptando una matriz. Así que agreguemos también los resolutores de sala y guardemos este archivo. Ahora, vamos a comprobar si todavía podemos ejecutar nuestro PI y que no rompimos nada. Entonces abramos la terminal y ejecutemos el comando npm start. Primero. Asegurémonos de que tenemos una base de datos en ejecución. Entonces, usando Docker, ese es uno. Entonces este guión o M para retirar el contenedor una vez que terminamos de trabajar con él, luego TI para terminal y dirección y luego nombra nuestro mensaje hacia fuera imagen DB. Y no olvides exponer el puerto 5455 y el 5432. Y ejecutemos este comando. Derecha. Ahora. Volvamos aquí y ejecutemos npm start. Este comando va a generar primero el esquema y luego generar los tipos y luego uno, la API. Pero primero, vamos a compilar el código y luego ejecutar el comando incinerate, y luego ejecutar nuestra API. Tenemos aquí el esquema GraphQL generado. También tenemos los tipos. Y ahora deberíamos recibir el mensaje de éxito. Ahora, abramos la caja de arena. Sandbox y vamos a registrarnos primero. Entonces aquí tengo la mutación de registro, tengo todas las entradas. Intentemos inscribirnos. Como puedes ver aquí, tenemos el id uno. Y eso es porque cada vez que cerremos la base de datos y la volvamos a ejecutar, obtendremos una base de datos nueva. Sí. Entonces tomemos ahora el token JWT y vayamos a la configuración y agreguemos ahí el encabezado de autorización. Aquí, autorización o el token JWT, guardar. Y ahora vamos a ejecutar la mutación del mensaje enviado. Déjame aclarar todo esto. Y volvamos a la mutación. Y arena mensaje, o el enviar mensaje depredación en absoluto. Los resultados son los campos. Aquí. No tenemos usuarios, pero vamos a agregar el ID ahí. Y vamos a obtener el de, del mensaje y del contenido. Ahora para la entrada, borremos todo esto primero y luego agreguemos el mensaje y el ID de sala. Entonces el mensaje aquí, ese es el mensaje. Y el ID de habitación. Digamos, Bueno, claro que no tenemos tabla de identificación de sala, establecer la base de datos. Entonces vamos a enviar mensaje. Y deberíamos volver. Y objeto de la sala ID con id1 usuarios una matriz vacía. Y tenemos aquí nuestro mensaje con el mensaje de prueba de mensaje directamente aquí. Ahora, todo está funcionando. Todavía tenemos que crear la entidad de sala y terminar los resolvers de sala. 31. creación de la entidad de sala: Ahora vamos a crear la entidad de sala. Entonces dentro de la carpeta de habitaciones, crea otra carpeta y nombra regla. Y luego lado aquí, crea otra carpeta y nombra entidad. Y luego finalmente vamos a crear la entidad de punto de habitación que sí. Entonces comencemos por Exportar y definiendo una clase con un nombre Roma. Entonces tenemos que usar la entidad, el carácter de cinta alrededor, entidad de soporte de tipo o N, y usarlo para esta clase. Ahora dentro de aquí, comenzaremos con la identificación. Y nuevamente, tenemos que importar la columna primaria generada, el carácter para el ID. Y aquí es extraño que el personaje, entonces necesitamos una matriz de usuarios. Entonces aquí vamos a agregar usuarios y definirlo como una matriz de usuarios. Y tenemos que importar la entidad de usuario del usuario, esa entidad punto ds. Entonces aquí, usuario de volver un nivel, dos niveles, y tres niveles. Side La carpeta de usuario apagada y triste. Seleccione la carpeta interior de la entidad. Seleccione el usuario, ese archivo de entidad. Ahora, los usuarios son a, es una columna, por lo que necesitamos importar un color y el carácter del tipo alrededor. Entonces aquí Carlin, y úsalo aquí. Ahora para la columna de usuarios, vamos a crear una relación de muchos a muchos con la entidad de usuario. Y para eso tenemos que importar los muchos a muchos, el personaje de la cinta alrededor y usarlo aquí en muchos, muchos. Ahora tenemos que definir el tipo de relación, y en nuestro caso, es la entidad de usuario. Entonces aquí tenemos que agregar una función y buscar o devolver la entidad de usuario como un tipo. Ahora, para que esto funcione, tenemos que agregar otro personaje, la mesa de unión a Garreta y usarla aquí. Entonces la tabla de unión, el personaje va a tomar los ID de la sala y las entidades de usuario y guardarlos en una tabla. Ahora, solo necesitamos usar la relación de muchos a muchos en un lado de la relación. Y a esto se le llama relación unidireccional. Si quieres crear una relación bidireccional, puedes ir a la entidad de usuario. Y dentro de aquí puedes crear otra columna y nombrarla regla, y usar el carácter de muchos a muchos. Ahora aquí tenemos la entidad de habitación. Y esto debería ser una matriz. Y usa los muchos-a-muchos para caracter aquí y definir el tipo. Entonces aquí vamos a conseguir la entidad de habitación. Y también aquí necesitamos agregar otra función donde tenemos que devolver la propiedad que posee el otro lado de la relación. Entonces en nuestro caso, aparte del objeto room, vamos a obtener el otro lado de la relación de la propiedad users. Y debemos hacer lo mismo dentro de la entidad de habitación. Pero para la mesa de unión, el personaje, solo debemos usarlo en un lado de la relación aquí. Entonces aquí, hagamos lo mismo, solo un ejemplo. Así que aquí el usuario y luego regresa, devolvió el usuario punto room, porque la propiedad de la habitación posee el otro lado de la relación. Y debería, deberían ser habitaciones, no habitación aquí. Pero de nuevo, es sólo un ejemplo. Sí, aquí no vamos a usar la relación bi direccional. Solo necesitaremos a la relación sindical, relaciones unidireccionales. Entonces estudiemos esto y lo guardemos, regresemos a la entidad de usuario y eliminemos todo esto. Y asegúrese de eliminar cualquier instrucción de entrada de la entidad de regla y cerrar esta. Ahora todavía no terminamos porque la base de datos Postgres no soporta matrices. Sí. Y para eso, necesitamos usar un tipo de JSON muy único, que es el JSON B. Ahora los tipos de datos Jason y Jason B, son casi idénticos. La diferencia clave es que los datos JSON se almacenan como una copia exacta del texto de entrada json. Qué es JSONB almacena datos en un descompositor. Binario para eso no es como una cadena. Sí, como JSON, pero como código binario. Y eso es lo que significa el binario. Nuestro ADB significa, significa un binario. Ahora bien, esta es la única forma de trabajar con arrays con Postgres. Entonces tenemos que hacer esto. Tienes que usar JSON v en lugar de simples matrices son simplemente JSON simples. Ahora voy a agregar una opción aquí y decir nullable, false porque no quiero obtener un valor nulo aquí para la propiedad users. Bien. Ahora todavía necesitamos los mensajes. Entonces vamos a agregarlo aquí. Y va a ser de tipo mensaje. Y podemos importar eso de los tipos generados. Asegúrate de cambiar esto. Salir dos niveles, pensar en tres niveles. Y aquí, hagamos de esto una matriz. Si pasa el cursor sobre este tipo, puede encontrar que tenemos el contenido y el formulario como propiedades requeridas. Y tenemos aquí el nombre del tipo, que no se requiere. Por lo tanto, podemos usar el tipo de mensaje aquí. Sí, no es el problema. Ahora. Aquí, definamos una columna. Una columna. Y tenemos que usar el adyacente comenzó porque no podemos usar simple borrado. Y quiero que no sea anulable. Entonces voy a agregar nullable igual a false. Y seguro. 32. creación y actualización de habitaciones: Ahora dentro de la carpeta room, vamos a crear otro archivo y ponerle nombre room dot service que sí. Aquí vamos a exportar un servicio de habitaciones de clase y así crear el constructor. Y aquí vamos a crear la sala, nuestro repositorio. Y va a ser de tipo repositorio. Podemos importar eso de cinta alrededor. Así que importar repositorio de tipo alrededor. Aquí tenemos que agregar la entidad de sala como argumento aquí, Roma. Y eso es importante que desde la entidad. Ahora definamos el método que va a crear una habitación para nosotros. Así que aquí, acando, crear habitación. Y este método aceptará un argumento de participantes, que es una matriz de usuarios. Así que aquí, array usuario, y esta es la entidad de usuario. Entonces necesitamos importarlo de aquí, puerto usuario de salir dos niveles y luego seleccionar la carpeta juramento. Y a partir de ahí, la carpeta de usuario, la entidad y el archivo de entidad de usuario, no sólo los participantes aquí, también necesitamos el mensaje. Porque cuando vamos a crear una habitación, cuando el usuario intenta enviar un mensaje a otro usuario por primera vez. Entonces aquí el mensaje va a ser de tipo mensaje. Y nuevamente, vamos a importar eso de estos tipos generados. Entonces aquí, Importar mensaje de fuera a un nivel, dos niveles. Y luego la carpeta generada el sábado, seleccione el archivo de tipos resolvers. Ahora aquí vamos a crear una sala con el repositorio repositorio y donde creen métodos. Ahora es cierto exceptuando a los usuarios. Entonces los usuarios o los participantes, y también acepta la matriz de mensajes. Entonces, debido a que vamos a crear una nueva sala, vamos a agregar el mensaje manualmente a una matriz. Así que vamos a obtener una matriz con un mensaje. Bien, ahora tenemos que devolver un peso, este repositorio de sala de puntos que guardan y pasan el documento de sala. Ahora parece que tienen un error tipográfico aquí en el repositorio. Entonces déjame arreglar esto. Y voy a usar multi-select y cambiar esto a tal vez a un repositorio ¿verdad? Ahora vamos a ahorrar. Y ahora tenemos que manejar el caso donde tenemos, donde queremos mandar un mensaje a una regla específica. Entonces aquí vamos a crear otro método. Va a volver a ser asincrónico y va a elegir el nombre, agregar mensajes para rodar. Puedes elegir el nombre del mensaje de arena. Pero quiero tener muy claro aquí que vamos a mandar un mensaje a una habitación, y aquí vamos a crear una habitación. Sí. Entonces ahora para hacer esto, para enviar un mensaje a una habitación específica, necesitamos el ID de habitación, por supuesto, del tipo número. Y necesitamos el mensaje de tipo, mensaje. Aquí, mensaje. Y ahora lados aquí. Vamos a usar el Constructor de Consultas. Y eso es porque tenemos que lidiar con Jason ser arreglos. Entonces si puedes recordar, definimos la columna de mensajes como JSON B. Y porque tenemos aquí el signo array de TypeScript va a ser de tipo Jason be array. Entonces, la única manera de lidiar con Jason be arrays es mediante el uso de la consulta construida. Ahora definamos Query Builder aquí. Este punto positivamente nuestro propio repositorio. Crear Generador de consultas. Y aquí vamos a crear un peso Query Builder. Actualización. Va, vamos a actualizar una habitación existente y luego agregar el nuevo mensaje a la matriz de mensajes. Así que actualice, necesitamos la entidad de habitación aquí como tipo y la propiedad que se actualizará dentro de un objeto. Así que vamos a actualizar los mensajes y vamos a utilizar forma muy específica y única de actualizar esta propiedad. Así que vamos a usar un método o una función para devolver una consulta. En esta consulta tendrá el nombre de propiedad de los mensajes y luego agregaremos 2 bar aquí. Y voy a explicar esto apenas en un segundo. Sí. Y ahora agreguemos comillas. Y dentro de aquí vamos a agregar los mensajes como una cadena JSON. Así que vamos a usar el método JSON stringify y pasar el mensaje. Y luego recuerda que tenemos que agregar mensajes como Jason venció. Entonces vamos a convertir esto a Jason V agregando dos columnas. Y entonces, claro, Jason, sé así. Entonces toda esta cadena es una consulta Postgres. Y cuando añadimos las dos columnas y el Jason sea así va a ser analizada por Postgres como una consulta. Y Postgres manejará la conversión de esta cadena, de esta cadena JSON, dos latidos adyacentes. Y la barra 2 aquí significa que vamos a anexar esta cadena JSON B y a la propiedad messages. Ahora mediante el uso del Generador de consultas para agregar una consulta con el método update, necesitamos devolverla como a from a method. Bien, ahora, déjame ajustar este código y continuar con el Constructor de Consultas. Entonces vamos a actualizar una habitación, pero tenemos que identificar la habitación que vamos a actualizar. Y para eso, usaremos el método Where. Y este método va a agregar una condición where en el generador de consultas y crear la condición where. Vamos a añadir una cadena aquí y decir que vamos a actualizar una sala donde el ID es igual a ID de variable, y podemos definir esa variable en otro argumento de este método. Y dentro de un objeto, defina ID, y se va a establecer en el ID de la sala. Ahora, todavía necesitamos ejecutar esta consulta usando el método execute. Y si pasas el cursor sobre él, encontrarás que este método va a devolver resultados de una base de datos de filas, pero necesitamos devolver un tipo de habitación. Y así este método de ejecutar query execute, no va a funcionar con un entorno TypeScript. Por lo tanto, voy a devolver un peso y buscar el documento actualizado. Entonces ahí está el repositorio de la sala y luego usa el método find one. Y voy a buscar una habitación con o donde el id sea igual al ID de habitación. Y también para devolver las relaciones, tenemos que agregar la propiedad relations y especificar una matriz o una matriz de las relaciones que queremos recuperar. En nuestro caso, solo tenemos una relación, que es la matriz del usuario. Y eso es todo. Es así como podemos actualizar a, una entidad y devolverla con el Constructor de Consultas. 33. CreateRoom resolver 1/2: Ahora, antes de comenzar a usar el room service, tenemos que importar la fuente de datos de la app y crear una instancia aquí y pasar el repositorio de la sala. Entonces, primero importemos la fuente de datos de la aplicación desde dos niveles y luego seleccionemos la fuente de datos. Ahora aquí, tenemos que exportar una constante y nombrarla room service, y crear una nueva instancia de room service. Y pasar el o usar la fuente de datos de la aplicación y luego punto repositorio Git y pasar la entidad de la sala. Y aquí cambiar esto para exportar. Bien, vamos a guardar esto y cerrarlo. Regresar o abrir las habitaciones de resolutores y como importar el servicio de habitaciones del archivo de servicio a la habitación. Y aquí vamos a configurar el mensaje o enviar mensaje resolvedor. Eliminemos la declaración de retorno. Y vamos a devolver el peso. Las habitaciones dan servicio a ese mensaje a Roma y pasan primero la identificación de la habitación desde la entrada a través de mi d. y luego tenemos que pasar el mensaje. Y el mensaje es un objeto con contenido de propiedad. Y vamos a obtener el contenido de la entrada de ese mensaje. Y también tenemos que agregar la propiedad from, que es el ID del remitente, que en nuestro caso el ID de usuario actual. Y podemos obtener eso del contexto, ese usuario coreano, ese id de usuario. ahora terminamos desde el solucionador de mensajes de arena. Ahora aquí, agreguemos una coma y luego creemos el solucionador create room. Así asíncrate, crea habitación, luego para el padre. Así que aquí crear habitación y yo padre y luego agregar entrada y el contexto, contexto. ¿Verdad? Entonces aquí tenemos crear habitación, pero estamos obteniendo estos errores porque no definimos al creador de mutación dentro de nuestro esquema de sala GraphQL. Entonces hagámoslo muy rápido. Aquí. Vamos a crear otra mutación y nombrarla. Crear habitación. Y entrada de tipo. Crear habitación, entrada. Y definamos esto aquí. Entrada, crear entrada de habitación. Entonces tengo aquí autocompletar. Muy molesto. Vamos a arreglar eso. Y en cambio crean espacio en libro. Vamos a aceptar un campo de mensaje con una cadena tipo y un receptor. Los chicos tipo int van a obtener el ID del receptor. Ahora aquí tenemos que devolver el tipo de devolución. Entonces voy a devolver la fila y luego guardar. Regresa al resolvedor de sala. Y para eso necesitamos generar el esquema o los tipos a partir del esquema GraphQL. Así que abre tu terminal y ejecuta npm, run generate. Ahora mismo, creo que se nos olvidó agregar. Lo muy importante es que nuestro esquema aquí, que es hacer que se requiera la entrada de crear sala. De lo contrario, obtendrá errores de TypeScript cuando intente usar el uso de la entrada create ROM. Entonces aquí, volvamos a ejecutar este comando y borrar esto o simplemente eliminar la terminal. Regresa aquí. Ahora, lo primero que tenemos que autenticar al usuario. Entonces voy a copiar todo esto y pegarlo aquí. Ahora, tenemos que verificar si ya tenemos una habitación que contenga al receptor y al remitente. Y para eso, tenemos que crear otro método dentro del servicio a la habitación. Entonces vamos a abrir room service y aquí, crear otra función asincrónica y nombrarla, buscar, boom, con el Id de un usuario. Bien, ahora vamos a obtener, o a buscar un usuario para una habitación con el ID del receptor, el número de tipo y el identificador del remitente del número de tipo también. Y aquí vamos a usar el Constructor de consultas con el fin de recuperar las relaciones de los usuarios. Así que vamos a crear una constante aquí y nombrarla Query Builder. Y luego usar el repositorio de sala para crear una nueva consulta con ellos. Agreguemos un alias aquí para hacer referencia a la entidad de sala de la tabla de sala dentro de una base de datos y crear una constante Rooms porque vamos a buscar todas las habitaciones que contienen un usuario con el ID de remitente ID. Entonces hagámoslo. Generador de consultas de espera. Después en otra línea, seleccionemos todo y luego usemos el método de unión interna para unir toda la relación dentro de la propiedad room dot users. Entonces aquí vamos a encontrar que los usuarios, luego vamos a agregar un, un alias para hacer referencia a la relación de usuarios. Y voy a elegir simplemente la letra U aquí. Y entonces vamos a agregar una condición donde satisface condición. Vamos a mapear a través de la matriz de relaciones del usuario. Y eso es añadiendo comillas dobles como esta. Usted aureus, y luego agrega otras comillas dobles con un punto aquí para seleccionar el ID. Y luego verificar si el ID es igual al ID de remitente variable. Y aquí podemos definir esa variable Id. del remitente. Y entonces vamos a usar los métodos get many para conseguir muchas habitaciones. Y luego vamos a usar JavaScript para devolver un booleano aquí, volver y luego agregar signos de exclamación dobles aquí. Entonces habitaciones en un signo de interrogación porque podemos obtener nulos. Entonces sum es el método sum para verificar si algunas habitaciones tienen una condición muy específica la cual es redondeada a los usuarios. Entonces vamos a comprobar si es una de las habitaciones. Y dentro de esta propiedad de usuarios, podemos encontrar al menos un usuario que tenga un AD que sea igual al AD receptor. Bien, ahora tenemos aquí algunos métodos, pero es gay. Y ahora podemos evitar creación de múltiples salas para los mismos usuarios. 34. CreateRoom resolver 2/2: Ahora bien, si tenemos una habitación que tiene dos usuarios con el ID del receptor y el ID del centro, no vamos a crear una nueva habitación para ellos. Así que vamos a crear una constante aquí y nombrarla. La habitación cuenta con usuarios. Después use el servicio de habitaciones que encuentre habitación con ID de usuario o ID de usuario. Y luego tenemos que pasar el ID del receptor de la entrada ese receptor y el ID del remitente de los contextos que el usuario coreano, ese ID de usuario. Bien, ahora vamos a revisar. Si tenemos una habitación que tiene usuarios, entonces vamos a tirar de nuevo en YouGov KL y decir que receptor ya existe o simplemente la habitación ya existe. Sí. Entonces aquí la habitación ya existe. Y eso es todo. Ahora bien, si no encontramos una habitación donde el receptor y el remitente, vamos a enviar o crear la habitación y luego enviar el mensaje. Entonces volvamos 08, el servicio de habitaciones que crean fila. Ahora bien, este método acepta la matriz de un participante, que es una matriz de usuarios. Entonces tenemos que buscar usuarios del repositorio de usuarios. Y para eso, vamos a crear otro método dentro del servicio de usuario que devolverá múltiples usuarios por sus ID. Así que vamos a crear un método asíncrono y nombrarlo find by ID. Porque vamos a una, pasar una serie de ideas, va a nombrar Hay hallazgo por ID en matriz. Y aquí en ideas, argumentos de tipo, matriz de números. Y regresar. Esperar esto que el repositorio de usuario punto encuentra por ID que existe dentro de la matriz de ID. Y para eso, vamos a usar un método de tipo de RAM llamado en método. Así que asegúrate de importar eso desde type ramp primero, luego la matriz del ID. Y el método encontrará todos los usuarios que tengan ID que existan dentro de la matriz. Así que podemos nombrar a este método find by IDs en lugar de find by ID en array. Bien, ahora vamos a guardar el servicio al usuario, cerrarlo y volver aquí. Y vamos a crear un participante, encuesta. Participantes. Y va a utilizar el servicio al usuario. Primero eso se importa desde la carpeta off y desde el archivo de servicio al usuario. Y luego aquí, esperan servicio de usuario que encuentre por ID. Y vamos a pasar una matriz con dos IDs de los contextos que CurrentUser. Va a obtener el ID de usuario. De la entrada. Vamos a conseguir la identificación del receptor. Sí, entonces aquí, pasemos los participantes y el mensaje. Entonces el mensaje tiene dos propiedades. El primero es el contenido. Puede obtenerlo a partir de la entrada de ese mensaje, y de la propiedad from que representa el receptor o el ID de matriz central. Y podemos obtenerlo de currentUser dot user ID. Y eso es todo para el solucionador de sala de crear. 35. Creación de getRooms resolver: Ahora vamos a crear una consulta que recuperará todas las salas de la base de datos. Así que vamos a comenzar desde la sala ese esquema GraphQL y definir una nueva consulta. Y nombra esta consulta, consigue habitaciones. Y no va a aceptar ninguna entrada, pero devolverá una matriz de objetos. Vamos a guardar este esquema GraphQL y generar los tipos para los resolvers usando el comando NPM run generate. Bien, cierra la terminal en la habitación, ese archivo GraphQL y luego vuelve a los resolutores de la sala. Y aquí bajo la mutación, va a definir una consulta. Después defina el solucionador get Rome. Y vamos a conseguir una entrada padre y vacía y el contexto. Y aquí tenemos que autenticar al usuario. Entonces copiemos esto y peguémoslo aquí. Ahora necesitamos crear un nuevo método dentro del servicio de habitaciones que nos vaya a buscar todas las habitaciones. Entonces en la parte superior aquí, crea un nuevo método asincrónico y nombra, obtén todos los grupos. Y vamos a conseguir todas las habitaciones para un usuario específico. Entonces aquí aceptaremos una identificación de usuario de tipo número. Y vamos a usar el Constructor de consultas con el fin de recuperar las relaciones de los usuarios y luego devolver todas las salas que tenga un usuario con este ID de usuario. Así que primero definamos el generador de consultas desde el repositorio de la sala. Cree Query Builder y elija una sala de alias. Y luego aquí vamos a usar el Editor de consultas. Así que va a devolver 08 Query Builder. Y luego vamos a unir las mesas de usuarios dentro la sala que los usuarios son propiedad de la mesa de la sala. Así que aquí está la unión interna, únete a las tablas de relaciones y selecciona usuarios redondeados. Y vamos a referirnos a la matriz de usuarios con la letra U. Y entonces aquí vamos a usar la palabra condición. Y vamos a seleccionar todas las habitaciones que tenga un usuario con un ID que sea igual a ID variable. Podemos definir la variable ID aquí, SAT, este objeto ID es igual al ID de usuario. Y entonces conseguiremos muchas, muchas habitaciones. Entonces vamos a usar eso, conseguir muchos. Ahora mismo. Guardemos esto y volvamos a los resolutores de sala dentro de la consulta de get room. Vamos a devolver un peso. Room service, obtiene todas las rutas y pasa el ID de usuario de contextos, CurrentUser, luego ID de usuario. 36. Señala graphql de prueba: Ahora es el momento de probar nuestras APIs. Así que asegúrate de tener la base de datos Postgres ejecutándose. Y puedes hacerlo usando este comando. Asegúrese de exponer los puertos correctos. Y luego ven aquí y corre npm. Ejecutar inicio. Bien, ahora vamos a navegar a una caja de arena de polo. Asegúrese de registrarse y copiar el token JWT dentro de la configuración de conexión y dentro del encabezado de autorización. Ahora, mutación silenciosa, vamos a probar la, la mutación enviar mensaje. Pero primero tenemos que crear otro usuario para poder enviar un mensaje a. Sí, vamos aquí. Reenviar la mutación de registro con el usuario al correo electrónico y al FirstName y ejecutó el registro. Ahora bien, esta vez, no vamos a copiar este token JWT dentro del encabezado de autorización porque tenemos que autenticarnos como el primer usuario o uno de estos usuarios. Sí. Entonces aquí tenemos al usuario con id2 y le vamos a mandar un mensaje con el, con su AD. Entonces eso está claro. Esto elimina la mutación de registro y elimina la entrada. Haga clic en Enviar mensaje. Y la mutación de enviar mensaje. Vamos a obtener los usuarios de id y los mensajes de la sala. Entonces dije los usuarios. Tomemos el primero el nombre, y la identificación. Y luego para los mensajes que se ajusta al campo formulario o desde campo y luego el contenido. Muy bien, ahora para las entradas, tenemos que agregar el mensaje y el ID de sala. Pero aún no tenemos habitaciones dentro de nuestra base de datos. Entonces lo que tenemos que hacer es que tenemos que crear una habitación antes de enviar el mensaje. Entonces agreguemos la creación a través de la mutación y agreguemos. Permítanme aclarar todo esto primero. Y luego agregamos crear habitación o el, todos los campos aquí. Y para los usuarios, obtendrás el id y el FirstName, los mensajes de los que vamos a obtenerlo. No nos importa todo esto desde solo mensaje. Incluso aquí vamos a enviar un mensaje a un usuario. Sí. Déjame revisar qué campos tenemos lado, los mensajes tienen contenido. Ahora volvamos. Y los insumos. Permítanme borrar todo este mensaje y agregar el receptor. El receptor va a ser usuario con id2 y el mensaje igual de simple texto, como mensaje de texto. Ahora vamos a enviar o crear la habitación y enviar el mensaje. Bien, tenemos aquí el objeto de habitación con ID uno. Y tenemos la variedad de usuarios. Sí, y tenemos el ID del usuario uno. Sí, FirstName es uno, y el segundo usuario dentro de esta habitación. Entonces estos dos usuarios ahora pueden enviarse mensajes entre sí. Tenemos aquí la matriz de mensajes con un solo mensaje. Y este mensaje ha sido enviado por el usuario con ID1. Entonces el usuario uno. Ahora bien, si intentamos crear otra habitación con el mismo ID de receptor, deberíamos obtener un error diciendo que esa habitación ya existe. Entonces veamos si funciona. Muy bien, entonces aquí tenemos la sala de mensajes ya existe y estamos seguros para ir. Entonces la siguiente mutación que vamos a probar, es el mensaje de arena. Así que permítanme borrar toda esta entrada y agregar la mutación de enviar mensaje. Vamos a tener la idea de la habitación, el ID de usuario, y el nombre del usuario. Y luego vamos a recibir también los mensajes aquí. Va a obtener el campo from, el campo de contenido. Y luego para las entradas, tenemos que agregar una entrada de mensaje, iran mi entrada D va a enviar un mensaje a la sala, ID uno. Y agreguemos un mensaje, otro mensaje de prueba, el enviar un mensaje. Y aquí vamos. Tenemos la misma habitación, un documento de sala con los mismos usuarios. Y aquí hemos agregado otro mensaje a la matriz de mensajes. Y user2 también puede enviar mensajes a esta sala, pero tenemos que iniciar sesión como usuario para obtener el token JWT agregado al encabezado de autorización y luego enviar el mensaje. Hagámoslo muy rápido. Entonces una mutación repentina. Déjame aclarar todo esto. Y en la mutación de inicio de sesión, va a obtener solo el token JWT. Entonces aquí, elimine este token JWT. Para las entradas, necesitamos el correo electrónico y la contraseña. Todo esto. Entonces el correo electrónico del fusor dos es usuario para agregar email.com y la contraseña es contraseña. Ahora vamos a iniciar sesión. Y recuerda que vamos a mandar un mensaje a la sala ID1. Entonces tomemos el token JWT agregado al encabezado de autorización. Y seguro. Ahora estamos iniciados sesión como usuario para, volvamos a la mutación, eliminemos el signo cualquier mutación e iniciemos sesión en entradas. Y aquí están la mutación de enviar mensaje. Va a hacerse la idea de la habitación, la idea de los usuarios, tal vez también el FirstName. Y va a recibir todos los mensajes. Bien, agreguemos las entradas. La entrada de mensaje, la entrada de ID de habitación. Entonces dije que vamos a mandar un mensaje a mi d1. Y el mensaje es mensaje de usuario a usuario uno, enviar mensajes. Y aquí vamos. Tenemos este mismo ID de habitación, documento de sala al ID de sala uno, y los mismos usuarios y un nuevo mensaje dentro de la matriz de mensajes. Es así como podemos enviar mensajes usando el concepto de habitaciones. 37. Implementación de validación con validador de clase: Ahora vamos a agregar validación a nuestro proyecto. Y para eso vamos a usar los paquetes validadores de clase. Así Sage o un terminal npm y validador de clase de estilo. Y la razón por la que vamos a utilizar el clúster los datos, es porque los datos clasificados los usuarios decoradores. Y vamos a utilizar los caracteres Validador de clase dentro de las entidades para comprobar si tenemos por ejemplo un correo electrónico válido o para aplicar ciertas condiciones a la contraseña. Entonces primero, para validar un correo electrónico de la entidad de usuario, vamos a importar desde el validador de clase. Ir a importar el personaje es correo electrónico. Entonces este es un decorador que podemos usar. Hornea otros decoradores de pañales por aquí. Aplicar el decorador a esta propiedad es correo electrónico. Y puedes ver dentro de la definición aquí que este decorador comprueba si la cadena es un correo electrónico. Si el cuerpo dado no es cadena, entonces devuelve false porque cualquier hombre debe ser siempre una cadena. Ahora para la contraseña, vamos a validar la longitud de la contraseña. Sí. Entonces aquí necesitamos otro, el personaje que es el Min Nan. Después aplicarlo en la propiedad de contraseña. Así que aquí largamente. Y el mínimo, entonces para la contraseña va a ser seis y guardar el archivo. Por supuesto que puedes explorar más. Los caracteres dentro del clúster meditador que acaba de escribir es así. Y puedes encontrar muchos de los caracteres que para validar muchas cosas como mayúsculas, como verificar si una propiedad es y URL, o es una matriz. Y muchas cosas como incluso está vacío o no, o es mayúscula o minúscula. Y muchas cosas, sí. Así que revisa todo eso y juega con el validador de clases. Ahora vamos a aprender a manejar la validación. 38. Catch errores de validación: Ahora toda la validación los caracteres van a ser ejecutados cuando creamos una nueva entidad. Y antes de guardar esa entidad en la base de datos, vamos a usar otro método del validador de clase para atrapar todo el error de validación. Así que vamos a repasar el servicio al usuario. Y aquí donde creamos una nueva entidad de usuario, primero importemos el método, validemos o rechacemos desde el validador de clase. Y vamos a usar ese método antes de guardar la entidad de usuario. Aquí. Espere, valide o rechace. Entonces vamos a validar la entidad de usuario. Y luego vamos a usar el método catch para captar las vibraciones o los errores de validación. Así que aquí vamos a definir una devolución de llamada que captará los errores de validación de tipo, validación, matriz de errores. Y podemos importar este tipo desde el validador de clases. Así que aquí, error de validación de puerto desde validador de clase y continuar con la devolución de llamada. Así que vamos a lanzar un nuevo error de GraphQL si tuviéramos algún error. Sí, tan importante, el GraphQL. Graphql y va a devolver un mensaje de error de validación con extensión. Extensiones. Y vamos a mandar de vuelta todas las flechas. Sí, con el código que ingresó el usuario. Ahora tenemos dos problemas aquí. El primero es que la contraseña va a ser acosada. Entonces, si el usuario envía una contraseña de tres caracteres, obtendremos una, validaremos solo la contraseña de peligro, que es una contraseña de cadena larga. Sí. Y el segundo problema es que a pesar de que estamos lanzando un error aquí, vamos a seguir pasando un running, ejecutando esta línea aquí, vamos a seguir salvando al usuario. Entonces, para evitar que todo eso suceda, vamos a usar el método then. Y aquí dentro de una devolución de llamada. Vamos a tomar este nueve. Agregado aquí. Elimina la contraseña del método create, y solo dale el aura. Simplemente deje la entrada de registro así. Y vamos a cambiar la contraseña aquí. Asegúrate de que este método sea asíncrono porque vamos a usar un peso. Ahora cuando generemos la contraseña, la contraseña, tomaremos la entidad de usuario y cambiaremos la contraseña para que sea igual a la contraseña hash. Bien, ahora arreglamos el problema uno. Ahora para que el problema, vamos a devolver al usuario. Vamos a guardar al usuario y devolver el, guardar un documento desde aquí. Y entonces vamos a obtener un resultado aquí. Este resultado es el mismo que el usuario puede ver aquí. El resultado es de tipo usuario porque aquí devolvimos el usuario de ahí. Entonces solo usaremos la declaración return aquí. Y eso es todo. O en realidad cometimos un error aquí. No debemos usar el método de los gatos antes del método de entonces. Sí, entonces el método catch debería ser el último, el último método. Entonces aquí, coge cualquier error. Entonces, si tenemos algún error aquí, vamos a devolver una gráfica antes. Pero si no captamos ningún error, vamos a ejecutar esto, volver. Bien, ahora podemos guardar este archivo y luego ejecutar el servidor desde la terminal. Entonces aquí, ya lo he hecho. Y se puede ver que node man está reiniciando todo el reinicio del servidor porque cambiamos el archivo. Y ahora vamos a probar nuestra API dentro del servidor Apollo, me refiero al sandbox asequible. Entonces aquí tenemos nuestra mutación de registro. Entonces voy a enviar un correo electrónico válido y una contraseña válida. Entonces voy a enviar contraseña de tres caracteres y ejecutar la mutación de registro. Y deberíamos obtener una validación. Aquí vamos. Entonces tenemos que obtener dos matrices aquí y decir que la matriz de errores tiene que objetar, significa que sí obtuvimos dos errores. El primer error es para el correo electrónico. Así que aquí propiedad, correo electrónico. Y se puede ver dentro los contratos que tenemos es propiedad de correo electrónico. Y con el mensaje, correo electrónico debe ser un correo electrónico. Y para la contraseña de propiedad, se puede ver que tenemos la contraseña del mensaje debe ser menor o igual a seis caracteres. Entonces ahora sabemos que nuestra validación está funcionando. Puedes agregar más validación usando el validador de clase. Ahora puede validar la entidad de la sala y jugar con los datos de agrupamiento. Ahora, antes de terminar este video, quiero señalar que si cierras la base de datos Postgres golpeando Control C, así, tienes n y luego lo vuelves a escribir con el comando docker run. Tienes que cerrar el servidor GraphQL por el Control C y volver a ejecutarlo. Sí, vuelva a ejecutarlo cuando ahora la base de datos Postgres esté lista para aceptar conexiones. De lo contrario, obtendrás muchos errores y no podrás trabajar con la base de datos. 39. por qué deberíamos usar ScoketIo: Ahora podemos enviar mensajes entre usuarios, pero para que un usuario vea el último mensaje, tiene que recargar el navegador o por ejemplo aquí, estamos usando sandbox. Necesitamos buscar todas las habitaciones para poder ver los últimos mensajes enviados por el participante de esa regla. Y sabes que los usuarios no van apreciar eso porque todas las aplicaciones de mensajería ahora cuentan con algún tipo de mecanismo de transferencia de datos en tiempo real para que los usuarios puedan obtener y leer nuevos mensajes en tiempo real sin luz, refrescar la página o cerrar una aplicación y volver a abrirla con el fin de recuperar las habitaciones y conseguirte los últimos mensajes. Y esa es la característica que tenemos que implementar en nuestra aplicación. Así que vamos a usar Socket IO, una biblioteca muy popular que permite comunicación en tiempo real entre clientes web y servidores. Puedes navegar hasta socket punto io y leer la documentación y ver algunos ejemplos. Sí, pero claro que vamos a trabajar con Socket IO en este proyecto, y comenzaremos en el siguiente video. 40. Únete a habitaciones con socketIo: Ahora comencemos instalando socket IO desde MPM. Así que abre tu terminal y ejecuta npm install socket IO. Bien, ahora abramos el módulo, el archivo ts e implementemos ahí el servidor socket IO. Aquí déjame cerrar la terminal. Abra el fuego de lágrimas modulares. Y lo primero que tenemos que hacer es importar la clase de servidor desde socket que IL. Ahora vamos a implementar el servidor socket IO dentro del método auto startup e implementado con el servidor HTTP. Así que aquí vamos a crear la constante A0 y crear una nueva instancia de servidor, pasar el servidor HTTP. Y ahora tenemos que empezar a escuchar conexiones. Y podemos hacerlo con el método on y escuchar el evento de conexión aquí, conexión. Entonces vamos a agregar y volver aquí. Eso va a conseguir una toma. Y vamos a hacer algo con ese tipo de consigue. Entonces, para poder usar el socket dentro de todos nuestros resolutores, lo vamos a poner dentro de la solicitud y podremos acceder a la solicitud desde la constante ad. Después solicitar y crear una propiedad personalizada y nombrarla socket IO, y establecerla el socket que recibimos del cliente. Ahora tenemos que agregar la propiedad socket IO a la interfaz request, y vamos a hacerlo dentro del archivo main.js. Entonces vamos a abrirlo. Y dentro de él, vamos a declarar una variable global o espacio de nombres. Y vamos a seleccionar el namespace express. Y dentro de ella vamos a seleccionar la solicitud de interfaz. Y aquí podemos agregar el socket IO y hacerlo como no requerido. Y entonces el socket IO va a ser de tipo socket. Podemos importar este tipo desde el paquete socket IO y luego guardar este archivo y luego volver al módulo, el archivo ts. Y se puede ver que el error es, el error ha desaparecido. Ahora. Debido a que estamos usando el concepto de habitaciones dentro de nuestra aplicación, podemos hacer lo mismo con Socket IO. Entonces vamos a usar el socket de cliente para unir todas las salas que tenga el usuario. Y luego cada vez que emitimos un nuevo evento a una de estas salas, y claro, tengo un socket no se unió a la sala, no va a conseguir el evento. Entonces vamos a hacer todo eso dentro del contexto. Y aquí tenemos que comprobar si el, si tenemos una carga útil. Sí, si es así, vamos a buscar todas las habitaciones de la base de datos. Para poder hacer eso, tenemos que crear una constante aquí y obtener la instancia de origen actualizada. Así que aquí, crea nuestra fuente de datos. Y vamos a usarlo para que quepa todas las habitaciones. Así que aquí en Data Source, gestor de puntos, vamos a usar el manager y luego repositorio Git. Y vamos a conseguir el repositorio de salas. Así que importa la entidad de habitación y úsala aquí. Espacio para eso desde aquí. Y portar la entidad de habitación. De la carpeta de habitaciones dentro de la habitación. Seleccione las entidades AINE como la entidad de habitación. Ahora aquí usamos la sala para seleccionar el repositorio de salas. Y luego usaremos, crearemos un constructor de consultas, un alias para la habitación. Y luego vamos a seleccionar todas las habitaciones que contengan el ID de usuario. Entonces, para eso, necesitamos usar la unión interna para unir todas las tablas de usuarios de los usuarios de puntos de Roma y agregar un alias para la matriz de usuarios. Y luego agregue una condición where aquí y recorra toda la matriz de usuarios y solo seleccione a todos los que tengan un ID de usuario igual a la variable ID. Y vamos a obtener el ID del usuario de la carga útil, ese ID de usuario. Bien, ahora agregaremos otro método aquí para conseguir muchas habitaciones. Y aquí vamos a crear una constante y ponerle nombre Habitaciones. Y esperar el resultado. Bien. Ahora aquí vamos a obtener una matriz de objetos froms. Y luego vamos a usar el socket IO de la solicitud para unirnos a ellos. Así que aquí, Quest Dot socket IO que se unen. Y este método nos va a permitir agregar habitaciones al zócalo. Y puedes ver aquí que podemos agregar ya sea una habitación individual o una variedad de froms. Ahora, necesitamos una referencia única para, es verdad. Para nosotros. Tenemos el ID de habitación como referencia, pero es habitación. Es, es habitación de referencia debe ser una cadena. Así que aquí tenemos una cadena y aquí tenemos una matriz de cadenas. Pero como saben, las identificaciones de las habitaciones son números. Entonces vamos a convertirlos en cadenas. Y vamos a crear una matriz de identificadores de cadenas. Aquí, crea un ID de habitaciones, y luego toma la matriz de habitaciones y mapea a través todas las habitaciones y devuelve una cadena usando la cadena literal, y devuelve el id de punto de habitación Ahora tenemos una matriz de cadenas. Entonces pasémoslo aquí. IDs de habitaciones. Bien, ahora terminamos. Pero aquí tenemos un error diciendo que la carga útil no tiene una propiedad de ID de usuario y que la carga útil es de tipo string o una paleta JWT. Podemos arreglarlo comprobando si el tipo de carga útil no es igual a cadena. Y tenemos que comprobar si tenemos una carga útil. Sí. Entonces podemos usar la propiedad ID de usuario. Ahora bien, así es como podemos unirnos a las salas. En el siguiente video, vamos a aprender a emitir eventos a un grupo específico. 41. Emite mensajes a una habitación específica: Ahora, para poder emitir eventos, tenemos que usar la constante IO, que representa la instancia de socket IO, y tenemos que pasarla al valor de retorno de los métodos context para que podamos usarla dentro de nuestros resolvers. Entonces aquí dentro de este objeto, agregue A0 y guarde el modelo en archivo ts. Luego dentro del archivo de servicio de puntos de habitación. Aquí vamos a usar la instancia IO dentro del método ad message to room. Así que aquí vamos a agregar como argumento de tipo server y asegurémonos de agregar el signo de interrogación aquí. Porque a veces se puede conocer. Ahora para el servidor aquí, puede importar esto desde el paquete socket IO. Y luego después de actualizar la sala y agregar un nuevo mensaje a la matriz de mensajes, podemos verificar aquí. Si no tenemos IO, entonces ese caso, vamos a emitir un nuevo evento usando el método image. Ahora bien, este método acepta dos argumentos. El primer argumento es el nombre del evento, y el segundo argumento es cualquier tipo de datos. Puede ser una matriz u objeto, o una cadena, o incluso un json. Ahora otra vez, Jason es solo la cuerda. Entonces aquí podemos nombrar el mensaje del evento. Y para los datos aquí, vamos a enviar un objeto que contiene el mensaje y el ID de sala. Ahora, en este caso, vamos a emitir este evento para todos los usuarios conectados. Pero eso no queremos. Queremos emitir este mensaje a una regla específica. Entonces vamos a usar otro método aquí antes de que emitan. Este método es el método y pasar el ID de sala como una cadena. Entonces usemos la cadena literal y agreguemos el ID de habitación. Ahora, emitiremos este mensaje, este evento, a sólo dos usuarios que hayan participado en esta sala. Ahora, vamos a guardar esto. Y dentro de la habitación que resuelva y dentro del resolver enviar mensaje. Vamos a pasar el IO aquí pasado el AL desde el contexto que I0. Eso es. Ahora, vamos a guardar esto y esa es la APR. 42. Prueba de servidor de socket Io: No podemos escuchar eventos usando el sandbox de Apolo. Por eso he creado una aplicación muy sencilla donde podemos enviar y recibir mensajes escuchando eventos. Y toda esa lógica está dentro del archivo index.js. Puedes ver aquí que me estoy conectando al servidor. Y aquí tengo algunas consultas y mutaciones para mandar el mensaje. Y aquí estoy escuchando para el evento Connect y para el evento message. Y como pueden ver aquí, estoy paralizando los datos en el documento HTML. Entonces para ejecutar este servidor, hay que tener una extensión llamada Live Server. Entonces aquí tienes que buscar la extensión del servidor en vivo e instalarla en tu VSCode. Entonces encontrarás que obtendrías un botón aquí. Déjame desconectarme. Sí, encontrarás un botón que dice Go Live, da clic en él y luego tendrás un servidor en vivo. Entonces déjame volver a ejecutar el servidor y comenzar a probar la aplicación. Esto es, esta es la simplificación. Solo tengo un lugar donde tengo que poner el token JWT e iniciar sesión. Entonces aquí enviaremos los mensajes. Tengo dos navegadores aquí, así que dos instancias de la misma aplicación. Ahora necesitamos habilitar el curso dentro del servidor socket IO para poder conectarnos usando esta URL. Entonces copia esto. Y luego aquí dentro del módulo, el archivo ts, y dentro del servidor Stockdale, agreguemos un nuevo objeto y fijemos la opción del curso. Establezca el origen en esta URL y guárdela. Entonces volvamos aquí y asegurémonos de que has reiniciado tu servidor. Y vamos a sacar el token JWT del sandbox. Entonces aquí, asegúrate de iniciar sesión y luego tomar el token JWT y copiarlo, y luego pegarlo en una de estas aplicaciones. Haga clic en iniciar sesión. Y después he iniciado sesión como otro usuario y guardé el token. Entonces voy a pegarlo aquí. Asegúrate de hacer lo mismo. Haga clic en iniciar sesión. Y ahora probemos el servidor, vayamos a la arena alta y no funcionó. Y eso es porque aquí, bien, tenemos que quitar el lodo del final de la URL. Entonces volvamos al módulo, las lágrimas lejos. Retire el lodo de allí y asegúrese de que el servidor se haya reiniciado. Esperemos y luego volvamos a probar. Bien, puedes ver que ahora estamos conectados porque tenemos el mensaje conectado aquí. Ahora bien, si hago clic en la arena, deberíamos drogarnos aquí. Y aquí tal vez tengamos que recargar la aplicación. Entonces copiemos el token JWT, recarguemos y luego hagamos clic en iniciar sesión nuevamente. Y quizá lo mismo aquí porque tenemos que unirnos a las habitaciones. Y antes, creo que no hicimos eso en el servidor. Así que vamos a iniciar sesión y enviar alto. Bien, tenemos el mismo mensaje dentro las dos instancias aquí que mandan aquí como hola. Y aquí vamos, nuestra aplicación está funcionando. Ahora como dije al inicio de este video, encontrarás el código fuente adjunto para que puedas descargarlo y probarlo ella misma. 43. Migración de bases de datos con typeorm: Ahora hemos terminado de desarrollar nuestra API, pero aún necesitamos manejar una cosa, que es el caso donde queremos actualizar nuestras entidades. Ese caso, también necesitamos actualizar nuestra base de datos. Entonces, por ejemplo si quieres cambiar aquí FirstName a only name, claro que necesitamos actualizar nuestros archivos, pero lo más importante, necesitamos actualizar nuestras tablas de base de datos. Ahora, si lo vendimos en empujar nuestro proyecto incluyendo la base de datos en producción. Entonces no tenemos ningún dato importador. Podemos cerrar la base de datos y volver a ejecutarla de nuevo para eliminar todas las tablas y crear otras nuevas. Pero si ya empujamos nuestro proyecto a la producción, tenemos usuarios activos, por ejemplo , ese caso, no debemos seguir el primer enfoque porque no queremos perder todos los datos de nuestros usuarios. Y además va a ser un gran desastre para nuestra app. Entonces, lo que debemos hacer aquí, bueno, la fuente de datos de la app, tenemos esta propiedad sincronizada establecida en true, significa que vamos a actualizar nuestras tablas de base de datos cada vez que realices un cambio en nuestras entidades. Esta sustancia sólo va a cambiar los nombres y tipos de algunas columnas, pero no va a conservar ningún dato. Por lo que esta opción es tan peligrosa como cerrar la base de datos y volver a ejecutarla. Tan corta historia aquí, la única manera de evitar la pérdida de datos es mediante el uso de algo llamado Migración de bases de datos. Hay muchas maneras de hacerlo. Pero con type ramp, podemos generar automáticamente archivos que contengan consultas secretas que se encargarán de la integración. Entonces, en cierto sentido, la opción de sincronizar a falso y seguro. Y hay que asegurarse de que tenemos una base de datos en ejecución usando el comando Docker. Y tenemos que ejecutar nuestro servidor que podamos crear las tablas de usuario y los tipos de hueso. Bien, ahora salgamos a la entidad de usuario y cambiemos firstname a name y luego generemos una migración. Así que aquí, nombre, guarda esto, y vamos a actualizar el esquema GraphQL aquí de FirstName a name. Y lo mismo, sitio el tipo de usuario , FirstName, tunic, Save. Y aquí vamos a generar el esquema. Falló porque tenemos que generar esto salió por nosotros mismos. Así que aquí npm run generate y luego vamos a ejecutar el servidor de nuevo. Bien, npm empieza. Ahora no vamos a actualizar la base de datos porque tenemos la opción de sincronizar establecida en false. Entonces vamos a esperar el servidor aquí, y luego vamos a generar los archivos de migración. Bien, ahora abramos otra terminal. Y para generar la negación de Phi es que tenemos que instalar ese programa globalmente dentro de nuestro proyecto usando este comando. Sí. Y a veces es necesario agregar la palabra clave para obtener privilegios de administrador. Y si estás dentro de la máquina Windows y tienes que abrir una consola de administrador. Entonces no voy a hacer esto porque ya estoy en rampa tipo start globalmente dentro de mi sistema. Entonces voy a pasar al siguiente paso, que es usar el NP x, que es un paquete que viene por defecto sin GS y NPM. Y voy a correr cinta usando el nodo ts y el módulo CommonJS para JavaScript. Y vamos a ejecutar regresión, Carlin generar, y especificar la ubicación de nuestros archivos de iteraciones. Quiero que los sitios de la carpeta de origen, y dentro de una carpeta de Migraciones. Y luego obtendremos archivos con marca de tiempo y palabra clave de migración. Entonces vamos a obtener archivos con marca de tiempo, hace punto de regresión Sí. Bien, ahora tenemos que especificar la ubicación de la fuente de datos de la app. Entonces aquí, fuente de fuente de datos holandesa que sí, eso es todo. Ejecutemos este comando. Y aquí vamos. Hemos generado con éxito las peleas migratorias o un archivo. En este caso. Este archivo es un archivo mecanografiado con una clase. Y aquí puedes ver la duración del nombre y una marca de tiempo. Entonces aquí tenemos dos métodos arriba y abajo. Entonces el método add se va a ejecutar cada vez que ejecutemos esto, cada vez que ejecutemos esta migración. Y vamos a ejecutar esta consulta secuela que cambiará firstname a name. Ahora el método down se puede usar para revertir las inmigraciones como se representa aquí. Puedes ver la consulta aquí que cambiará nombre a FirstName. Entonces, si cambiamos de opinión y queremos revertir la inmigración, podemos ejecutar el método del pueblo. Y claro, todo esto se va a ejecutar automáticamente usando el tipo RAM CLI. Ahora para ejecutar esta regresión, hay dos formas de hacerlo. Primero, podemos usar el mismo comando aquí pero cambiado. Solo algunas cosas como mantener la fuente de datos y mover este nueve aquí y cambiar tu tasa para que se ejecute. Eso es. Y podemos dirigir la inmigración y vamos a obtener una base de datos actualizada. Puede hacer eso, o puede ejecutar la migración dentro o desde cinta automáticamente usando la fuente de datos aquí. Y al agregar la inmigración, inmigración es propiedad de gestión. Y vamos a especificar dónde se ubicaron nuestras migraciones. Entonces porque la tenia aquí no puede ejecutar Ts vice obviamente. Entonces vamos a apuntar a la carpeta dist que contiene las migraciones GS, las grasas. Entonces aquí, esto y luego fuente, y luego dentro de carpeta de emigraciones. Y luego ejecutar todos los archivos que tiene una migración holandesa fueron gs y termina con la extensión dot js. Sí, así que vamos a guardar esto. Y en realidad no son migraciones, Ejecuta integraciones de botones. Eso es. Vamos a usar la ejecución de inmigraciones para especificar que queremos ejecutar todas las migraciones cuando ejecutemos este servidor. Así que aquí se establece en true. Ahora vamos a guardar esto y vamos a ver que nuestro servidor se está reiniciando. Bien, ahora intentemos inscribirnos. Y esta vez no vamos a usar FirstName, sino que vamos a agregar solo nombre. Justo aquí dentro de la caja de arena, caja de arena Apolo. Ir a una mutación y seleccionar la mutación de registro. Entonces aquí, regístrate mutación y espera el token JWT o las entradas. Y puedes ver aquí que actualizamos el engranaje gráfico, pero no significa que hayamos actualizado también la base de datos. Pero vamos a comprobarlo en un minuto. Sí. Vamos a agregar todo eso aquí. Y permítanme ampliar esto. Bien, elija cualquier correo electrónico. Correo electrónico, email.com, apellido, nombre de usuario, digamos John. Contraseña. Contraseña. Vamos a inscribirnos. Y deberíamos obtener el token JWT. Si actualizamos con éxito la base de datos y lo hemos hecho con éxito, tenemos aquí el token JWT, y tenemos un usuario dentro nuestra base de datos con el nuevo nombre de propiedad en lugar de FirstName. Entonces déjame tomar si podemos devolver al usuario aquí, bien, podemos, así que déjame devolver todos estos campos. Y me voy a inscribir con otro correo puede tener un usuario uno, y eso es todo. Vamos a inscribirnos. Aquí vamos. Tenemos aquí conjunto de nombres de FirstName. Por lo que hemos actualizado con éxito nuestra base de datos utilizando la inmigración. Entonces así es como podemos hacer eso. Pero se asegura de establecer esto en falso siempre. O simplemente puede quitarlo de aquí. Voy a guardarlo solo para recordarle que esta propiedad tiene que ser falsa. Y para las inmigraciones, necesitamos ejecutar siempre archivos GFS. Y se puede ver dentro de la carpeta dist que tenemos carpeta de inmigración aquí tenemos dos expedientes para la inmigración. Y eso es porque probé esta API e intenté ejecutar la migración. Pero cuando tenemos múltiples niveles, migraciones de archivos, y los borras aquí, no significa que se va a eliminar del lado de la carpeta dist. Así que siempre asegúrate de eliminar la carpeta dist aquí y asegúrate de generar una nueva cada vez que ejecutes la API. De lo contrario, ejecutará todos los archivos de integración y corromperá su base de datos. Y recuerda también hacer lo mismo. El sitio aquí eliminó las inmigraciones porque ya las ejecutamos. Pero si quieres, puedes mantener los archivos de inmigraciones dentro de otra ubicación. Sí. No necesariamente. Al lado de la carpeta del proyecto. Ese caso, puedes usar el método down para revertir la inmigración si quieres hacer eso. Sí. Entonces, para nosotros, no es gran cosa porque solo estamos cambiando FirstName por name. Entonces voy a eliminar toda esta carpeta. Y eso es todo. Ahora cada vez que queramos migrar la base de datos, obtendremos nuevos archivos y los ejecutaremos desde el tipo alrededor de la fuente de datos. Ahora, antes de terminar este video, quiero mencionar una cosa que es que si quieres ejecutar las migraciones usando este comando, tienes que tener la propiedad migrations dentro de la fuente de datos, ¿verdad? Y puedes agregar inmigraciones ejecutadas o simplemente eliminarla de ahí. ¿Importa? Pero para ejecutar este comando, hay que tener la propiedad de inmigraciones y especificar la ubicación de las migraciones. Y eso es todo.