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.