Transcripciones
1. Introducción al curso: Bienvenido al curso
definitivo de NOJs. En este curso,
aprenderás todo sobre nodejs desde básico hasta avanzado en lenguaje sencillo y fácil de
entender Al final de este curso, comenzarás a construir aplicaciones
pend rápidas, escalables y seguras sin confundirte Déjame contarte
algunas de las principales características cubiertas en este curso. Entonces aprenderás conexión de
base de datos. Paginación e
infinance scrolling, autenticación de
usuarios, así
como iniciar sesión con Google e iniciar sesión
con funciones de Facebook, enviar correos electrónicos desde nuestro backend,
subir múltiples imágenes, manejar y registrar errores, aplicar
integración de pago completa usando papel, y también funciones de
chat en tiempo real
usando y también funciones de
chat en tiempo real socket enviando mensajes
uno a uno autenticación de
usuarios, así
como iniciar sesión
con Google e iniciar sesión
con funciones de Facebook,
enviar correos electrónicos desde nuestro backend,
subir múltiples imágenes,
manejar y registrar errores,
aplicar
integración de pago completa usando papel,
y también funciones de
chat en tiempo real
usando socket enviando mensajes
uno a uno, mostrando mecanografía
indicadores,
manejo del estado del mensaje, se envía entregado o visto, y también funciones de chat grupal. Ahora para aprender estos conceptos
avanzados, necesitamos una base fuerte. Entonces primero,
comenzaremos con el aprendizaje básicos de
nodejs como conceptos
centrales de nodo, módulos
integrados, Express, que es el framework de nod Js más popular y
más utilizado,
algunos conceptos
represores de JavaScript como
devoluciones de llamada, algunos conceptos
represores de JavaScript como promesas, Además, veremos
Mongo DB y mangos, y si entiendes conceptos
básicos claramente, entonces puedes implementar
cualquier tema avanzado de node jazz muy fácilmente También, quiero aclarar una cosa. En este curso,
no vamos a crear front end porque no es
el alcance de este curso, pero probaremos algunas características con front end para que
obtengas una comprensión clara del flujo de trabajo
completo de estas características. Te voy a dar código de front-end
listo para probar, así que solo tienes que
ejecutar ese archivo y
puedes probar algunas características.
Es muy divertido. Entonces, si sabes un
poco de node jazz, o estás confundido en conceptos, si no sabes
nada de no Jazz, entonces este curso es para ti. Durante este curso,
construiremos tres
aplicaciones back-end. En primer lugar, hacer aplicación para el
aprendizaje de conceptos básicos, y luego dos grandes
proyectos de
aplicación de comercio electrónico y aplicaciones de
redes sociales back-end, para el aprendizaje de conceptos avanzados de Jazz de
nodo. Ahora podrías preguntar ¿quién soy yo? Soy
ingeniero de software y además enseño programación en lenguaje fácil de
explicar usando
mi canal de YouTube, Dios los bendiga, y con
mis cursos en línea. En general, en este curso, obtendrás más de 200 lecciones en video
SD, implementación en el mundo
real, montón de ejercicio,
para que
no aprendas Js con
implementación práctica, algunos consejos y trucos,
y mucho más. Después de completar este curso, escribirás código No JS con confianza y usando las
mejores técnicas, así que inscríbete rápidamente y conviértete en
no Js o to No Jazz hero. CU en este curso.
2. Sección 01: qué es NodeJS: NodeJS es el más
popular para los desarrolladores, pero no es un lenguaje de
programación o no es un framework Entonces, ¿qué es realmente asentir
Js? A ver eso. Nojs es simplemente un
entorno de tiempo de ejecución para ejecutar código
JavaScript fuera
del navegador. ¿
Qué quiero decir con eso? Entonces, como sabemos, usamos código
JavaScript para cambiar los datos en la página web o
implementar alguna lógica, pero no podemos ejecutar Ja Script
fuera del navegador. Tenemos que vincular nuestro
archivo JavaScript con nuestro archivo SDML, y luego podemos
ejecutarlo en nuestro navegador Pero con nodejs, podemos ejecutar código
JavaScript fuera
del navegador Nodejs proporciona un entorno de
tiempo de ejecución para ejecutar código JavaScript. Los desarrolladores utilizan principalmente Nojz
para construir servicios backend llamados API o podemos dice interfaz de programación de aplicaciones Ahora podrías preguntar
¿qué es una API? Básicamente, es una forma para dos programas se
comuniquen entre sí. Yo te explico
eso con el ejemplo. Entonces aquí hay un restaurante. Estamos sentados en la mesa n, y queremos pedir algo de comida. En este caso, ¿qué haremos? No podemos ir directamente a la cocina y ordenar
nuestra comida al chef. En lugar de eso,
llamaremos a un mesero. Mesero, tomará nuestro pedido y luego se lo dará a la cocina Después de eso, la cocina
comienza a hacer proceso de nuestro pedido y darle
comida al mesero, y luego Mesero entregará
la comida a nuestra mesa Entonces aquí, el agua es como
un mensajero que toma nuestra solicitud y pasa esa
solicitud a nuestro destino. Y luego Mesero
recibirá mensaje de respuesta de ese destino
y nos lo traerá de vuelta Entonces en el mundo real, esta
tabla n en la que
estamos sentados es nuestra
aplicación cliente o front-end. Queremos obtener algunos datos sobre los alimentos que están disponibles
en el back-end. Llamaremos a Mesero, que es una API y le enviaremos solicitudes Ahora, API transferirá esa solicitud al
servidor o base de datos, que es nuestra cocina, y ese servidor o base de datos
compartirá la respuesta, que son los datos que queremos. Y API entregar los
datos de respuesta a nuestro cliente. Ahora entiendes
lo que es una API. API es una forma para dos programas se
comuniquen entre sí. Con NodeJS, podemos
construir API del mundo real. Además, podemos construir aplicaciones
súper rápidas en tiempo real con el nodo JS Estos servicios dan potencia a nuestras aplicaciones cliente como aplicaciones
web y
aplicaciones móviles muy útiles. ¿Sabes, Netflix,
Paper, Uber, Lin DIN, y muchas
compañías más famosas usan No Jazz? Sí, porque Noe Jaz hace que sus servicios sean súper
rápidos y eficientes Además, P hizo una gran
investigación sobre Noe Jaz. Eso te lo diré
en tan solo un minuto. Entonces, para resumir, Node Jazz
es un entorno de tiempo de ejecución, y es la
opción ideal para construir aplicaciones relacionadas con datos
altamente escalables
y en tiempo real Ahora podrías preguntar,
hay muchos frameworks y lenguajes como Java y asp.net, que también pueden construir servicios
wegen ¿Qué tiene de especial Node Jazz? ¿Por qué deberíamos aprender node jazz? ¿Por qué es tan popular? En primer lugar, sin jazz, podemos construir
servicios backend súper
rápidos y altamente escalables con bajo costo Además, la gente hizo un gran
experimento sin jazz. En ese experimento, la gente crea su aplicación
back-end
sin usar jazz y además construye la misma aplicación
con Java plus spring. Y ¿conoces el resultado
de ese experimento? Es realmente impactante. Encontraron una
aplicación de nodo construida dos veces más
rápida que la aplicación Java más primavera y
con menos personas. En Java plus spring, tienen cinco
desarrolladores, luego en node, solo
necesitan dos desarrolladores, y aún así esos dos desarrolladores construyen aplicaciones
más rápido en nodejs Además, la aplicación de nodo
toma 40% menos archivos. También, en Java, tienen
5 mil líneas de código, pero en nodejs,
solo tienen 1,500 líneas de código, que es tres x menos Por lo que la aplicación de nodo
es súper más rápida, un 35% más rápido de tiempo de respuesta
que la aplicación Java, y la aplicación de nodo puede servir casi dos X solicitudes por
segundo que la aplicación Java. Este resultado
conmociona a todos y la gente inmediatamente migró muchos
servicios de Java al nodo Jz Es realmente genial, ¿verdad? Segundo, con node jazz, obtenemos una base de código más limpia y
consistente porque con menos código, podemos hacer muchas cosas complejas. Además, es ideal
para la creación de prototipos, lo que significa que node Jazz
es rápido y fácil usar
al construir la primera
versión de una aplicación La primera versión se
llama como prototipo. También, como sabemos, en node jazz, usaremos JavaScript. Entonces, si eres amigo desarrollador
final, puedes aprender fácilmente node Jazz sin aprender un nuevo lenguaje de
programación. Y si aprendes tanto
frontend como backend, entonces puedes cambiar
tu rol laboral como desarrollador
full stack y mejorar tu carrera
y obtener más salario Y un beneficio más de Nojs es que Nojz tiene un gran ecosistema
de bibliotecas de código abierto, lo que significa que
hay código predefinido para hacer cosas particulares Para que podamos usar el código de otra
persona e implementar sus características
en nuestra aplicación. Entonces, en general, aprender
nodejs en 2025
o en el futuro definitivamente te
beneficiará a ti y a tu carrera de
programación
3. Historia de NodeJS: En la lección anterior,
vemos que No Jazz es un entorno de tiempo de ejecución
para ejecutar código
JavaScript fuera
del navegador. Pero veamos cómo
inventó Noe Jazz con una historia interesante Antes de 2009, JavaScript era como un superhéroe atrapado dentro de
un navegador como Chrome, Firefox y muchos más navegadores En todos estos navegadores, hay motor JavaScript. Cuando ejecutamos nuestro
código JavaScript dentro del navegador, navegador pasa ese código
al motor JavaScript. El motor JavaScript procesa ese código y lo
convierte en código de máquina, que nuestro equipo
puede entender. Por ejemplo, Microsoft Taj
usa Chakra Engine, Firefox, usa el motor Spider Monkey,
y Google Chrome, usa Fiat Engine, que es el
motor JavaScript más potente entre todos los navegadores Debido a estos diferentes motores
JavaScript, a veces el código JavaScript funciona manera diferente en
diferentes navegadores. Cuando usamos JavaScript solo
dentro de los navegadores, entonces hay muchas limitaciones. No podemos construir servidores ni realizar tareas de
Bend como
manejar bases de datos, autenticación de
usuarios o API. Ahora, en su momento desarrollador, Yandll entra en escena Él piensa, y si
tomamos el motor Vat y dejamos que JavaScript se ejecute en servidores en
lugar de solo navegadores. Toma el motor Vet, que es el motor
Js más rápido y registra ese motor
en código CPlusPlus Puede ejecutar código Jascip en
nuestra máquina y llamar a
ese software nodejs y eso es SOO nodejs inventado. Nod Js es un
entorno de tiempo de ejecución para ejecutar código
JavaScript porque
tiene el motor V JA Script Este entorno es poco diferente al que
tenemos en nuestro navegador. Al igual que en el script del navegador Ja, tenemos objeto de documento para
tratar con documento SDML También tenemos objeto Window. Estos objetos no nos metemos
en node Jazz y además
no queremos acceder a los objetos
document y Window porque en node jazz, estamos creando servicios
back-end, y los objetos document y Window
son para tareas front-end. Entonces, ¿por qué necesitamos documento y
ventana en el back-end? Con el nodo js, podemos hacer
muchas más cosas como
podemos acceder al sistema de archivos
para leer y escribir archivos. Podemos conectarnos con la base de datos
y almacenar datos en la base de datos, y también podemos construir
APIs rápidas y muchas más cosas. Ahora, una pregunta que podrías
hacer cómo es súper rápido nodejs, cómo funciona ningún Jz, y eso lo veremos
en la
4. Cómo funciona NodeJS: Así que hemos visto que
nodejs se utiliza para aplicaciones backend
súper rápidas y altamente escalables Pero cómo asentir Js es súper rápido. Entonces la razón por la que ningún Js es
súper rápido es por
su no bloqueo o podemos decir naturaleza
asincrónica del nodo js su no bloqueo o podemos decir naturaleza
asincrónica del nodo Ahora podría preguntarse
¿qué es asíncrono? Déjame explicarte
con un ejemplo sencillo. Imagina que aquí hay un restaurante. Tenemos una cocina aquí y
tenemos múltiples mesas. Ahora el primer cliente
quiere dar orden. Entonces aquí, nuestro mesero, ve a la mesa uno, consigue orden Digamos una pizza. Y entonces nuestro mesero le da esa orden al
chef en la cocina Ahora mientras sef elabora pizza, nuestro mesero
mirará otras mesas Digamos que la Mesa dos quiere
dar otro pedido, entonces mesero toma ese pedido y también lo da en la cocina Nuestro mesero individual puede
manejar muchas mesas. No necesita esperar a que el
chef complete un pedido, y luego puede servir otro pedido.
No hace falta que haga eso. Esto se llama de manera no
bloqueante o asíncrona,
y así es como funciona la
aplicación de nodo Este único weiter está funcionando como un solo hilo del nodo JS, cuya tarea es manejar la solicitud Por lo que este solo hilo puede usar para manejar múltiples solicitudes
sin bloqueo. Ahora al otro lado de
esta forma asíncrona, también
tenemos forma síncrona
o de bloqueo Entendamos eso también
con el mismo ejemplo. Entonces aquí, el cliente Vn
quiere dar orden. Nuestro mesero toma el pedido de
la mesa uno y se lo da a la cocina y nuestro auto comienza a prepararse para
ese pedido como pizza Ahora, como sabemos, la pizza
puede tardar tiempo en prepararse. En ese momento, en lugar de
manejar otras mesas, nuestro mesero espera ahí en la cocina para
completar ese pedido Supongamos que tarda 10 minutos, así nuestro mesero esperará ahí 10 minutos
en la cocina Después de eso, entrega esa
pizza a la mesa uno. Ahora, en ese momento, los clientes
de otras mesas tienen que sentarse porque nuestro mesero está
bloqueado por 10 minutos A esto se le llama como forma de bloqueo
o sincrónica. La mayoría de los marcos de
back-end más antiguos como w.net o Rails funcionan de manera
sincrónica o de bloqueo Entonces, cuando alguien envía
solicitudes en el servidor, servidor asigna un hilo
para manejar esa solicitud. Nuestro ejemplo, es weiter. Ahora imagina que tenemos solicitud para obtener
la lista de usuarios. Esta tarea necesita una
operación de base de datos que puede llevar tiempo. Ahora bien, si en ese momento
obtenemos otra solicitud, entonces para manejar esa nueva solicitud, necesitamos darles también
un nuevo hilo o weiter Ahora imagina en nuestro servidor, hay mil solicitudes. ¿Deberíamos crear hilo
para todas esas solicitudes? En caso afirmativo, entonces tenemos que
aumentar el número
de hardwares de servidor, lo cual es realmente costoso y lento Es por eso
que las aplicaciones que están construidas en asp.net o rieles necesitan más cantidad de servidores
y más mantenimiento Ahora, en ese momento, el nodo
viene en la imagen, y como hemos visto, nodo usa forma asincrónica
o no bloqueante Por supuesto, podemos
hacer que la aplicación asp.net o Rails funcione como
aplicación sin bloqueo o
asíncrona Pero para eso, necesitamos
hacer un trabajo extra. otro lado, las
aplicaciones de nodo son trabajos por defecto de manera asincrónica
o no bloqueante Por lo que es realmente rápido
y fácil de administrar. Cuando obtenemos múltiples
solicitudes en el servidor del nodo, el nodo tiene un solo hilo. Ese solo hilo puede
manejar una solicitud. Ahora, si esa tarea lleva tiempo, busca algo de la base de datos, entonces nuestro hilo único agrega
esa tarea en la lista llamada evento Q y pasa a otra solicitud y comienza a
manejar esa solicitud. Este evento Que notificará al
nodo cuando obtengan datos
de la base de datos, y luego nuestro nodo enviará
esos datos a la solicitud. Entonces, de esta manera,
nuestro único hilo puede servir a múltiples usuarios, y es por eso que nodejs
es una gran opción para aplicaciones de uso intensivo de datos o
relacionadas con la red Puede servir a más clientes
sin agregar más servidores, y es por eso que las aplicaciones de nodo también
son altamente escalables. Ahora la pregunta
es, ¿deberíamos usar node Jazz para todo
tipo de aplicaciones? Y la respuesta es no. No debemos usar nodo para aplicaciones intensivas de
CPU. Ahora bien, ¿qué es el intensivo CIPI? uso intensivo de CPU significa
aplicaciones que tienen tareas relacionadas con la CPU como aplicaciones de edición de
video o
edición de fotos. En este tipo de aplicaciones, tenemos mucho
cálculo que puede usar CPU pocas opciones, que hace el
sistema de archivos o red. Y como sabemos, nodo es una
aplicación de un solo hilo cuando realiza operaciones relacionadas con el
CPI cuando otros clientes tienen que esperar
para completar esa tarea Aquí, node perderá su
ventaja de ser asíncrono, y por eso no debemos usar node para la aplicación
SIPEIntensivo Puede usar el nodo para aplicaciones de entrada y salida, relacionadas con la
red o relacionadas con
datos en tiempo real. Solo recuerda que no debemos usar nodo para
aplicaciones intensivas de CIPI De lo contrario, el nodo se puede utilizar para la mayoría de todo tipo
de aplicaciones. Entonces entendemos cómo asentir Jazz es más rápido que otros frameworks
back-end No te preocupes por las teorías. A medida que construyes proyectos
en el nodo Jaz, entenderás
todo muy fácilmente Entonces comencemos a aprender
nodo Jaz prácticamente.
5. Instalación de Node JS en el sistema: Veamos cómo instalar
NodeJS en nuestro sistema. En primer lugar, comprobaremos si Nojs ya está en
nuestro sistema o no Así que abre el
símbolo del sistema en Windows, y si estás
usando Mac o Linux, luego abre tu
terminal y escribe el nodo, versión
dash dash,
y presiona Enter. Ver aquí me sale este
tipo de mensaje de error, nodo no es reconocido como un comando interno o
externo. Esto significa que el nodo no está
instalado en mi sistema. Si llegas aquí la versión nodejs, lo que significa que el nodo ya está
instalado en tu sistema, pero
te recomiendo encarecidamente que instales la última
versión de tabla del nodo Así que dirígete a browser
y opennjs.org. En este sitio web, obtenemos una versión
descargada de Nodjs LTS, lo que significa la última versión de tabla que nodo
recomienda oficialmente usar En el momento que estoy
grabando este curso, versión
latestable es 22.14 0.0 Pero en el futuro,
podría haber versión actualizada disponible. Así que simplemente haz clic en esta versión, y comenzará la descarga. Una pregunta que podrías hacer, este curso
es relevante para
las futuras versiones de nodo? Y la respuesta es sí. Este curso
seguirá siendo relevante para cualquier versión de JS de nodo
porque en este curso, nos vamos a centrar fuertemente en los fundamentos del nodo JS, y puedes usar esos fundamentos
en cualquier versión de JS de nodo Así que no tienes que
preocuparte por ninguna actualización de JS. Si ocurre alguna actualización importante, entonces actualizaré este
curso de acuerdo a eso. Ahora nuestra configuración está
lista para instalar. Así que vamos a abrirla. Déjame poner aquí Da clic en siguiente, acepta los términos y
condiciones y da click en siguiente. A partir de aquí, cambias
la ruta de instalación, pero en mi sugerencia,
déjala como está. Nuevamente, da clic en siguiente
y siguiente e instálelo. Y ya está hecho. Ahora, vamos a comprobar que Nojs está
instalado correctamente o no. Así que vuelva al
símbolo del sistema o terminal y escriba la versión de los nodos,
y presione Enter. Ver, ahora llego aquí asentir
Gs versión 22.14 0.0. Así que instalamos con éxito
nodo en nuestro sistema. Otra cosa que necesitamos en
este curso es editor de código. El editor de código favorito personal es código de
Visual Studio o código VS, que es uno de los
mejores editores de código. Por supuesto, puedes usar
cualquier otro editor de código, pero no muchos editores tienen ese
poder que tiene el código VS. Y también, en este curso, voy a compartir mis consejos
y trucos para el código VS. Entonces, si no tienes código VS, entonces puedes ir a
code.visualstudio.com, descargar código VS e instalarlo Es realmente simple.
Ahora en la siguiente lección, escribiremos nuestro código JS de
primer nodo.
6. Escribir código para el primer nodo: Escribamos nuestro código JS de
primer nodo. Abra una carpeta en la que
desee crear un proyecto. Aquí, abro
la carpeta Project, y en esta carpeta, creo una nueva
carpeta, digamos, primer proyecto y simplemente abro
este proyecto en código VS. Bueno. Este código VS parece un poco más pequeño para este
curso. Así que déjame acercarlo. Por lo general, no me
acerco tanto, pero con este Zoom, se puede
ver lo que estoy haciendo con claridad. Perfecto. Ahora vamos a
crear un nuevo archivo aquí. Digamos índice punto js. Puedes usar cualquier nombre. Depende totalmente de ti. Ahora dentro de este archivo, podemos escribir nuestro código
JavaScript normal, que estamos acostumbrados a escribir. Así que simplemente vamos a crear una variable llamada saludo
igual a buenos días. Y después de eso,
simplemente consultamos ese registro. Hola coma y simplemente
adhiera la variable de saludo. Guarde este archivo.
Ahora podría preguntarse, ¿cómo podemos ejecutar este código
sin nuestro navegador? Porque anteriormente, estamos ejecutando JavaScript
usando navegador. Entonces, para ejecutar este código sin
sillas, necesitamos terminal. Y usa nuestro terminal del sistema y abre nuestra carpeta de proyectos
en esa terminal, o podemos usar el terminal de código VS. Siempre uso terminal VSCode
porque es fácil de abrir,
ir al menú del terminal
y seleccionar nueva terminal, o puedes presionar
Control más Se abrirá aquí terminal. Ahora para ejecutar este archivo
index dot js, simplemente escribimos node, space, y nuestro nombre de archivo, que es index dot js. Tu nombre de archivo es apt Gs, entonces tienes que escribir aquí nodspace app dot
js y presionar Enter Ver, aquí tenemos
nuestra línea de Consola. Entonces enhorabuena. Escribes
tu primer código de nodejs. Ahora para ocultar esta terminal, podemos volver a presionar
Control más Bectig Ahora aquí también podemos agregar
función y llamar a esa función, igual que estamos haciendo
en JavaScript regular. Así que después de la consola punto
log en la nueva línea, podemos crear una
función print message. Y en los corchetes de Cully, simplemente
consolamos el
registro de puntos. Que tengas un buen día. Y después de esta función, simplemente
llamamos a esta función
print message, para que podamos obtener este mensaje de
consola, guardar este archivo, y para
volver a ejecutar este archivo, ¿qué escribimos
en el terminal? Escribir, escribimos
espacio de nodo índice punto js. Mira aquí conseguimos esto
tanto Consola Loui. Así que podemos usar aquí
establecer la función de tiempo de espera, establecer la
función de intervalo, etcétera. Podemos agregar casi
todo el código JavaScript en la aplicación de nodo. Ahora podrías preguntar qué tipo de código
JavaScript no podemos agregar
aquí en el proyecto JS del nodo. Así que en el proyecto NodeJS, podemos agregar todo tipo
de código JavaScript,
excepto escribir código de
manipulación de doom como punto de
documento Obtener elemento o
ubicación de punto de ventana, etcétera,
porque como sabemos, cualquier código que
escribamos en la aplicación de nodo, se
ejecutará en servidor
y en servidor, ejecutará en servidor
y en servidor, ¿cómo podemos acceder a los objetos document Déjame mostrarte prácticamente
lo que sucederá si usamos documento en este archivo JS de punto
índice. Comento todo este código
usando Control plus slash o Command plus slash y simplemente aquí mismo,
consola dot log Imprimir aquí objeto de documento. Guarda este archivo, y
en el terminal, volvemos a ejecutar node index dot js, o simplemente podemos presionar un perro. Traerá
mando previo para nosotros. Ver, aquí obtenemos error que dice documento no está definido, y es A mostrándonos la línea. Entonces no podemos usar aquí el código de manipulación de
fatalidad. Otra cosa es
que tampoco podemos usar aquí
eventos específicos del navegador como Alert. Entonces en el lugar de esta consola
agregamos Alert, saluda. Guarde este archivo y volvamos a
ejecutar este archivo. Ver aquí obtenemos La alerta
no está definida porque de nuevo, estos son eventos
relacionados con el navegador. El servidor no puede mostrar
Alert en el navegador. Es el front-end
quien puede mostrar Alert. Así que para resumir en archivo
índice Js o cualquier otro
archivo en el proyecto de nodo, escribimos código JavaScript para servidor podemos usar
varios módulos, manejar SDDPRquest, acceder a los archivos de nuestro sistema,
conectarnos a la base de datos, construir aplicaciones en tiempo real, y muchas cosas más que
aprenderemos paso a
paso en No te preocupes, dominarás
nodo después de este curso. Solo tienes que codificar
junto conmigo e intentar escribir código después de
entenderlo correctamente. No solo copiar y pegar. Hay que entender
por qué escribimos ese código específico y
luego lo implementamos. Es realmente simple.
7. Haz que el código de VS sea genial [OPCIONAL]: En la lección anterior,
si te preguntas cómo se vuelve a formatear
mi código
cuando guardo el archivo Para eso, estoy usando una de las mejores y más populares extensiones de código
VS llamada pretty. Instale esta extensión. Ahora tenemos que hacer
poco ajustes para instalación de Pretty E. Así que
en la sección de instalación, desplácese hacia abajo hasta la sección de
formateador por defecto Y aquí, copia estas dos líneas de código sin corchetes Cully. Ahora, abre la configuración desde
el icono de engranaje inferior, ve a ajustes, y en
la esquina superior derecha, desde aquí, abre ajustes,
toques y archivo, y en la última línea, agrega coma y luego en la
nueva línea, más allá de esas líneas Ver este archivo. Ahora
vuelve a la configuración y el formato de
búsqueda al guardar y asegúrate de que esté
verificado y hecho. Además, muchos alumnos me preguntan qué tema y fuentes
utilizo para mi código VS. Entonces actualmente, estoy usando
mi tema favorito, que es Au Mirage Warder Puedes descargarla
desde el panel de extensión. Este tema no es muy
brillante ni muy oscuro, así que es bueno para nuestros
ojos y se ve bien. El nombre de la fuente que
estoy usando es Monisa. Cual es la fuente paga, puedes descargar esta fuente de
la manera que quieras No puedo decir nada más. Instálelas en tu sistema. Y luego desde la configuración del código
VS, busca aquí familia de fuentes y agrega tu nombre de fuente desde el
principio, y eso es todo. Puedes usar cualquier tema
y fuentes que te gusten. Depende totalmente de ti. Y si tienes un gran combo, entonces puedes agregar tus capturas de pantalla de código
VS en la sección de preguntas y respuestas Me encanta ver eso,
y eso es todo. Estamos listos para irnos. Así que vamos a
sumergirnos en este nodo código JS.
8. Sección 02: qué son los módulos: Bienvenido a la segunda sección
del curso Ultimate Node JS. En esta sección,
aprenderemos todo lo que necesitamos saber sobre los módulos
como ¿qué son los módulos? ¿Cómo podemos crear
nuestros propios módulos? Además, tenemos algunos
módulos integrados como path, sistema
operativo, file system, módulo DTP
para crear servidor, y mucho más Empecemos con
lo que son los módulos. Pero antes de eso, déjame
darte una situación. En la sección anterior,
creamos este archivo JS de punto índice. Ahora imagina que este es el proyecto
Comenzó de Netflix, que es el proyecto realmente grande. Este proyecto tiene muchas características
como conexión a base de datos, autenticación de
usuarios, pasarela de
pago, también muchas otras API. Ahora imagina que agregamos este código de
todas las características en
un archivo G de punto de índice único. ¿Cómo lograrás
esto? O si alguien te
dijo que agregaras otra
característica en un mismo proyecto, entonces imagina lo confuso
y difícil que será. ¿Cuál es la solución
aquí? Piénsalo. Aquí, podemos crear por separado estas características en
diferentes archivos y luego simplemente ingresarlas en
el archivo de índice principal NodeJS Estos diferentes archivos pequeños se denominan como módulos en el nodo JS. Si tuviera problema en la conexión a la
base de datos, puedo ir al módulo de
conexión a la base de datos y resolver o mejorar ese
código de forma independiente. En resumen, el módulo es una pieza de código que realiza
una tarea específica. Ejemplo, imagina que
estás construyendo un auto. Un auto tiene muchas
partes como motor, llantas, hojas, etcétera Cada pieza se construye por separado, y también puede ser reemplazada o reparada sin
afectar a todo el automóvil. Ahora en el nodo JS, los módulos
funcionan de manera similar. Cada módulo representa una parte diferente de
nuestra aplicación, y estos módulos pueden trabajar juntos para formar una solicitud
completa. Y es por eso que los módulos son parte
muy importante del nodo JS. Ahora podemos dividir
los módulos en tres tipos. El primero son los módulos locales. Estos son los módulos
que crearemos para nuestra propia aplicación como módulo
DB para conexión a
base de datos, módulo de
pago para manejo de
pagos, etc. El segundo son los módulos centrales. Estos son los módulos incorporados
que obtenemos con el nodo JS. Ya están disponibles
en todas las aplicaciones de nodo. Por ejemplo, FS para file system, STTP para crear
servidor STTP o hacer STTPRquest SO para la funcionalidad
relacionada con el sistema operativo ,
y muchos más. No te preocupes, te explicaré nuestros módulos centrales en las próximas
lecciones de esta sección. Ahora el tercero son los módulos de
terceros. Estos son los módulos que son creados y publicados
por otros desarrolladores. Si queremos usarlos, entonces tenemos que instalar manualmente esos módulos en nuestro proyecto. Por ejemplo, express dot
js es un módulo de terceros, lo que nos ayuda a
construir API rápidamente. Otro módulo es Mangosta
para Mongo Div etcétera. Se trata de módulos de terceros
construidos por otra persona, y también podemos
utilizarlos en nuestro proyecto. No te preocupes por
todas estas cosas, iremos paso a paso
y aprenderemos cada una de ellas. Entonces, para resumir rápidamente, módulo es un trozo de código
que realiza una tarea específica Podemos almacenarlos
en archivos separados, y luego podemos usarlos
en cualquier otro archivo. Ahora en la siguiente lección, crearemos nuestro propio módulo.
9. Crear tu propio módulo: Construyamos nuestro
propio módulo personalizado. Así que aquí en nuestra aplicación, creamos un nuevo archivo llamado
math operations dot js. En este módulo, agregaremos alguna
operación matemática básica y luego reutilizaremos en nuestro archivo principal
index dot js. Entonces, antes que nada, vamos a
crear una nueva función llamada AD y pasar aquí dos
parámetros llamados A y B. Y dentro de esta función, simplemente
escribimos adición de estos dos
parámetros, A más B. Podrías preguntar, ¿cómo podemos usar esta función dentro de
nuestro archivo index dot js? Porque todos sabemos cuando
definimos la función dentro de un archivo, solo
podemos usarla en ese archivo, no fuera del archivo. Entonces, para usar esta
función ad en otro archivo, tenemos que exportar esta función desde este módulo de
operaciones matemáticas, y luego podemos
importarla en el archivo index dot js. Pero antes de eso,
déjame mostrarte algo. Así que en nodejs todos los archivos tienen un objeto llamado en
ese objeto módulo, tenemos muchas
propiedades lo que da información sobre ese módulo
en particular Déjame mostrarte
eso prácticamente. Después de esta función, simplemente escribimos el registro de puntos de la
consola e
imprimimos aquí el objeto del módulo. Ahora tenemos que ejecutar este módulo de operaciones
Mth. Así que abra terminal y escriba nodo, matemáticas, y presione tabulador. Se autocompletará el nombre
del archivo. Ver, aquí obtenemos este objeto módulo con
un montón de propiedades. El primero es ID, que es el
ID único para el módulo. A continuación, tenemos camino, que es el
camino completo de nuestro proyecto. Después de eso, tenemos export y
se establece en objeto vacío. Adivina correctamente, si
queremos exportar add function, entonces tenemos que agregar su
función en este objeto de exportación. Después de eso, tenemos el nombre de archivo
actual con la ruta completa y un montón
de otras propiedades. Ahora bien, ¿cómo podemos agregar función dentro de
este objeto de exportación? Es realmente simple. Así que aquí escribimos módulo
dot export dot add, que es el nombre de la propiedad
es igual a agregar función. Asegúrate de que no llamamos
aquí add function. Simplemente agregamos aquí el nombre de la función. Sé que piensas que esto
es un poco confuso, pero créeme, no lo es. Déjame mostrarte
eso. Así que simplemente mueve este registro de puntos de consola debajo de
este módulo exportaciones de puntos. Guarde este archivo, y
en la terminal, nuevamente
ejecutamos este archivo. Se puede ver en el objeto
export, tenemos add property y
está configurado para agregar función. Entonces, si confundes por
el mismo nombre de propiedad, entonces también podemos cambiar aquí el nombre de la
propiedad como agregar números Guarde este archivo y
volvamos a ejecutar este archivo. Ver, aquí obtenemos números de
anuncio
nombre de propiedad para agregar función. Ahora también podemos exportar más de una función
desde el módulo. Así que aquí creamos una
función más llamada sub pista. Nuevamente, necesitamos aquí
dos parámetros, A y B, y dentro de
esta función, simplemente devolvemos A menos B. Ahora, ¿me pueden decir
cómo exportar esta función? Bien, simplemente escribimos aquí módulo dot export dot resta igual a nuestra función
substract Mira si los cambios
y échale un vistazo. Volvamos a ejecutar este archivo. Ver, aquí obtenemos esta nueva propiedad substract
a nuestra función abstracta Además, no es necesario que solo
podamos exportar funciones
desde nuestro módulo. También podemos exportar variables
u objetos o array, básicamente cualquier cosa que queramos. Supongamos que aquí en la parte superior, creamos una variable
llamada name. Igual a digamos código
más U y otra variable, número de la
suerte es igual
a, digamos siete. Ahora bien, si queremos exportar
solo la variable name, entonces solo podemos agregar aquí module dot export dot
name equals to name. No necesitamos exportar
la segunda variable si no la vamos a usar
en ningún otro archivo. Sólo exportar variables
o funciones que necesitamos usar en algún
otro lugar de nuestra aplicación. Ahora aquí hay una cosa. Estas tres líneas de
código se ven un poco feas porque estamos repitiendo las exportaciones de punto de
módulo. ¿Hay alguna
forma de atajo para escribir esto? Sí, déjame mostrarte. Entonces aquí podemos escribir
algo como esto. El punto del módulo exporta es igual a, y aquí pasamos objeto y agregamos todas las propiedades que
queremos exportar en este único objeto. Entonces escribimos, agregamos, cool, función, agregamos
otra propiedad, función
de colon de
subpila, subpila y podemos establecer
name a nombre de variable Este código y estas tres
líneas de código funcionan igual porque aquí estamos
configurando propiedades una por una. Pero aquí los
ponemos directamente en objeto. Eliminemos estas tres
líneas. No lo necesitamos. Guarde este archivo. Vamos a
borrar terminal usando CLS, y luego ejecutar el mismo archivo y ver aquí obtenemos el mismo objeto de
exportación que antes Entonces, si sabemos cuando nuestro nombre de propiedad y el nombre del valor de
paso es el mismo, entonces podemos eliminar esta
columna y nombre de variable. Entonces este agregar significa
agregar columna agregar. Igual que eliminamos esta columna substract
y también nombre de columna Entonces hay múltiples formas de
escribir el mismo código. Guarda esto y vamos a
ejecutarlo una vez más. Ver aquí nuevamente obtenemos
el mismo objeto de exportación. Ahora tenemos propiedades en
el objeto de exportación y podemos acceder a este objeto de exportación en cualquier otro archivo
de este proyecto, y lo veremos
en la siguiente lección.
10. Cómo acceder a módulos en otro módulo: En la
lección anterior, creamos nuestro módulo de operones matemáticos y
exportamos tres propiedades Déjame también quitar esta
línea de consola. No lo necesitamos. Ahora veamos cómo podemos acceder a estas propiedades en
el archivo JS punto índice o cualquier otro archivo. Eliminemos este código anterior. No lo queremos. Ahora para
importar cualquier módulo en nuestro archivo, hemos requerido
función en el nodo Js. Llamamos a esta función aquí y dentro de esta
función en códigos, entraremos en nuestra ruta de módulo. Entonces como podemos ver estos dos
archivos están en la misma carpeta, así podemos escribir aquí
dot forward slash, que representan carpeta actual Y aquí escribimos nuestro nombre de archivo, operaciones
matemáticas punto js. O también podemos eliminar
esta extensión dot js porque si no pasamos
extensión con nuestro nombre de módulo, entonces por defecto, nodejs
tomará punto js como ¿Y si tenemos este archivo de
operaciones matemáticas en la subcarpeta? Entonces tenemos que escribir
aquí el nombre de la carpeta primero, y después agregamos el nombre del archivo de barra diagonal Y si tenemos este
módulo de operaciones Mth en la carpeta padre, entonces aquí en el
lugar de punto único, usaremos punto doble No te preocupes con la práctica,
aprenderás esto. Por ahora, solo escribe operaciones matemáticas de barra
diagonal. Esta función requerida
devuelve objeto de exportaciones de este módulo que obtenemos aquí interminal.
Déjame mostrarte. Aquí, almacenamos este valor en una variable llamada operaciones matemáticas. Puedes tomar cualquier otro nombre, pero sobre todo, usamos el
mismo nombre que ese módulo. Entonces no necesitamos
recordar otro nombre, así que no necesitamos
recordar otro nombre. Aquí simplemente consil
punto log operaciones matemáticas, guardar los cambios, y ahora podemos ejecutar este
índice punto js archivo Nodo índice punto js. Ver, aquí obtenemos el objeto con esas tres propiedades
que agregamos en el objeto export
en Mth Operations Aquí en el lugar de operaciones matemáticas
simples, podemos hacer metoperones punto AD Y aquí pasamos argumentos, digamos 20 y 30. Guarde estos y volvamos a
ejecutar este archivo. Ver, aquí obtenemos la
suma de dos números. Así que usamos con éxito una
función de otro módulo. puede ver lo sencillo que es
crear módulo y
usarlo en otros archivos. Simplemente tenemos que exportar
desde ese módulo, y luego con require, podemos usar esa exportación
en cualquier otro archivo. Así podemos usar otras
propiedades como metoperones punto Subpila
o metoperones punto Pero podemos ver cuando
necesitamos usar alguna de
estas propiedades, necesitamos escribir este punto de operaciones
matemáticas. Así que podemos usar aquí el tema
Javascript llamado destructuración de objetos Probablemente sepas de
esto porque es
puro tema de Javascript. Pero veamos esto rápidamente. Entonces aquí escribimos nuestro objeto y queremos extraer sus
propiedades como variables. Entonces en el lugar de los
metoperones punto AD, solo
tenemos que escribir edD Entonces al principio,
escribimos Cs ahora aquí, tenemos que usar llaves
iguales a nuestro nombre de objeto, que es operaciones matemáticas. Ahora bien, ¿puedes pensar lo que tenemos que escribir en estas llaves? Tenemos que escribir aquí nombre de
propiedades, que queremos extraer de
este objeto como variable. Escribimos aquí add,
que es nuestra función, substract, que es
otra función, name, que es nuestra variable Ahora, en el lugar de este anuncio de punto de operaciones
matemáticas, simplemente
podemos usar este add y también
podemos agregar aquí nombre. Guarda este archivo y vamos a
ejecutarlo en nuestra terminal. Ver, aquí sacamos
50 y nuestro nombre. Además, en el lugar de hacer reestructuración de
objetos
en otra línea, algunos desarrolladores experimentados les gusta a
algunos desarrolladores experimentados les gusta hacer en la misma línea requerida. Entonces simplemente obtuvieron
este objeto de aquí y simplemente lo pegaron en el lugar de este nombre de operaciones
matemáticas. Entonces no necesitamos
esta línea extra, guarda este archivo y
volvamos a ejecutarlo. Ver, aquí obtenemos
el mismo resultado. Si te confundes de esta manera de estructuración
objetiva, entonces simplemente puedes usar el método de anuncio de punto de
operaciones Mth Está totalmente bien. Al final
del día, nuestro código debería funcionar.
11. Ejercicio para el módulo propio: Ahora es el momento de
poco ejercicio, para que puedas revisar los módulos. Entonces aquí tienes que crear un nuevo módulo en tu
aplicación llamado Logger. Y dentro de esto, hay
que exportar dos funciones. Una función devolverá fecha
actual con
esta expresión, y otra función devolverá año
actual con
esta expresión. Y luego hay que consolar este resultado en el archivo JS
index dot, igual que lo hacemos en el módulo de
operaciones matemáticas, y nuestra salida debería
verse así, probarlo y luego
ver la solución. Entonces espero que completes este ejercicio o al menos
intentes resolver este ejercicio. Ahora veamos la solución. En primer lugar, creamos un nuevo
archivo llamado logger dot js. Ahora aquí, tenemos que
agregar dos funciones. Entonces la primera función
es fecha actual, y en el corchete GLY, simplemente devolvemos nueva fecha
punto dos cadena de tiempo Ahora vamos a duplicar
esta función, seleccionarla y presionar
Mayús más alterar más flecha hacia abajo o Mayús
más Opción más flecha hacia abajo. Cambiemos el nombre de la
función al año
actual y en el
lugar de dos cadenas de tiempo, escribimos obtener año completo. Ahora, ¿recuerdas cómo
exportamos estas funciones? Usamos exportaciones de punto de módulo, y aquí simplemente lo configuramos
para objetar y dentro de él, escribimos fecha
actual a fecha actual y año actual
a año actual función. O podemos simplificarlos
quitando el mismo nombre. Genial. Entonces exportamos
estas funciones. Ahora solo necesitamos ingresar estas funciones en nuestro archivo JS de punto
índice. Entonces en la parte superior, agregamos función
requerida y simplemente
pasamos aquí nuestra ruta del módulo, que es dot forward
slash porque este módulo también está en la
misma carpeta y logger Ahora podemos almacenar su valor de exportación en la
variable llamada logger. O como hicimos en la lección anterior, podemos desestructurarlo así Así que agregue aquí calibrakets
y vea aquí obtenemos propiedades de fecha
actual y año Ahora, después de esta consola, agregamos otra consola y simplemente llamamos aquí ambas
funciones una por una, fecha
actual y año en curso. Guarde los cambios y ejecutemos este archivo
en la terminal. Es un nodo índice sillas, y vea aquí obtenemos nuestra salida. Para que puedas ver lo
sencillo y fácil que es
crear nuestros propios módulos y
acceder a ellos en otros módulos.
12. Uso del módulo de trayectorias: Entonces, hasta ahora, hemos visto
cómo trabajar con módulos locales. Ahora veamos algunos
módulos core o podemos decir módulos que ya están
disponibles en el nodo JS. Así que dirígete a nodjs.org, y desde el encabezado,
abre su documentación Asegúrate de que aquí seleccionamos
otra versión y seleccionamos la versión Ts
porque es la versión estable. Aquí obtenemos toda la
información sobre el nodo JS, como objeto simple, consola. Además, tenemos muchos temas
explicados y cómo utilizarlos. Tenemos algunos módulos principales
como file system. Dentro de esto, explican todos
sus métodos y propiedades. Además, tenemos módulo STP, módulo OS, módulo path, y mucho más Aquí veremos algunos módulos principales
importantes que necesitamos para
crear nuestro back end. Si te gusta
aprender todos estos, entonces puedes leer
esta documentación. Pero en mi sugerencia, voy a
cubrir todos los módulos importantes. Empecemos con el módulo Path. El módulo Path se utiliza para trabajar con rutas de archivos y
directorios. Por ejemplo, cuando queremos almacenar la imagen cargada
en nuestro servidor, entonces mediante el uso de este módulo path, podemos darle a esa imagen ruta
adecuada para
guardarla en una carpeta específica. Entonces, si quieres fusionar dos rutas u otras cosas relacionadas con la
ruta, entonces puedes usar este
módulo de ruta. Déjame mostrarte eso. Además, puedes ver aquí, nos
muestran cómo podemos acceder a este módulo
en nuestra aplicación. Igual que estamos accediendo a nuestros módulos locales en
la función requerida. Pero en el lugar de la ruta del archivo, escribimos nuestro nombre de módulo. Entonces en nuestra aplicación, simplemente
elimino este código. No lo necesitamos ahora aquí
escribimos require function, y en los códigos, escribimos node column y nuestro nombre de
módulo core, que es path. En la versión anterior del nodo, solo escribimos el nombre del módulo
principal sin prefijo de columna de nodo. También, esto funcionará
en versión actual. Yo uso esta sintaxis anterior, puedes usar cualquier sintaxis, depende totalmente de ti. Ahora, igual que antes, esto requiere función
escrita exporta objeto de este módulo de ruta. Tenemos que almacenarlos
en ruta variable. Ahora podría preguntarse ¿por qué no
desestructuramos aquí este objeto como lo
hicimos anteriormente? Sí, podemos hacer lo mismo aquí, pero aún no conocemos
su propiedad. Entonces es mejor no
desestructurar aquí. Ahora, déjame mostrarte algunos métodos
útiles del módulo path. Supongamos que queremos ver alguna información
sobre un archivo específico. Entonces aquí tenemos el método path
dot parse, y en esta función parse, cómo pasar la
ruta completa de nuestro archivo. Pero, ¿cómo podemos obtener la ruta
completa de nuestro archivo? Así que en el nodo js anteriormente
vimos que todos los archivos tienen objeto
módulo, que utilizamos como
módulo de exportaciones de punto. Además, todos los archivos tienen
otras dos variables. Uno es subrayado
subrayado nombre de archivo, que devuelve la ruta completa del archivo actual y subrayado
subrayado Dname que es la ruta de
directorio Déjame mostrarte estos dos primero. Entonces por ahora, comento este método de pase de ruta y
rápidamente consol dot log,
subrayado subrayado
Dname console dot log, Underscrendscre,
nombre este método de pase de ruta y
rápidamente consol dot log,
subrayado subrayado
Dname console dot log, Underscrendscre,
nombre de archivo. Guarde los cambios y
ejecutemos este archivo. Ver, aquí obtenemos la ruta completa
del directorio actual. Directorio significa carpeta, y debajo de eso para
Underscore desceFlecename, tenemos ruta
completa Ahora volvemos a nuestro archivo, eliminamos esta tanto Consola y eliminamos comentario
de aquí usando Control plus slash
o Command plus slash y simplemente en
esta función de análisis,
pasamos nombre de archivo Underscredsc Obtenemos algunos detalles sobre esta ruta de archivo y
para imprimir su resultado, simplemente lo envolvemos
con el registro de puntos de consola. Bien, guarda los cambios, y vamos a ejecutar este archivo. Ver, aquí obtenemos este objeto. Primero, obtenemos la propiedad root, que es la ruta raíz
de la ruta actual. Aquí en Windows, obtenemos
C colon, slash hacia atrás. Si eres usuario de Mac o Linux, entonces llegarás
aquí adelante slash A continuación, tenemos DR, que es
ruta de directorio después de eso, tenemos base, que es la
última parte de esta ruta, que es índice punto Js. Después de eso, tenemos EXT
para extensión y último, obtenemos nombre de la última
parte, que es índice. Este método parch se utiliza para obtener detalles sobre
la ruta específica Ahora veamos un método
más útil de módulo path que es join. Supongamos que en nuestra base de datos, queremos almacenar la
ruta en donde
almacenamos nuestra imagen subida
como foto de perfil. Entienda que las fotos
de perfil en carpeta llamadas subidas
en Aquí podemos usar el método path
dot join. Aquí al principio, necesitamos
la ruta del proyecto actual, y ¿cómo podemos obtener
esta ruta de carpeta? ¿Deberíamos usar guión bajo nombre de archivo de
guión bajo? No, tenemos que usar
underscore undisco dirname. En el segundo argumento,
pasaremos el nombre de nuestra carpeta
que se carga. Obtendremos una ruta de nuestra carpeta de
proyectos y nos unimos a carpeta
Uploads al final de esta ruta del proyecto.
A ver lo que obtenemos. Eliminamos esta consola
y almacenamos esta ruta en variable llamada profile Path y console dot log
esta ruta de perfil. Guarde este archivo y
ejecutemos este archivo. Ver, aquí obtenemos camino completo. Esta primera parte es
subrayado subrayado,
querido nombre, y nos unimos a la carpeta
Uploads al Sé que esto es un
poco confuso, pero no te preocupes cuando usemos
estos módulos en nuestro proyecto, todo
esto tendrá sentido. Ahora, aquí podrías preguntar, ¿podemos unir dos partes manualmente? Por qué necesitamos usar
tu módulo path. Entonces, como sabemos, para una ruta de archivo, Windows usa una diagonal hacia atrás, y los usuarios de Mac y Linux
usan la diagonal hacia adelante Por lo que obtenemos diferentes resultados
en diferentes sistemas. Si escribimos ruta manualmente
con slash hacia atrás, entonces en Mac no podemos
encontrar nuestra ruta Y también, actualmente, nuestro
proyecto está disponible localmente, y por eso
sabemos que es camino. Pero en el mundo real, implementamos
nuestra aplicación backend en
algún lugar de Internet y no
conocemos la
ruta de ese servidor Por lo que este módulo path es muy útil en este
tipo de situaciones.
13. Cómo obtener los detalles del sistema operativo: A veces necesitamos algunos detalles de nuestro sistema operativo de servidor como qué
sistema operativo está usando o cuánta memoria
tienen, etcétera Para eso, tenemos otro módulo
core llamado OS, que significa sistema operativo. Entonces quitamos este código anterior, y ¿me pueden decir cómo podemos acceder a este sistema
operativo? Derecha, podemos usarlo por función
require y simplemente
pasar aquí nodo, columna OS. Podemos usar solo OS. Ahora podemos almacenar esto
en una variable llamada OS. Supongamos que aquí queremos ejecutar un código específico para el
sistema Windows y para Mac, queremos ejecutar otra cosa. Aquí podemos escribir si
condición s punto plataforma, esto devolverá
el nombre de la plataforma en la que se está ejecutando este código. Si st plataforma es igual a ganar 32, si esto es cierto, entonces
ejecutaremos código para Windows. Por ahora, solo escribimos consola dot Log,
hola, Windowsser Después de eso, queremos ejecutar
algún código para el sistema Mac. Agregamos s y comprueba la
plataforma de puntos es igual a Dawn. Este es el
nombre de la plataforma para macOS. Dentro de esto, ejecutamos consola
dot log, hola McUser. Por fin, simplemente pasamos ls
y Consol dot log Hellouser. Comprueba que esto esté funcionando o no. Ver los cambios y echar un vistazo. Ver, aquí obtenemos Hola
usuario de Windows, por lo que está funcionando. Ahora en el módulo OS, tenemos muchas más propiedades. No quiero aburrirte
explicándote todas las propiedades porque eso
llevará mucho tiempo. Pero déjame explicarte dos propiedades más útiles del módulo OS. En primer lugar, podemos
obtener la memoria total del sistema operativo
utilizando este módulo del sistema operativo. Así que Os dot MM total para la memoria, y simplemente podemos
imprimirlos usando el registro de puntos de consola. También tenemos otra propiedad llamada MM gratis para
obtener la memoria libre. Entonces duplicamos esta línea
usando Shift más alter, más flecha abajo o
Shift plus opción, más flecha abajo y cambiar esta
función MM total con FreeMM Guarda los cambios
y echa un vistazo. Mira, aquí tenemos
memoria en bocados. Tengo ocho GB de
memoria total y la memoria libre es de casi dos GB. Puedes ver que esta es la
importancia del nodo js. Antes del nodo js, al usar JavaScript
simple, no
podemos obtener este
tipo de detalles. Así es como se utiliza el módulo OS para obtener información
del sistema operativo.
14. Módulo de sistema de archivos: Hay otro módulo de núcleo
popular que utilizamos para
interactuar con archivos. Por ejemplo, con
sistema de archivos o módulo FS, podemos escribir el
archivo, leer el archivo, actualizar el archivo, y también
podemos eliminar un archivo específico. Así que aquí en la
documentación del nodo, abrimos el módulo del sistema de archivos. Podemos ver que tiene tantos
métodos y propiedades. Déjame mostrarte cómo
podemos usar el Módulo FS. Eliminemos este
código anterior. No te preocupes. Voy a añadir todo este código en archivo
separado para que
puedas verlo más tarde. Aquí queremos
acceder al módulo core, requerir código Fs, y lo almacenamos en
la variable llamada Fs. Ahora simplemente escribimos Fs punto y vemos aquí obtenemos
la lista de todos los métodos. Pero, ¿qué es esto? Todos estos
métodos tienen dos variaciones. Uno es síncrono
o métodos de bloqueo, y otro es sin synkyword que significa asíncrono Ahora, como sabemos, el nodo
es popular por su forma asíncrona
o no bloqueante Tenemos que usar siempre métodos
asíncronos en el nodo js. Nodo nos dan
método sincrónico para la simplicidad. Déjame mostrarte uno por uno ambos. Aquí, queremos obtener la lista de archivos que tenemos
en la carpeta actual. Para ello, tenemos método
llamado read directory sync, y aquí pasamos la ruta del directorio que
queremos leer. Period slash que es
el directorio actual, y almacenamos estos datos
en una variable llamada data Y al final,
simplemente registramos estos datos. Guarde los cambios, y
veamos qué obtenemos aquí. Ver, aquí obtenemos la lista de todos los archivos dentro de esta carpeta. Ahora veamos también cómo
podemos usar el método Asynrns. Entonces como directorio punto rojo, y igual que antes, en
la primera posición, pasamos nuestra ruta de directorio, que es periodo slash Ahora en casi todo el método asíncrono, hay que pasar segundo argumento, que es la función callback,
que es la función ejecutar cuando este trabajo asincrónico Y también,
eso lo podemos ver en sugerencias. Ahora, hay dos posibilidades para todo el trabajo asíncrono. Obtenemos un error o completamos
con éxito ese trabajo. Sé que esto es un
poco confuso si estás lidiando con trabajo
asincrónico por tiempo, pero no te preocupes en las
próximas secciones, tengo sección completa para JavaScript
asincrónico Aprenderás todo
esto en profundidad. Ahora en esta función
en la primera posición, obtenemos error, y en el segundo parámetro,
obtenemos nuestros datos. Si obtenemos error, entonces obtenemos null en estos datos. Y si obtenemos nuestros datos, entonces obtenemos nulos en este error. Entonces para manejar este escenario, podemos pasar su condición. Si el error está disponible, entonces registraremos el error. Como vamos a consola dot log
nuestros datos. Tan simple como eso. Ahora vamos a comentar
esta consola para el método sincrónico. Guarda los cambios
y echa un vistazo. Ver, aquí
volvemos a obtener los mismos datos. Ahora, si quieres verificar, obtenemos error o no, entonces podemos cambiar esta
ruta a otra cosa, guardar esto y volver a ejecutar
este archivo. Ver, aquí obtenemos error, no hay tal archivo o directorio. Entonces ahora entiendes cómo funcionan
estos métodos de acing. Además, no te
preocupes por esta complejidad porque apenas usamos estos módulos
centrales en nuestro proyecto. Actualmente,
te estoy mostrando solo módulos, y este módulo de archivo está poco
avanzado para esta etapa. Así que no te preocupes por
esto. Lo dominarás cuando los utilicemos
en nuestros proyectos.
15. Creación de servidor mediante el módulo HTTP: Veamos uno de los
módulos centrales más importantes del nodo JS, que es el módulo SDTP El módulo SDDP nos permite crear un servidor SDDP y también para
manejar diferentes Como sabemos, NodeJS se utiliza crear backend para nuestra aplicación
cliente,
pero actualmente, solo
accedemos a este backend ¿Y si nuestro front end quiere acceder
a nuestro back end? Así que para interactuar con web en nodo, tenemos módulo SDDP Déjame mostrarte recticamente
como podemos crear servidor. Así mismo que antes, acceda al módulo
STDP usando la función
requerida y pase aquí SDDP y almacene eso en la
variable llamada Ahora bien, ¿me puede decir qué está escrito
este módulo STDP? Voy a devolver el método SDDB. Ahora, este STDP tiene
un método llamado Crear servidor que se utiliza para crear servidor para nuestra aplicación
backend Ahora ¿qué pasaremos dentro de
esta función de crear servidor? Simplemente, aquí pasamos la función de
devolución de llamada. Cuando alguien envía
solicitudes a nuestro servidor, esta función de devolución de llamada se ejecutará Déjame preguntarte
algo. ¿Cuál es el trabajo principal de nuestro servidor? Entonces, cuando el usuario envía la
solicitud al servidor, el servidor tiene que devolver la respuesta de
acuerdo a la solicitud de datos. Entonces aquí en nuestra función de servidor, necesitamos la información
sobre la solicitud del usuario, qué API
solicita, etcétera Entonces aquí, en este argumento de
función, obtenemos request object, que es los detalles de la
solicitud del usuario. Ahora aquí tenemos
información sobre solicitud. Entonces nuestro servidor hace su
proceso y
supongamos que queremos devolver la respuesta
como mensaje hola mundo. Para enviar respuesta aquí
en el argumento de función, obtenemos aquí objeto de respuesta
después de este objeto de solicitud. Además, a muchos desarrolladores
les gusta escribir nombre corto, Rg para solicitud y
Rs para respuesta Ahora para regresar Hola
mundo mensaje, escribimos respuesta
punto R. Y en códigos, pasamos nuestro mensaje Hola mundo. En el mundo real,
devolveremos datos de aquí, por ahora solo estamos escribiendo mensaje cuando alguien envía
solicitud en el servidor. Y aquí, tenemos que
decir también que esta
respuesta es terminar aquí. Entonces escribimos respuesta punto N. Esto asegurará que nuestro proceso de
respuesta termine aquí. Ahora aquí creamos nuestro servidor, pero necesitamos iniciar este
servidor en algún puerto. Si no reaccionas, nuestra
aplicación se ejecutará en host
Local 5173 si
es creada por y. ahora, igual que eso tenemos que
iniciar este servidor en algún puerto Veamos cómo podemos hacer esto. Aquí este punto stp
Crear método servidor, devolver nuestro objeto servidor, lo
almacenamos en la variable
llamada servidor Y después de esto en la parte inferior, escribimos server dot LISN Y en esta función, pasaremos nuestro puerto en el que queremos
iniciar este servidor. A muchos desarrolladores les gusta ejecutar
servidor en 5,000 o 3,000. Pero puedes dar cualquier puerto, asegúrate de que ese puerto
no se use en tu sistema. Aquí, me gusta usar 3 mil. En el mundo real, cuando
desplegamos nuestro servidor, entonces este puerto será reemplazado
por nuestro nombre de dominio Bend como catwis.com o tasrag
dotben.com Además, en esta función, podemos pasar otra función de
devolución Esta función se ejecutará cuando nuestro servidor se
inicie correctamente. Aquí simplemente escribimos consol dot log server start
listening on port 3,000 Guarda los cambios y vamos a ejecutar este código porque sin
este código ejecutándose, cómo el servidor creará
el nodo index dot js. Ver, aquí conseguimos servidor empezar a
escuchar en el puerto 3,000. Si estás usando Mac y
usas el puerto 5,000, entonces podrías obtener un error de
5,000 puerto ya está en
uso porque en Mac ARP las encuestas del receptor
se ejecutan en este puerto Puede usar otro puerto como 5,001, 5,002, o
incluso puedes usar 3,000 No hay regla para el
número de puerto siempre y cuando el puerto ya
esté en uso por otro
servicio en nuestro sistema. Ahora para verificar esto, necesitamos
enviar solicitudes en este puerto. Así que abre un navegador y
simplemente escribe aquí URL, Host
local Columna 3,000
o tu número de puerto. Ver, aquí nos llega nuestro
mensaje, Hola Mundo. Así que creamos con éxito nuestro servidor y también
iniciamos este servidor. Entonces cada vez que alguien envía
solicitudes en el servidor, esta función se ejecutará e imprimirá este mensaje tan
simple como eso.
16. Cómo manejar las diferentes rutas: Ahora actualmente estamos enviando solicitudes sobre la ruta de ruta
portuaria, lo que significa ruta de origen. Pero en el mundo real, el usuario
puede enviar solicitudes al host
local Columna 3,000 barra diagonal
Acerca o cortar productos Así que también tenemos que manejar estas diferentes
rutas en nuestro servidor. Y para manejar
diferentes rutas, primero, necesitamos información para qué
ruta el usuario envía solicitud. Y para eso tenemos
aquí solicitar objeto. Escribimos aquí
condición solicito punto URL igual a en
códigos, barra diagonal hacia adelante Esta barra diagonal simple
representa la ruta raíz. En los corchetes CL, podemos simplemente mover esta respuesta punto escribir
función retención alter u opción, y flecha hacia arriba Después de eso, queremos manejar, digamos de ruta. Así que aquí agregamos si request dot URL es igual a en códigos sobre
y si es cierto, entonces simplemente devolvemos otro
mensaje respuesta punto derecho. Se trata de ruta. Así, podemos agregar
tantas solicitudes como queramos. Y después de todas las rutas,
pasaremos, lo que significa rutas de paso de usuario, que no se maneja aquí. Y es por eso que aquí volvemos respuesta
simple punto
derecho, ruta no encontrada. También asegúrese de que esta función de punto de
respuesta se llame al final
de esta función de servidor. Guarda los cambios y
vuelve a nuestro navegador. Si cambiamos nuestra
URL para cortar, ¿ me
puede decir qué
vamos a conseguir aquí? A ver. Mira, aquí nos sale el
mismo mensaje hola mundo porque en nuestra terminal, todavía se está
ejecutando nuestro código antiguo en el que
no manejamos rutas. Para ejecutar este nuevo código,
tenemos que volver a ejecutar
nuestra aplicación. En terminal primero,
detendremos la aplicación pulsando Control más C
en Windows y Mac ambos. Después de eso, nuevamente
ejecutamos node index dot js. Bien, llegamos hasta aquí, los servidores empiezan a escuchar en puerto, y en navegador si
actualizamos nuestra página, mira, ahora nos llega aquí mensaje. Se trata de ruta. Y si tratamos de solicitar
alguna otra ruta, entonces aquí obtenemos
ruta no encontrada. Así manejamos
diferentes rutas API usando el módulo SGDP Ahora imagina que tenemos 20 rutas API diferentes
y para manejarlas, tenemos que escribir
18 bloques sf más. Y si todas esas rutas tienen
cientos de señales de código, entonces administrar nuestro propio servidor se
volverá tan desordenado Entonces en el mundo real,
no vamos a utilizar este módulo SDDP. O que tenemos un módulo de
terceros muy popular llamado Express y Express tiene muchos
más beneficios que este módulo SDTP Además, usando Express,
podemos dividir nuestras rutas
en diferentes archivos, para que no nos confundamos
cuando tenemos que hacer alguna actualización o queremos
agregar nuevas funcionalidades. Te explico todos estos módulos para que entiendas poco
cómo está funcionando
el nodo y te pongas cómodo con alguna sintaxis de
JavaScript. Espero que disfruten de esta sección, nos vemos en la siguiente sección.
17. Sección 03: introducción a las NPM: Ven a la tercera sección de
las puntuaciones de JS del nodo definitivo. En esta pequeña sección divertida, veremos todo sobre el gestor de paquetes de
nodos o en resumen NPM. Entonces, ¿qué es el administrador de paquetes de nodos? Node package manager es
una herramienta que nos ayuda a administrar paquetes o bibliotecas
para nuestro proyecto de nodo. En palabras simples, NPM es como un gran almacén
para desarrolladores En este almacén, los desarrolladores almacenan su código JavaScript para otros desarrolladores puedan
buscar ese código y descargar el
código reutilizable en su proyecto. Déjame mostrarte eso.
Así que dirígete a NPM. JS.com. Aquí podemos buscar
nuestro paquete o nombre de biblioteca. Paquete o biblioteca significa
una pieza de código reutilizable. Por ejemplo, en la sección
anterior, te
dije que usaremos Express Library para
crear servidor STD. Ver, aquí obtenemos muchos
resultados para esta búsqueda. Simplemente, abrimos este paquete
Express. Ver en el lado izquierdo, obtenemos documentación básica, cómo usarla, etcétera, y en el lado derecho, obtenemos información sobre el paquete En primer lugar, en la parte superior, obtenemos el comando de instalación, que verás en la
próxima lección. A continuación, tenemos el enlace
del repositorio Github para que podamos ver el código y también obtenemos el enlace
de su página web oficial. Aquí podemos ver estas son las descargas mensuales
de este paquete. Por esto, podemos ver la
popularidad de este paquete. Además, obtenemos información de versión
y muchas otras cosas. Entonces en NPM, obtenemos paquetes para casi todas las funcionalidades que queremos agregar en
nuestra aplicación Y lo asombroso es esto todos los paquetes que
podemos usar de forma gratuita. Entonces hay paquetes premium, pero es raro que
compremos paquete. En realidad, no compré
ningún paquete hasta ahora. Entonces en esta sección, veremos comandos de cómo instalar
diferentes paquetes. También desinstalaron paquetes,
instalamos la dependencia del desarrollador, actualizamos algunos paquetes, etcétera. Entonces, por esta pequeña sección, te sentirás cómodo con comandos del
NPM y no te
confundirás con ellos. Son extremadamente
simples y fáciles. Entonces comencemos esta sección.
18. Crear paquete: Entonces, como vemos en la lección anterior, usamos tantos paquetes como
queramos en nuestro proyecto. Ahora cuando instalamos cualquier paquete, ese paquete tiene un montón
de archivos y carpeta, cuales descargaremos
en nuestro proyecto y lo
almacenaremos en la carpeta
llamada Node Modules. Ahora imagínese que instalamos diez o 20 paquetes
en nuestra aplicación. Todos esos archivos se almacenarán
en esta carpeta de módulos de nodo. Cuando queremos
compartir nuestro proyecto o queremos subir
nuestro proyecto en Github, entonces no subimos esta carpeta de
módulos de nodo porque
aumentará el tamaño del proyecto y también aumentará
el número de archivos. Entonces no subimos la carpeta de módulos de
nodo. Ahora podrías preguntar si no
compartimos esta
carpeta de módulos de nodo con alguien, cómo sabe qué paquetes
tienen que instalar. Para resolver este problema
en nuestro proyecto de nodo, crearemos un archivo
llamado paquete punto JCN En este archivo, los nodos almacenan toda la información principal
sobre nuestro proyecto. Así que cada vez que empezamos a trabajar
en cualquier proyecto de nodo, lo
primero y más importante que
hacemos es crear Gs empaquetados y
archivar para nuestro proyecto. Veamos cómo podemos
crear paquete archivo Gn. Así que aquí creo una
nueva carpeta llamada NPM Dash Commands y abro
esa carpeta en vis code Bueno. Ahora aquí, antes que nada, tenemos que crear paquete archivo
GSN para eso, abrimos nuestro terminal
usando Control Plus Batak,
y aquí escribimos NPM, init, init, Vea, esta utilidad le guiará a través de la creación de un archivo sn de
paquete. En la parte inferior, nos
pide el nombre de nuestro proyecto. Si quieres cambiarlo, entonces puedes escribir
un nuevo nombre aquí, pero asegúrate de usar letras
minúsculas y
también sin espacio. Estoy contento con
este nombre actual, así que simplemente golpeé Enter. Después de eso,
pedirá el nombre de la versión. Nuevamente, no queremos cambiar este valor predeterminado,
así que golpeamos Enter. Ahora aquí, podemos escribir la descripción de nuestra
aplicación. Por ahora, solo me salto esto. A continuación, tenemos el punto de entrada, que es el
nombre de archivo predeterminado de nuestro proyecto. Entonces, cuando implementemos
nuestra aplicación, esa plataforma sabrá cuál es el archivo principal de
nuestra aplicación. Después de eso,
tenemos el comando test, el repositorio
Git, luego la palabra clave, el
autor y la licencia. Pulse Enter para todo esto y vea aquí
obtenemos este objeto que va a agregar
en el paquete a jcnfle se está preguntando,
¿está bien Si estás de acuerdo con
estos detalles, entonces simplemente podemos escribir aquí, y o sí. Y hecho. Ver, aquí obtenemos el paquete
JSNFLE en nuestra carpeta de proyectos. Si abre ese archivo, vea, aquí obtenemos este objeto con detalles de
la aplicación
y en el futuro, también
podemos cambiar
estos detalles. Ahora bien, si le prestas
poca atención, cuando estamos dando respuesta
al paquete archivo GSN, en realidad no
cambiamos nada y aún así tenemos que pasar
por todas esas preguntas ¿Hay algún
truco de atajo para esto? La respuesta es sí, tenemos atajo com
creando paquetes y archivo. Aquí, eliminemos este paquete
actual Gs y archivo. En la terminal, anteriormente, escribimos NPM en ella. Con eso, tenemos que
responder a todas esas preguntas. Pero si queremos
saltarnos esas preguntas, entonces escribimos aquí NPM
en él Y para todos, sí Y hecho. Ver, volvemos a recibir paquete DSNfle
en tan solo un segundo Y también objeto es el mismo. En resumen, cuando iniciamos
cualquier nuevo proyecto de nodejs, antes que
nada, necesitamos crear paquete Gn file con el comando
NPM
19. Instalación del paquete en el proyecto: En la
lección anterior, te dije que este paquete archivo GSN tiene información de
aplicación
con la lista de paquetes, pero no podemos ver ningún nombre de
paquete aquí Es porque en nuestra
esta aplicación, aún no
instalamos
ningún paquete. Así que vamos a instalar algunos paquetes. Para ello, necesitamos ejecutar un comando en la
terminal. Es realmente sencillo. Simplemente tenemos que
escribir NPM install, o podemos usar aquí taquigrafía, que es solo espacio Aquí, escribimos nuestro
nombre de paquete, digamos Express. Además, obtendrá
este comando en
la página de ese
paquete en el sitio web de NPM. Puedes copiar de esto también, y aquí golpeamos Enter. Consulta en nuestra carpeta proyectos, obtenemos la
carpeta de módulos de nodo en la que todos
nuestros paquetes de terceros guarda sus archivos y carpeta. Y si abrimos eso, mira, aquí obtenemos muchas
carpetas y muchos archivos. No te preocupes por eso
porque en el mundo real, nunca
abrimos esta carpeta. O creamos esa carpeta, borramos esa carpeta, pero nunca abrimos esa
carpeta, no te preocupes. Después de eso, también obtenemos el
paquete log dot jsnfle. Packageog dot JSNFle se utiliza para
registrar dependencias a un número registrar dependencias En otras palabras, el
paquete log dot JSNFle asegura que todos los desarrolladores y también el sistema de
implementación utilicen la misma versión del
paquete para Además, no te preocupes por eso. Apenas tocamos este archivo. Y si vemos en el paquete punto jcnfle aquí en la parte inferior, obtenemos nueva propiedad
llamada dependencias,
y en eso, obtenemos todas nuestras dependencias Dependencias son de lo que dependen
nuestros proyectos. Sin estos paquetes, nuestra
aplicación no puede funcionar, y por eso la
llamamos dependencia. Esta es la versión de
nuestro paquete Express. Si instalamos otro paquete, entonces ese paquete se agregará en esta
lista de dependencias con su versión Ahora bien, esta versión es
la última versión que los desarrolladores
implementan en el sitio web de NPM. Pero a veces los desarrolladores al implementar
erróneamente
versión empantanada o nueva versión, introducen alguna nueva sintaxis En ese caso, también
podemos instalar versión
anterior de
cualquier paquete NPM. Entonces aquí en el lado derecho, tenemos la versión Puñalada Ver, aquí podemos ver el
historial completo de este paquete. Podemos instalar cualquiera
de estos paquetes. Supongamos que queremos instalar
esta versión 4.18 0.1. Entonces damos click en esa versión. Abrirá su página de inicio
para esa versión específica. Y podemos ver aquí se cambia la
versión, y también se cambia
el comando de instalación. Agregan AdSign y después de eso, escriben
versión de paquete, así de simple Así que volvamos al código VS aquí, nuestra versión actual es esta. Ahora, copiamos este comando
de este sitio y simplemente lo pegamos en nuestro
terminal de proyecto y pulsamos Enter. La versión C cambió. Así es como
instalamos paquetes con comando
NPM I package name Además, aquí podemos agregar
múltiples nombres de paquetes. Y si queremos instalar verson
específico
entonces escribimos NPM, nombre
del paquete en el número de
versión roja, y eso es todo Así de sencillo instalar el
paquete en el proyecto de nodo. Y después de instalar
los paquetes, podemos empezar a usarlos en todos los archivos JavaScript
de este proyecto.
20. Desinstalación de paquetes: Ahora veamos como
desinstalar paquete. Pero antes de eso, instalemos otro paquete llamado Mongo DB Dime qué comando usamos. Usamos NPM install o I, y luego escribimos nuestro nombre de
paquete Mongo DB Lo estás haciendo muy bien. En este paquete dot jcnfle, se
puede ver otro
paquete en Intentemos desinstalar
este paquete. Para eso, necesitamos escribir NPM,
desinstalar, o también tenemos taquigrafía para eso, que es Entonces escribimos nuestro
nombre de paquete que es Mongo DV. Este comando hace dos cosas. Primero, eliminará archivos y
carpetas de
ese
paquete en particular de la carpeta de módulos de
nodo. En segundo lugar,
actualizará los archivos de configuración, que es el paquete JSN
y packslogt Por eso, en el futuro, nuestra aplicación no instalará paquetes
innecesarios.
21. Instala el paquete como dependencia del desarrollador: Ahora a veces en nuestro proyecto, queremos instalar paquete solo para usar en el entorno de
desarrollo, no en la producción. Por ejemplo, tenemos algunos paquetes de prueba que solían probar nuestra implementación de
código. No necesitamos probar paquetes en nuestro entorno de producción. Innecesario
aumentará el tamaño del servidor. En el nodo Jazz, podemos instalar paquetes en la
dependencia del desarrollador o en definitiva, dependencia
dave, lo que significa que ese paquete solo
agregará en nuestro
entorno de desarrollo, no en la producción. Así que en nuestra aplicación,
vamos a instalar un paquete de prueba
como Do dependencia. Para eso, escribimos NPM. Aquí escribimos nuestro
nombre de paquete, que es Mocha. Este es el comando normal
para instalar el paquete. Ahora para instalar el
paquete como Do dependencia, tenemos que agregar opción aquí, d s Dev y golpear Enter. Ahora vamos a verificar esto. Pun package dot
jcnfle en la parte inferior, podemos ver dependencias dev,
y en eso, tenemos nuestro Podemos instalar cualquier paquete
como dependencias dev, tenemos que usar Dev al
final del comando install Pero ten en cuenta que solo
agregará en el
entorno de desarrollo. Además, si queremos desinstalar paquetes de dependencias
dv, entonces usamos el mismo comando que vemos en la lección
anterior, NPM Uninstall o el nombre del paquete
UN, que es Mocha. Y hecho.
22. Paquetes obsoletos y actualízalos: Veamos algunos
comandos útiles de NPM. A veces en nuestra aplicación, instalamos algunos
paquetes que podríamos quedar obsoletos y NPM tiene
su versión más reciente Por ejemplo, en esta sección, instalamos la versión anterior
del paquete Express. Ahora bien, ¿cómo podemos identificar
qué paquetes tiene actualizaciones? Para eso, tenemos un comando
en NPM, que está desactualizado. Escribimos NPM anticuado
y golpeamos Enter. Y mira, aquí tenemos la
lista. Tenemos nombre del paquete. Es versión actual, buscado significa última versión del paquete que satisfaga la gama de versiones. Última versión, que es la última versión
de tabla de este paquete, ubicación, que es la
ubicación de este paquete, que se encuentra en la carpeta express non
module. Por fin, dependiendo de cual sea el proyecto o dependencia que
sea depende de este paquete. Por esto, podemos ver rápidamente qué paquetes
están desactualizados en nuestro proyecto. Ahora actualmente
solo obtenemos un paquete, pero imagina que estamos trabajando en viejo proyecto grande y aquí
obtenemos muchos paquetes obsoletos. Ahora para demostrarlo, permítanme instalar otro paquete
con versión anterior. Escribimos NPM instalar
Mongo Debi a razón 4.14
0.0. Golpea Enter. Bueno. Ahora volvemos a ejecutar
NPM comando obsoleto Ver, aquí conseguimos
nuestros dos paquetes. Ahora podría preguntarse ¿por qué la
versión deseada y la última
versión son diferentes? ¿Qué significa eso?
Como te dije, quería fuentes de columna, que es la última versión
del paquete que satisface
el rango de versiones. Actualmente, tenemos la versión
4.14 0.0 en nuestro proyecto. Se trata de la gama de
versiones sólo la versión cuatro relacionada. Por ejemplo, 4.15 0.1, 4.16 0.0, 4.17 0.1, etcétera Este tipo de versión
es el rango de versiones para 4.14 0.0, no 6.15 Pero podría preguntarse, ¿cuál es el problema para
actualizar nuestra versión a 6.15 0.0 permite la
versión? Eso lo podemos hacer. Pero cuando los desarrolladores cambian el
número de
versión como la versión cuatro a la versión
cinco o la versión seis, entonces podrían hacer algunas
actualizaciones que pueden darte error para el código antiguo de
acuerdo con la versión 4.14 0.0 Por eso siempre actualizamos nuestro paquete a esta versión
deseada, no a la última versión. Por eso, no vamos a
romper nuestra aplicación. Ahora queremos actualizar todos estos
paquetes desactualizados de una sola vez. Tenemos otro comando para
actualizar paquetes desactualizados. El comando es NPM
update. Eso es. Actualizará todos los paquetes a su última versión dentro
del rango específico, pero no actualizará archivos
package dot Json y
packago Json Ver, en el paquete GSN, todavía
tenemos nuestra versión antigua
llamada paquete Express Ahora, hasta que actualicemos el
paquete dot JSN o packaglot JCNFle
no tiene sentido Es necesario, necesitamos
actualizar paquete perros y archivo. Para eso, usamos otro
paquete subido en NPM, que es NPM check updates. Escribimos NPM, I y aquí
agregamos G para instalar globalmente
este paquete en nuestro sistema En las otras aplicaciones de nodo, no
necesitamos
instalar este paquete. Estará
disponible a nivel mundial en nuestro sistema. Aquí escribimos nuestro nombre de paquete, que es NPM check Updates Asegúrate de escribir el mismo nombre con
guión, no guión bajo Además, si estás usando MG, entonces al inicio de
este comando global, tienes que agregar pseudo prefijo De lo contrario, obtendrá un
error y después de eso, ingrese la contraseña de su sistema. Ahora podemos simplemente ejecutar actualizaciones de verificación de
NPM. Ver, comprueba el
paquete dot jcnfle y
dice que nuestro Express y Mongo Aquí se muestra
esta última versión, pero queremos actualizar nuestro
paquete con la versión deseada. Entonces tenemos que escribir aquí NCU, que es la taquigrafía de las actualizaciones
de verificación de NPM. T para Target. Nos dirigimos a menor, que
son las versiones buscadas. Esto devolverá
solo versiones principales. Ver, aquí obtenemos la
versión deseada para ambos paquetes. También en la parte inferior, sugiere ejecutar NCT menor para
actualizar el paquete J y el archivo Ejecutamos actualizaciones de verificación de NPM, o podemos escribir NT, menor y golpear Enter C, cambió la versión
en los paquetes y archivo. Nuevamente, sugiere ejecutar NPM install para
instalar nuevas versiones Escribimos NPM install o NPM
I y golpeamos Enter y listo. Todos nuestros paquetes están actualizados, así es como identificamos los paquetes
obsoletos y cómo actualizar los paquetes a
su última gama específica. Para que nuestra aplicación no se
rompa por la nueva versión del paquete.
23. Eliminar los paquetes no utilizados del proyecto: A veces en nuestra aplicación, podríamos instalar
tantos paquetes al inicio de nuestro proyecto, pero algunos paquetes
realmente no usamos, por lo que podemos eliminar
esos paquetes no utilizados porque ocuparán
espacio innecesario en la producción. Así que olvidando la lista
de paquetes no utilizados, necesitamos otro paquete
llamado DP check, que es la comprobación de dependencia. Entonces escribimos verificación de profundidad NPM IG. Nuevamente, estamos instalando este
paquete para nivel global. En toda aplicación,
podemos usarlo. Además, si eres Mcuser, asegúrate de agregar sudo
al inicio del comando
global package e
ingresa la contraseña de tu sistema Ahora puedes simplemente
ejecutar aquí dep check, y devolverá la lista de dependencia
no utilizada y también dependencia dab
no utilizada Actualmente, no usamos
ninguna dependencia ni paquetes. Es por eso que obtenemos todos los paquetes de
terceros como no utilizados. Mediante el uso de desinstalación de NPM
o UN Express Mongo DB, podemos desinstalar todos los paquetes Genial. Ahora si
volvemos a checar dap, entonces no lleguemos aquí
nada, preciosa. Así es como podemos eliminar paquetes
no utilizados de la aplicación de
nodo. Eso es todo acerca del administrador de
paquetes de nodos o NPM. Si quieres revisar rápidamente lo que aprendes en esta sección, obtendrás un PDF resumido
al final de cada sección, para que puedas descargarlo y
recapitular lo que aprendiste Ahora, a partir de la siguiente sección, comenzaremos a construir nuestro
primer proyecto real No Js.
24. Sección 04: API vs. API REST: Bienvenido a la cuarta sección del curso Ultimate Node JS. En esta sección,
comenzaremos a trabajar en
nuestro primer proyecto. Entonces comenzamos con lo básico, Qué es RS API, configuramos nuestro servidor
usando Express JS, luego crearemos diferentes
tipos de STB request,
get, post, put, y delete Además, vemos validación de datos
y mucho, mucho más. Entonces comencemos esta sección. Ahora como sabemos, API significa interfaz de
programación de aplicaciones, y es la forma dos programas se
comunican entre sí. Recuerda nuestro ejemplo de restaurante, veamos otro ejemplo del mundo
real. Imagine que el usuario quiere
registrarse en nuestro sitio web, por lo que rellena el
formulario y luego lo envía. En el momento en que envían, llamamos API para
registrar un nuevo usuario, y en el back-end,
creamos un nuevo usuario. Al igual que estas, podemos crear muchas APIs para registrar
al usuario existente, obtener la lista de todos los productos, agregar productos al carrito, eliminar productos del
carrito, etcétera En palabras simples, API se
utiliza para transferir datos entre front-end a
backend y back end a front end. Eso
ya lo sabemos. Ahora podrías preguntar
qué es la API de descanso. API Rest significa API de transferencia de
estado representacional. Rest API es una forma específica
de construir nuestras API simples. No te preocupes por su
nombre. Es muy sencillo. Rest API es la misma API, pero tenemos que seguir algunas
reglas para construir esa API. Si seguimos algunas reglas, esa API simple
se convierte en API de resto. Ahora veamos algunas reglas
que tenemos que seguir. Hacer resto API. Una regla es que tenemos que definir una URL API separada para
cada dato. Por ejemplo, supongamos que
estamos creando API para
operaciones relacionadas con el usuario como registrar usuario, obtener la información de
un solo usuario, etcétera En este caso, nuestra API debe ser nuestro nombre de dominio y luego
cortar usuario para registrarse Y si queremos obtener
información sobre un solo usuario, entonces creamos URL API
como slash users 123 Aquí 123 es un ID único de usuario. Igual que si creamos API
relacionadas con productos, entonces nuestra URL debería ser
como esta slash products, slash products, slash 123, slash products, slash
Añadir al carrito, Entonces, simplemente
mirando esta URL de API, obtenemos la idea básica
relacionada con nuestras API, y por eso, podemos hacer
cambios fácilmente y nuestra
aplicación mantenerse limpia. Otra regla son diferentes
tipos de acciones como leer, agregar, actualizar
o eliminar datos. Se deben utilizar métodos
específicos del PIB. Ahora podría preguntarse qué
son los métodos SGDP. Entonces, como sabemos, SDDP significa protocolo de
transferencia de hipertexto, y permite a nuestro
front-end solicitar y recibir páginas
web y otros recursos
de servidores usando API Entonces solo por
SGDP somos capaces de
enviar y recibir datos
del backend usando API Ahora bien, este SDDP tiene
cinco métodos principales. Obtener, publicar, poner, parchear y delt. Déjame explicarte
esto uno por uno. El primero es el método Get. Utilizamos el método Get cuando solo
queremos obtener datos
del servidor. Por ejemplo, queremos
obtener todos los detalles de los usuarios, o queremos obtener
todos los detalles de los productos o queremos obtener detalles de
un solo producto. En este caso, definimos
nuestra API con el método GT. Para entender estos métodos, utilizaremos analogía de biblioteca El método Get es como pedirle a
un bibliotecario que te muestre un
libro o varios libros No te preocupes por
la implementación. Veremos todos los métodos paso a
paso en esta sección. Segundo, tenemos el método post. Utilizamos el método post cuando
queremos publicar o enviar algunos datos desde el front-end para crear nuevos
datos en nuestro servidor. Por ejemplo, para
registrar un nuevo usuario, tenemos que enviar datos de usuario desde el front-end y eso
creará un nuevo dato en nuestro servidor. Piensa que es como que
le estamos dando nuevo libro a bibliotecario para en el
libro en biblioteca A continuación hemos puesto método. Utilizamos el método Put cuando
queremos actualizar un dato existente en el
servidor con nuevos datos. Por ejemplo, si cambias información de
tu perfil
en un sitio web y la guardas, entonces se envía una solicitud de put para actualizar tu perfil
con los nuevos detalles. Piensa que es como darle al bibliotecario una versión actualizada de un libro
para reemplazar al anterior A continuación, tenemos el método de página. Utilizamos el método de página
cuando queremos
actualizar una pieza de
datos pequeños, no datos completos. Ejemplo, si queremos actualizar solo nuestra dirección de correo electrónico en nuestro perfil sin
cambiar nada más, entonces se puede usar una solicitud de página. Piensa que es como si le
estuviéramos dando al bibliotecario solo las páginas actualizadas de un libro para actualizar en lugar de
reemplazar todo el libro Imagínese, aquí tenemos
objeto de usuario en nuestro servidor. Quieres actualizar, completar
este objeto de usuario, luego qué método
usaremos, usamos método put. Y si queremos actualizar solo
una contraseña de este usuario, entonces qué método usaremos,
usaremos el método patch. Lo estás haciendo muy bien. El método put se utiliza para la actualización de datos
completos, y el método de parche se utiliza para poca actualización en
los datos existentes. El último método es delete. Y adivina correctamente, usaremos el método delete para eliminar datos del servidor. Por ejemplo, cuando eliminamos una publicación o un comentario
en las redes sociales, entonces se
envía una solicitud de eliminación para eliminarla
del servidor. Y para eso, no creo necesitemos analogía bibliotecaria, ¿verdad Y además, no es práctico. Piensa que es como pedir a
las bibliotecas que quiten un
libro de la biblioteca. Se puede ver que los métodos SGDB
son muy simples. Utilizaremos estos
cinco métodos SGDP para definir nuestros diferentes
tipos de API Estas son solo algunas
reglas que vemos actualmente, pero no te preocupes, aprenderemos todas estas reglas a
medida que construimos APIs. Ahora podrías preguntar por qué
necesitamos resto API. ¿Por qué necesitamos seguir
reglas para construir API? Siguiendo cualquier regla, podemos organizar las cosas, y eso también es cierto para RS API. Las reglas harán que nuestra
API sea más organizada. Además, siguiendo las reglas de la API
REST, creamos una API simple y
fácil de usar
porque utilizan métodos SDDP específicos para realizar
tipos específicos de trabajo Además, con reglas, podemos crear una API limpia y
mantenible, que cualquier desarrollador puede entender y comenzar a
trabajar en ellas. Por ahora, no
te preocupes por las reglas. Como dije, aprenderás estas reglas mientras
creas APIs. Celeste comienza a ganar nuestro
primer proyecto JS de nodo. Estoy muy emocionada y
sé que tú también.
25. Lista de API de planificación para el proyecto 01: Ahora antes de comenzar cualquier proyecto, es mejor
planear aproximadamente sobre el proyecto Ted. Entonces como sabemos, nuestro
primer proyecto se trata gestionar la tarea y aquí
cómo se ve su front-end. Además, este es el primer
proyecto de mi curso React JS, y construiremos
este proyecto backend como nuestro primer proyecto backend No te preocupes, no vamos a crear aquí front end porque nuestro enfoque principal está en los NodeJS y construir el mejor backend
para Desde el front-end,
solo necesitamos llamar a APIs. Ahora podría preguntarse,
¿cómo podemos planificar el proyecto NodeJS?
Es muy sencillo. Este es el método
que usé para planear mi proyecto Bend,
incluso grandes proyectos. En lugar de construir
primero el proyecto y luego hacer modificaciones
importantes, es mejor dedicar
un poco de tiempo a la planificación antes de
comenzar nuestro proyecto. Para el proyecto Ben, si
creamos la lista de APIs, eso es muy útil porque
Bend es casi todo sobre APIs. Para este proyecto, primero, necesitamos la lista de todos, una API para obtener todos. Después de eso, necesitamos crear API para agregar una nueva
tarea, y después de eso, podemos actualizar los detalles de una
sola tarea, una API para actualizar la tarea, y al final, necesitamos
eliminar single to do, otra API para
eliminar tarea específica. Actualmente, sabemos que
necesitamos estas cuatro API, y crearemos dos, tres API
adicionales para la práctica. Si mientras construimos proyecto, necesitamos crear más APIs, entonces crearemos más APIs. No hay nada de
malo en eso. Esto es sólo un plan rudo
para reducir la confusión.
26. Cómo configurar una nueva aplicación: Ahora vamos a crear una nueva
aplicación para nuestro proyecto. Entonces abre la carpeta en la que
quieres crear el proyecto, y lo nombro como pista de
tareas y simplemente abre
esta carpeta en el código VS. Este es el nombre de nuestro
proyecto. ¿Suena bien? Espero que lo sea. Si
tienes mejor nombre, entonces también puedes usarlo. Depende totalmente de ti. Ahora ¿qué tenemos que hacer para no
crear aplicaciones JS? ¿Recuerdas que acabamos de hacer eso
en nuestra sección anterior? Sí. Simplemente, abrimos nuestra terminal e inicializamos nuestro proyecto usando NPM en ella para Como
usaremos y aquí Verás, obtenemos pgSNFle con
alguna configuración predeterminada. Aquí, podemos ver que nuestro
archivo principal es index dot js, que es el archivo que se ejecuta cuando
iniciamos nuestra aplicación. Vamos a crear index dot
js file, y eso es todo. Aquí en este archivo, escribiremos código
para nuestro back end.
27. Construir un servidor con Express: Así que en la sección anterior, creamos nuestro servidor
utilizando el módulo STTP El problema con el
módulo STTP es que tenemos que definir nuestros diferentes endpoints API en estas declaraciones I y LSI, lo cual no es muy claro y tampoco es fácil de mantener
para grandes proyectos Entonces es por eso que usamos paquete o
módulo
muy popular llamado express dot js. Express Dogs es mínimo y flexible para crear
mejores aplicaciones de nodo. En palabras simples, al
usar express dot js, podemos simplificar nuestras rutas. Podemos manejar fácilmente la
solicitud y respuesta de STIP, middlewares y
muchas más cosas Déjame mostrarte algo. Aquí está el
paquete Express en el sitio web de NPMJS. Se puede ver que sus descargas semanales
son casi 37.2 millones, lo que es una locura y casi el 90% de los desarrolladores de proyectos de NODJS
utilizan paquete Express Es muy importante
Master Express. En primer lugar, instalemos
este módulo en nuestro proyecto. Abrir terminal y escribir
y pm Instalar Express. En el momento que estoy
grabando este curso, su última versión es 5.1 0.0. Quieres obtener la misma
experiencia que yo estoy obteniendo, entonces puedes escribir aquí
NPM install Express airear 5.1 0.0 y presionar Enter No te preocupes por Express. Es un paquete realmente sencillo. D. Ahora queremos usar este módulo Express en
este archivo js de índice. ¿Me puedes decir
qué tenemos que hacer? Bien, ingresaremos el módulo express
usando require function, express, y esta
función requerida devuelve una función. Simplemente lo almacenamos en
una variable llamada express. Ahora, para crear una aplicación
express, llamamos aquí a esta
función express, que devuelve un
objeto y
lo almacenamos en una variable llamada
aplicación o app. Se le puede dar cualquier otro nombre, pero probablemente todos los
desarrolladores lo llamaron app. Vamos con la app. Ahora en este objeto app, obtenemos muchos métodos útiles. Por ejemplo,
tenemos aquí app dot get app dot post, app dot pot. App dot patch, app
dot DLD, etcétera. ¿Recuerdas dónde
vemos estos cinco métodos? Son métodos SDDP para crear diferentes
tipos de API Si queremos definir nuestra
API para el método sddpgt, entonces usamos app dot Si queremos definir el método
SDDP delete, entonces usamos app dot DLD Igual que podemos crear post, put y patch request. La manera de definir todos estos
cinco métodos es la misma. Aún así, veremos todos los métodos en esta
sección uno por uno. Por ahora, comencemos
con la solicitud de GAD. En este método
GAT, en el primer parámetro, tenemos que escribir nuestro nombre de punto final
API. Supongamos que queremos definir
G API para URL, SGDP, Columna doble slash, host local, Columna 3,000 slash Ahora, ¿cuál es nuestro punto final en esta URL? Tudos es nuestro punto final de API Eso es lo que tenemos que escribir
aquí en el primer parámetro. Asegúrate de que primero le añadamos el corte de Hefward
. De lo contrario, esto
no funcionará correctamente. Ahora bien, y si queremos
definir get API para URL, SDDP columna doble slash
localizada columna 3,000, que es la
URL raíz de En ese momento, solo podemos
adherir slash hacia adelante, que representa el punto final raíz Ahora tenemos que definir
qué pasará cuando nuestro front-end envíe
solicitudes al punto final. ¿Te acuerdas?
Déjame mostrarte. Aquí, pasamos la
función de devolución de llamada, y en esto, obtenemos dos objetos,
request y response Esta solicitud tiene
todos los detalles sobre solicitud de
URL y con
este objeto de respuesta, podemos enviar detalles
relacionados con la respuesta. Ya lo vimos
en la lección del módulo STP. Ahora lo que queremos enviar cuando alguien envía
solicitud en esta API. Por ahora, simplemente devolvemos un punto de respuesta de texto
SEND Task Track project. Cuando alguien envía Get
request en este punto final, esta función se
ejecutará y luego simplemente devuelve este texto en
respuesta, simple como establecido. Por estas dos líneas, se crea nuestro servidor
Express, pero tenemos que ejecutar o escuchar
este servidor en algún puerto. Si no escuchamos nuestro servidor, entonces nuestra API no funcionará. Aquí al final, escribimos app dot L ISE y simplemente aquí pasamos nuestro número de puerto en
el segundo parámetro, volvemos a pasar la función Callback, que se ejecutará cuando nuestro servidor empezara a
escuchar en este puerto Aquí podemos simplemente consol punto servidor de registro se está ejecutando o escuchando
en este puerto 3,000 Guarda los cambios y
ejecutemos nuestro archivo index dot js. Nodo de escritura, índice punto js. C Server está escuchando
en el puerto 3,000. Bonito. Ahora volvemos al navegador y ejecutamos Local host Columna 3,000, que es la URL raíz y vemos aquí obtenemos el texto del proyecto de
seguimiento de tareas, que enviamos desde nuestro servidor. Puedes ver que Express hace que
nuestro código sea realmente simple. Podemos comparar nuestro código
actual con
el código del módulo SGDP anterior Express lo hace realmente simple. Además, esta es nuestra primera API. Por eso escribimos
solo texto en respuesta. Ahora, a medida que avancemos
en nuestro proyecto, comenzará una
verdadera emoción
28. Ejercicio para crear un servidor Express: Es tiempo de poco ejercicio. Quiero que elimines todo el código del archivo JS de punto índice y vuelvas a crear servidor Express y crear API para
root y point. Mediante este ejercicio, se
familiarizará con hacer servidor
Express. Literalmente,
tomará solo 1 minuto. Intenta completar este ejercicio y luego ver la solución. Bien. Espero que resuelvas el ejercicio o
trataste de resolverlo. Ahora veamos la solución. En primer lugar, necesitamos módulo
Express en nuestro archivo. Requerir Express y almacenarlo
en variable llamada Express. Este express es una función, por lo que la llamamos aquí y
devolverá nuestro objeto servidor
u objeto de aplicación. Así que vamos a almacenarlo en
una variable llamada app. Aquí creamos nuestro
servidor Express usando estas dos líneas, pero tenemos que escuchar nuestro servidor solo entonces podremos ejecutar nuestra API. Entonces al final, simplemente agregamos app dot Lisen y al primer parámetro,
¿qué pasaremos? Bien, pasamos puerto,
que son 3 mil. Y en el segundo parámetro, pasamos la función callback
y dentro de ella simplemente consola dot log server se está
ejecutando en el puerto 3,000 Una cosa es, escucho
servidor antes de agregar API porque muchas veces me
olvidé de escuchar servidor, y va a perder mucho tiempo. Siempre escucho el servidor cuanto creo el servidor. Ahora, en el medio, podemos
definir nuestra API cualquier cosa. Entonces para Get request, agregamos app dot GAT. Al principio, agregamos
nuestra API y punto, y luego en el
segundo parámetro,
anunciamos la función de devolución de llamada, que tiene dos parámetros,
request y response Dentro de esta devolución de llamada, simplemente
enviamos texto usando el punto de respuesta SNG Este es un proyecto de seguimiento de tareas. Guarda los cambios, y
aquí tenemos que detener nuestra aplicación desde la terminal porque todavía está
ejecutando código antiguo. Nuevamente ejecutamos node
index dot js file. Ver, servidor esta escuchando, y en nuestro navegador, obtenemos el texto
actualizado, muy sencillo.
29. Creación de API para obtener la lista de todos: Ahora vamos a crear API para
obtener toda la lista de todos. ¿Me puede decir qué
método SDP tenemos que usar? Correcto, para obtener los
datos del servidor, utilizamos el método Get DP. Entonces aquí escribimos app dot GT. Y digamos que queremos
darle a esta API nombre todos. Entonces pasamos aquí slash
todos, y después de eso, en el segundo parámetro, pasamos la función callback, que tiene dos parámetros
request y response Ver, para todas las API, esta estructura seguirá
siendo la misma. Solo este cambio de método SDP,
este cambio de punto final y lógica dentro de esta función
web de llamada cambiarán Así es como Express JS hace que
nuestro proyecto sea simple y limpio. Ahora, actualmente, no
vamos a trabajar con una base de datos porque no queremos agregar complejidad
extra para
nuestro primer proyecto. Aprenderemos todas estas
cosas paso a paso. Así que no te preocupes por la base de datos. Ahora aquí, tenemos que
enviar todos los array. En la parte superior, defino
un dummidata llamado todos array y simplemente
agrego algunos todos en este Aquí, cada tarea es objeto
con cuatro propiedades. ID, vamos a citarlo a una tarea, que es un texto de tarea. Vamos a crear todas las APIs
para el proyecto uno. Etiquetas, que son las
etiquetas relacionadas con tarea, que es una matriz, no solo coma JavaScript. Y estatus para hacer. Estas propiedades, ID, tarea, etiquetas, estado es definido
por noches developer, lo
que significa que
tú como quieres llamarlo, cuántas propiedades necesitas, estas cosas tienes
que
decidir en función de qué datos queremos almacenar
y qué datos no queremos. Ahora vamos a duplicar este objeto dos veces más usando Sift más alter más flecha abajo o Sift más Opción
más flecha abajo. Cambiamos este ID a dos tareas para crear EPI para lista
de todas las etiquetas a hacer, no Js y estado a hacer Por fin, simplemente cambiamos ID a tres tareas para planificar proyecto uno, JavaScript de
texto y
estado para hacer. Quiere simplemente devolver esta
matriz como respuesta cuando alguien envía una solicitud Gut a API
que recorta todos y Point Lo que escribimos aquí, nosotros, escribimos respuesta punto SN y
simplemente pasamos nuestra matriz todos. Guarde los cambios y
verifiquemos que esta API
funciona o no. Abra el terminal, cierre el servidor
actual en ejecución usando Control más C, y vuelva a ejecutar este archivo. Ahora en el navegador en el
lugar del sitio web raíz, simplemente
llamamos slash
Todos y Point Ver, aquí obtenemos nuestra matriz. Así de sencillo enviar datos desde el back-end usando G API.
30. Cómo configurar el reinicio automático de nodemon: Actualmente, cuando hacemos algún
cambio en nuestro proyecto, tenemos que cerrar nuestro servidor
anterior en ejecución y reiniciar nuestra aplicación, lo cual es realmente molesto. Para
reiniciar automáticamente nuestra aplicación, tenemos un paquete
llamado nodemon Es realmente útil. Abra el terminal y escriba
NPM install o IG nodemon. Aquí utilizamos DSG para instalar este
paquete Norman globalmente De lo contrario, tenemos que instalar ni luna en cada proyecto de nodo. Además, si estás usando Mac, entonces para instalar paquete
global, tienes que escribir sudo
al inicio
del comando y luego
te pedirá la contraseña del sistema Ahora bien, ¿cómo podemos ejecutar el archivo usando
el nodo uno? Déjame mostrarte. En el terminal, anteriormente, estamos ejecutando file usando
node, index dot js. Ahora para asentir M, escribimos
nodemon index dot js. Tan simple como eso. Ver, aquí
obtenemos nuestra versión nodo M. O reiniciando, podemos ingresar a RS. También, nos está diciendo
viendo Path period, lo que significa raíz
de este proyecto. Después de eso, está viendo
extensiones como Js,
MGs , Cgs, JSON, etcétera. Un archivo que tiene este
tipo de extensiones, Nod moon está constantemente
vigilando esos archivos, y si algo
cambia en esos archivos, reiniciará nuestra aplicación Al final, vea, nodemon también está ejecutando
Command node index dot js Al usar nodemon,
no tenemos que reiniciar
nuestra aplicación Se
reiniciará automáticamente cuando cambiemos algo en esos archivos
con esas extensiones.
31. Variables del entorno: Ahora actualmente estamos
configurando manualmente el pod de nuestro servidor. Pero en el mundo real,
ese pod se establece por entorno en el que se está ejecutando nuestra
aplicación. Específicamente, es administrado por el proveedor de hosting o plataformas de
desarrollo
como render, Heroku, AWS, etcétera. Cuando implementamos nuestra aplicación,
en estas plataformas, nuestro puerto 3,000 podría ser
utilizado ya por otro servidor. En su momento, si codificamos
duro nuestro puerto, entonces nuestro servidor
no se ejecutará en ese puerto, y nos dará
error en el despliegue. Entonces, ¿cuál es la solución aquí? Es realmente simple.
Revisaremos una condición. Si en nuestro
entorno de aplicación, se define la variable de
puerto, entonces usamos esa variable de puerto, lo contrario, usamos nuestro puerto codificado
duro. Déjame mostrarte que
es realmente sencillo. Entonces aquí, antes de
escuchar nuestro servidor, creamos una variable llamada
port equals to now here, ¿cómo podemos comprobar que nuestro servidor tiene puerto en su entorno o no? Entonces para eso, tenemos un
objeto llamado process dot ENV. Esta ENV es para el medio ambiente. En este entorno, obtenemos todas las variables que se establecen mediante plataformas de
alojamiento y
puerto para la variable Port. Entonces, si alguna plataforma de hosting
quiere establecer un puerto diferente, entonces ellos los almacenarán este proceso punto Env
dot port variable Esa es una convención común. Además, todo el nombre de
variable de entorno es todo letras mayúsculas, y es por eso que también le damos a esta variable nombre
como todo puerto capital. Entonces con solo mirarlo, sabemos que puede ser variable de
entorno. Si este proceso dot nw dot port está disponible, entonces no hay problema. Pero si no está
disponible o establecido, entonces tenemos que pasar nuestro valor de puerto codificado
duro. Nosotros adde u operador, que es par símbolo dos veces, es la clave arriba
enter o return Aquí pasamos nuestro
puerto, que es de 3 mil. Ahora pasemos
esta variable de puerto en el lugar de este puerto codificado
duro, y también cambiaremos
este mensaje de consola. Hagamos esta cadena
como cadena de plantilla usando acti porque
en las cadenas de plantilla, podemos acceder fácilmente a la
variable y cambiar esta 3,000 con corchetes de
coli de dólar, pot Si este
puerto de entorno está disponible, entonces lo usamos o si
es falso o nulo, entonces usamos este puerto 3,000. Tan simple como eso. Actualmente,
en nuestra aplicación, el entorno Port no está configurado. Es por eso que nuestra aplicación se ejecutará continuamente en el puerto 3,000. No te preocupes si estás un poco confundido acerca de este
proceso punto ENV, lo
veremos en detalle
en los próximos proyectos Déjame darte un atajo para configurar la aplicación de nodo. Primero, requiere Express,
crear aplicación express, crear esta variable de puerto usando esta expresión y escuchando la aplicación express
en el puerto. Estas cuatro cosas permanecerán igual en todas las aplicaciones de nodo. Sí, podemos agregar más
funcionalidad en otras líneas, pero nada cambiará
en estas cuatro líneas.
32. Parámetros de ruta y parámetros de consulta: Anteriormente, creamos API para obtener la lista de todo lo
que hay que hacer en nuestra aplicación. Pero y si necesitamos obtener
la información sobre solo single para hacer como hacer
con ID uno o ID tres. Para eso, necesitamos
pasar ID en URL API. Nuestro APIURL se ve así. Todos ON, lo que significa que
queremos buscar uno para hacer
información cuyo ID es uno tipo de variable
que pasamos en nuestra URL se llama
parámetro route. Es muy importante para proporcionar la información
específica sobre la solicitud de API como ID,
estado, fecha, cualquier cosa. Déjame mostrarte cómo
podemos establecer este tipo de URL
API y acceder a
los parámetros de ruta. Agregamos nuevo punto final de API GAT
para reducir todo slash. Ahora aquí para definir el parámetro de
ruta, usamos dos puntos y damos nuestro nombre de variable de
ruta como ID. Este ID es nuestro parámetro de ruta. Podemos llamarlo como
todo ID, pero ID es corto y dulce, así que vamos con ID, y eso es todo. Así es como podemos definir el
parámetro de ruta en nuestra URL API. Accedamos a este
parámetro de ruta en nuestra lógica API. Nuevamente, nos adherimos
a la función callback con dos parámetros,
request y response Ahora, dentro de esta función,
¿qué opinas? En qué objeto,
obtenemos información sobre nuestro parámetro de ruta,
solicitud o respuesta. Ocho. Obtenemos información sobre el parámetro de ruta
en solicitud. Así que solicita PAMs de punto. En este objeto perms, obtendremos todos los parámetros de
ruta, y podremos acceder a él por ID de punto Ver, aquí también obtenemos sugerencias
de auto. Ahora simplemente vamos a enviar este ID en nuestra respuesta punto SND
guardar los cambios, y volver a nuestro navegador Dirígete al host local, Columna 3,000 todo slash one S, aquí obtenemos ID uno Estamos obteniendo con éxito el parámetro de ruta.
Ahora aquí hay una cosa. También podemos pasar múltiples parámetros de
ruta en nuestra API. Por ejemplo, podemos
pasar el estado de la tarea todo. Ahora en el back end, agregamos aquí parámetro de
ruta.
¿Cómo podemos hacer eso? Derecha. Agregamos slash Clan status, y ¿cómo podemos acceder al parámetro de
ruta Derecha. Utilizamos solicitud
punto Perms estado punto Déjame mostrarte toda la
ruta Perms objeto. Guarde los cambios,
y vuelva al navegador, pasamos aquí el valor de estado
después de nuestro valor de ID. Asegúrese de que el orden sea el
mismo que definimos en nuestra API, lo que significa primero
ID y luego estado. Mira aquí obtenemos el objeto
params con esas dos propiedades
que definimos en API Ahora puede que tengas curiosidad. ¿Y si no
pasamos por aquí el estado? Veamos también eso. Quitar
el valor de estado y ver, aquí obtenemos no podemos
llegar a hacer uno, lo que significa que nuestro servidor no
encontró ABI con esta URL. Si definimos
parámetros de ruta en nuestra API, entonces asegúrese de que pasaremos todos los parámetros de ruta
en el orden correcto. Hay otra forma de
pasar datos en URL, que es mediante el uso de parámetros de
consulta. Si estás usando
sitios web, entonces en URL, podrías ver un signo de interrogación y luego pasar algunos tipos
de variables como shot igual a fecha y orden igual a una C para
ascendente, etcétera Estos son los
parámetros de consulta que se utilizan para pasar datos en URL. Ahora podría preguntarse,
¿cuál es la diferencia entre los parámetros de ruta
y los parámetros de consulta? Ésos se utilizan para
pasar datos en URL, pero los parámetros de ruta se utilizan
para pasar datos que
son más requeridos donde los parámetros de consulta se utilizan para pasar datos, que son adicionales
u opcionales. En palabras simples, en nuestra API, si front end no
pasó los parámetros de ruta, entonces nuestra API nos dará error. Pero si no pasamos parámetros de
consulta, entonces nuestra API
no nos dará error. Se trata de un detalle adicional. Por ejemplo, si no
pasamos todo ID o estado, entonces nos dará
error que API no encontró. Pero si no pasamos estas variables después
del signo de interrogación, entonces no obtenemos error. Ahora déjame mostrarte
cómo podemos acceder a los parámetros de consulta en nuestra API. Para eso, no necesitamos
cambiar nada en la URL de la API. Y accede directamente a ellos
en nuestra función de devolución de llamada. Para el parámetro query, tenemos
otro objeto en request, que es request dot
query, y eso es todo. No necesitamos hacer
nada en nuestro punto final. Guarda los cambios
y echa un vistazo. Ver, aquí obtenemos
el objeto de consulta. punto de solicitud se utilizan
para los parámetros de ruta, y la consulta de punto de solicitud se
utiliza para los parámetros de consulta Los usaremos mucho cuando
construyamos API complejas. Son muy útiles.
33. Obtén todo individual por ID: Ahora veamos como podemos
regresar single para hacer por su ID. Para eso, lo que usemos
parámetro de ruta o parámetro de consulta, usaremos parámetro de ruta porque esa información
es la más requerida. Entonces eliminamos este estado
de clase de nuestro punto final,
no lo necesitamos. En la función Colvey, necesitamos devolver
el single to do, cuyo ID es el mismo que
nuestro parámetro de ruta ID En primer lugar, vamos a almacenar el parámetro de ruta
en una variable separada. Entonces Cs para hacer ID es igual a, ¿cómo podemos acceder a los parámetros de
ruta? Solicitamos ID de punto params. Ahora tenemos que encontrar
un single para hacer de nuestra matriz todos cuyo ID
es el mismo que este para hacer ID. Que usamos un método de
matriz JavaScript, que es find. Todos array dot find, y dentro de este método fino, pasamos la función de devolución de llamada, y aquí en el parámetro, obtenemos el single
para hacer objeto a Así que este T es este único
objeto en la matriz Tds Y regresamos aquí condición si t ID es igual a nuestro ID de todo. Si no conoces
este buen método, entonces déjame explicarte en breve porque es puro concepto de
JavaScript. Entonces este método fino comprobará nuestra matriz Tudos, y primero, elegirá el primer objeto de la matriz en esta variable T, luego verificamos la condición El ID de punto T es
el mismo que donde hacer ID. Si es cierto, entonces este método fino
devolverá ese único objeto. Así que almacenamos
contras invariables para hacer. A, si no
se cumple esta condición, entonces establecerá T como siguiente objeto y luego volverá a
verificar la condición. Y así es como
podemos encontrar single para hacer usando este método fino. Vamos a enviar esto para hacer en el método de
respuesta punto SN. Guarda los cambios
y echa un vistazo. Vamos a eliminar estos
parámetros de consulta y así valor de estado, y aquí no obtenemos nada. ¿Por qué? Pasamos ID uno, y en nuestra matriz de todo, también
tenemos que ver con ID
uno. Entonces, ¿qué pasa? Intentemos consolar
el sencillo todo. Dio los cambios y actualice
la página en el navegador. Ahora en nuestro terminal VSCO, donde estamos ejecutando nuestro servidor, obtenemos nuestras consolas Ver, aquí nos ponemos indefinidos. Entonces no podemos encontrar todo de nuestra matriz de todos, y
ese es el error. Puede ocurrir este error porque no
estamos comparando
los ID correctamente. Intentemos también consolar este tipo de ID de todo
usando el tipo de do ID. Esto devolverá el
tipo de hacer ID, guardará los cambios y
refrescará la página. Volver al código VS y ver, aquí obtenemos undefined
para single para hacer, y obtenemos type
string qué hacer ID. Es por eso que no estamos consiguiendo
single para hacer porque aquí nuestro ID de todo es entero y
lo estamos comparando con la cadena. Así que tenemos que convertir esta cadena de ID de
Td en entero. Así que podemos envolver esta
solicitud punto perms dot ID con parse integer La función de número entero de paso
convertirá nuestra cadena en número entero. Guarda los ings y echa un vistazo. Refresca la página y mira, aquí obtenemos el objeto single para
hacer con ID uno. Si pasamos aquí ID tres, entonces llegamos aquí para hacer con el
ID tres, entonces está funcionando. Bueno. Ahora podrías preguntar
en el parámetro route, estamos pasando uno como entero. Pero por qué en la parte de atrás lo
consiguen como una cuerda. Entonces la verdad es
lo que pase en la URL, se pasa como string. Entonces si queremos pasar
algo como entero, entonces tenemos que
convertirlo en el back end. No podemos pasar el valor entero
usando el parámetro de ruta, y también es cierto
para los parámetros de consulta. Así que siempre recuerda
cuando definas parámetros de
ruta o parámetros de
consulta, entonces tienes que
convertir su valor usando el método parse integer o
parse float. Yo intencionalmente creo este
error para mostrarte lo que podría suceder creamos API y Xs
ID en el parámetro route.
34. API POST para agregar nuevo todo: Ahora vamos a crear post API para
agregar un nuevo objeto para hacer. Como sabemos para crear
nuevos datos en el servidor, utilizamos post API. También en postsolicitud, front end enviará
datos al servidor. Por ejemplo, aquí creamos post API para agregar un nuevo todo. Por lo que nuestro front-end enviará detalles sobre
todos como tarea, etiquetas y estado en el
cuerpo de esa solicitud. Fuera de esta información, ¿cómo podemos agregar nuevo todo en nuestra matriz de todos? No te preocupes, déjame
mostrarte esto prácticamente. Así que aquí definimos post
API usando app dot post, y en el primer argumento, pasamos nuestro punto final. Vamos a pasar slash todos
en el segundo argumento, pasamos la función callback con dos parámetros,
request y response Ahora podrías preguntar que estos
dos puntos finales son los mismos. ¿Cómo podemos usar estas
API individualmente? Así que aquí podemos ver esta
API utilizó el método Get, y la segunda API
se utiliza el método post. Cuando front-end envía solicitud de
API en este
punto final con el método G, esta función se
ejecutará y si el frontend envía la solicitud de API en el mismo
punto final con el método post, entonces esta función se ejecutará Veremos como enviar
postsolicitud en tan solo un minuto. Ahora, como sabemos desde el front-end, enviamos datos en el cuerpo de la
solicitud y ¿cómo
podemos obtener información
relacionada con la solicitud en esta función? Podemos utilizar este parámetro de
solicitud. En esta solicitud, obtendremos toda la información sobre
esa solicitud en particular. Aquí tenemos solicitud, y en esta solicitud, tenemos propiedad llamada cuerpo. Este cuerpo tiene todos los datos que el front-end envía
con la solicitud, que es nuestro objeto todo, lo
almacenamos en la
variable llamada todo. Y después de eso, simplemente
consol dot log este todo, y también respuesta
dot enviar esto para hacer Ahora, probemos, estamos obteniendo datos en nuestra
variable todo o no. Anteriormente, estamos enviando
simple Get request from the Browser URL porque por defecto browser send
Get request to the URL, pero no podemos enviar otro
SDDPRquest usando Para eso, necesitamos código
front-end
podemos usar
software de degustación API como Postman, o también podemos usar una extensión de código VS
llamada cliente Thunder A partir de estas tres opciones, instalar la extensión VSCode
es mucho más fácil Entonces en este curso,
lo más probable es que usemos
Tender client y Postman ambos porque estamos probando Advanced API,
necesitamos Postman Pero no te preocupes, ambas
interfaces son iguales. Lo principal es que deberíamos poder
probar nuestra API, tan simple como eso. Dirígete a la extensión
final desde aquí, y busca
cliente Thunder e instala. Ahora en nuestra lista de paneles, se
agrega
este ícono de cliente de licitación. Así que vamos a abrirlo. Y aquí podemos degustar nuestras
APIs para nuestro proyecto. Entonces, antes que nada,
ingresamos a nuestra URL API, que es SDDP, columna doble barra diagonal
hacia adelante Host local, Columna 3,000 barra diagonal Tu Dos Y qué método necesitamos,
necesitamos método post. Entonces seleccionamos post desde aquí, y ahora tenemos que pasar Todo
Object en nuestro cuerpo de solicitud. Entonces para eso, seleccionamos aquí
cuerpo y en la opción JSON, aquí pasaremos
nuestros datos en objeto. El primer campo que necesitamos es tarea. Tenemos que pasar nombre de campo en códigos
dobles y también tenemos que pasar valor
en códigos dobles. Esta es una tarea nueva. Además, si no puedes ver
estos rellenos correctamente, entonces cierra este penal usando Control más B o
Comando más B. Después de eso, necesitamos otro
campo que es tags, y pasamos aquí array, y en eso pasamos dos
valores SGML, y CSS Último estado de llenado y valor, digamos, para hacer. Ahora
aquí hay una cosa. Este nombre de relleno,
que es esta tarea, estado
fiscal, estos nombres los
establece el desarrollador backend Cualquiera que sea el nombre definido por el
desarrollador de Bend, el desarrollador
front-end debe enviar datos con el
mismo nombre de campo. De lo contrario, cómo en
el back
end obtenemos datos del
cuerpo de la solicitud Para enviar esta solicitud de publicación, damos clic en el botón Enviar. Verás, no obtuvimos nada, y si revisamos nuestra terminal, entonces también nos ponemos indefinidos. Por qué no estamos obteniendo los datos en nuestro objeto cuerpo
punto de solicitud, lo que estamos haciendo mal. Cuando front end
envía post request, envía datos en el cuerpo de
la solicitud en formato JCN, y eso es lo que también hicimos
en nuestra solicitud de prueba Por defecto, el
servidor Express no sabe leer y
entender automáticamente esos datos JSN Para Express, necesitamos un traductor que
convierta esos datos JSN en un simple objeto Javascript porque no podemos
trabajar directamente con datos JSN Necesitamos convertirlo
en objeto o array, que nuestro Javascript
pueda entender. Para eso, tenemos un
middleware en Express, que funcionará como traductor Entonces después de la variable todos a, agregamos app dot U, y en eso,
llamamos a nuestro middleware express dot JSN y eso es Asegúrate de agregar este
middleware antes de nuestras APIs, y también tienes que llamar a este express dot
JS y De lo contrario, no va a funcionar. Actualmente, sin este middleware
express dot GSN, estamos obteniendo request
dot body Ahora vamos a guardar los cambios
y otra vez, enviar post solicitud. Ver, ahora obtenemos nuestro cuerpo de punto de
solicitud, igual que enviamos este objeto. Entonces esta es la importancia del middleware
express dot jSn. Ahora solo tenemos que agregar este
nuevo todo en nuestra matriz de todos. Así que usamos aquí método
simple array, todos array dot push. Esto agregará nuevos datos en la
última posición de la matriz. Y aquí en el método push, pasamos objeto porque todos
nuestros todos están en objeto, y tenemos que seguir la misma estructura de
objeto
para que lo nuevo haga. Entonces, antes que nada,
necesitamos identificación y cómo podemos obtener el no lo
pasamos desde el front end. Entonces para ID, podemos hacer
algo como esto. Obtendremos el último en hacer
ID y aumentarlo en uno. Entonces para obtener el último en
hacer de la lista, escribimos todos array en paquete
cuadrado todos
array dot Length, que actualmente es tres. Pero sabemos que el
índice de matriz comienza con cero. Entonces tenemos que hacer aquí
longitud menos uno. Así que esta matriz
Tds entre corchetes, Tds array longitud de punto menos
uno es nuestro último en hacer objeto, y queremos acceder a su Entonces agregamos aquí ID y
simplemente lo aumentamos en uno. Entonces, si nuestra longitud de flecha es tres, entonces tres menos uno, que es dos, que es el
índice del último elemento. Y luego accedemos a su ID
y lo aumentamos en uno, que es cuatro, así de simple. A continuación, tenemos tarea llena, y pasamos valor como para hacer lo que obtenemos de
request dot body, y para acceder a
tarea ad dot task. A continuación, tenemos texto, y pasamos valor todo punto texto. Por último, tenemos estatus, ¿
cuál es qué? Nosotros para hacer estado de punto. Ahora creo que esto
podría confundirte. Definimos este
objeto Nut por separado. C Nu todo equivale
a pasar esto aquí. Y en el método push, simplemente
agregamos esta nueva para hacer. Creo que esto se ve más claro. Además, una cosa
que quiero decirte en cualquier API al final de
la función callback, debemos en respuesta punto sg De lo contrario, en nuestro front-end, nuestra solicitud sigue funcionando, y eso hace que nuestra velocidad
general baje. Así que asegúrate en cada
API, devolvemos algo. Podrías preguntar, ¿qué debemos devolver de la solicitud de correo? Desde la solicitud de publicación, podemos devolver los datos agregados
recientemente en nuestro servidor en la base de datos. Entonces nuestro front-end obtiene toda la información como ID
y los usa como quieran. Entonces aquí simplemente devolvemos esta nueva para hacer, guardar los cambios, y echar un vistazo,
enviar la solicitud nuevamente y ver ahora estamos
obteniendo datos con ID cuatro. Si buscamos todo lo que hacer
desde la solicitud Get, C, obtenemos cuatro tus dos Así que
creamos exitosamente post request y agregamos nuevos Tudó en
nuestra matriz Tudos Recapitulemos rápidamente lo que
aprendimos en esta lección. Por lo que usamos post request para crear nuevos datos en el servidor, y obtenemos esos nuevos datos
del cuerpo de la
postsolicitud enviada por front end. Para probarlo, utilizamos esta
extensión de cliente de licitación y enviamos nuestros datos en JCNFMat que es el
formato común para el Ahora en el back-end,
necesitamos convertir datos en un sencillo formato
Javascript, y por eso usamos
Express D JCNMDDleWare y lo
agregamos Express D JCNMDDleWare y lo
agregamos Sin este Express
dot jcnmddleware, estamos obteniendo request Después de eso, agregamos los nuevos datos en
objeto separado con todo está lleno y luego simplemente
lo empujamos en la
matriz de Tudou y al final, devolvemos los nuevos datos agregados del punto
de respuesta SN Tan simple como eso. Ahora
en la siguiente lección, mejoraremos
esta solicitud de publicación.
35. Validar los datos de usuario: Actualmente, nuestro front-end está enviando los datos
que quieran enviar. Pero, ¿y si alguien no envía los datos requeridos como Tas
text o text array o status Sin ellos, no podemos agregar datos
incompletos en nuestro almacenamiento. Es malo para nuestra aplicación. Entonces en esa condición, tenemos que agregar
validación de datos en nuestra API. Entonces al inicio de nuestra API, comprobaremos que el front-end está pasando todos los datos
necesarios o no. Si no está pasando los datos
adecuados, entonces detenemos la solicitud inmediatamente con el mensaje de error
adecuado. Déjame mostrarte lo que quiero decir. Aquí, después de que estemos obteniendo los datos del cuerpo del punto de
solicitud, agregamos condición simple. Si la tarea todo punto no
está disponible, entonces devolvemos el error de aquí. Entonces en los corchetes de Cali, escribimos respuesta punto
enviar tarea se requiere. Ahora aquí hay una cosa. Incluso si escribimos aquí
response dot send, nuestro código restante también
funcionará. Para dejar de ejecutar el
código desde aquí, tenemos que agregar aquí return. Sin esta devolución, nuestro código
restante se ejecutará de todos modos. No olvides agregar devolución. Ahora vamos a duplicar este bloqueo dos veces más usando Sift más
alter más flecha abajo o Sift
plus opción más flecha abajo. Ahora simplemente cambiamos
la condición para que el texto haga texto de punto, y cambiamos el mensaje de error. Se requieren textos. Y por fin, para hacer estado de punto, se requiere
estado. Además, aquí podemos verificar más
condiciones como el texto debe ser array o el valor de la tarea debería tener más de tres
caracteres, etcétera Por ahora, no
queremos esa complejidad, así que probemos esta
implementación. Guarda los cambios,
abre el post gusto, y simplemente eliminamos
este relleno de tarea. Enviar la solicitud y ver, aquí estamos recibiendo
este mensaje. Se requiere tarea. Hermoso. Ahora front-end, solo necesita mostrar
este mensaje de error en el formulario o en cualquier lugar
que quieran mostrar. De esta manera, podemos
validar manualmente nuestros datos de campos de entrada. Pero estos son sólo tres rellenos. Imagina que tenemos de siete a ocho
campos y para cada campo, queremos validar datos. Entonces tenemos que escribir esto si condición siete a ocho veces. ¿Hay alguna otra
manera de hacerlo? Sí. Contar con biblioteca especial para
validar los datos del usuario El primero es la alegría. Esta es una de las
bibliotecas de validación de datos
más populares y robustas en el nodo JS, y también usaremos joy para la validación de datos
en este curso. Además, hay otra biblioteca como yap y validador dot js Puedes usar cualquiera de esta biblioteca. A mí personalmente me gusta la alegría, y usaremos la alegría
en el próximo proyecto. Actualmente, nuestro enfoque principal
es crear API de multitud, lo que significa crear, leer,
actualizar, eliminar API.
36. Código de paso: Ahora cuando devolvemos un
error del servidor, es mejor que también pasemos el código de error con
ese mensaje de error. Por ese error o código de estado, nuestro front-end obtiene
información sobre el éxito o fracaso
de la SDDPRquest Puede que ya
sepas de esto, o podrías haber visto este error. Por ejemplo, cuando
no encontramos una página web, sabes que alguna página web
muestra 404 no encontrada. Este 404 es el código de error o
estado para no encontrado. Consulte el código de error o
estado más común para SDDPRquest. El primero es 200, lo que significa todo o. Este es el código de estado predeterminado que envió nuestra aplicación
expresa. En nuestra solicitud también, puedes ver aquí estamos
obteniendo estatus 2000. A continuación, tenemos código 201, lo que significa creado
con éxito. Si creamos nuevos
datos en nuestro servidor, entonces podemos devolver esos
datos que código de estado 201. Se dice en qué método HTTP, podemos devolver el
código de estado al 01, escribir? En el post solicitud, si nuestros
datos son creados con éxito. A continuación, tenemos el estado 400, lo que significa mejor solicitud
hecha por front end. Estos incluyen algunas solicitudes de
acceso faltantes o inválidas o no autorizadas. Y sí, para la validación de datos, devolveremos mensaje de error
con este código de estado 400. A continuación, tenemos 404, lo que significa no encontrado. Supongamos que estamos enviando get request para conseguir que el
single se haga con ID diez. Ahora, eso no está
disponible en nuestros datos. Entonces en ese momento, podemos enviar respuesta con código de estado 404. Otro código de
estado importante es 500, lo que significa error interno
del servidor. Supongamos que obtenemos algún error al crear lo nuevo
para hacer en este servidor. Entonces en ese momento,
devolveremos respuesta con código de estado 500. Son muchos los códigos de estado, pero por ahora, estos
son de lo más útiles. No te preocupes con la práctica, recordarás todos
esos códigos de estado. Ahora, para pasar el
código de estado con nuestra respuesta, podemos agregar aquí múltiples cursor. Así que presione Alt u Opción y simplemente haga clic donde
queremos múltiples cursor. Y aquí agregamos estado de punto, y en este código de estado, queremos pasar
por datos no válidos. Pasamos 400 y ya está. Presione SCAP para eliminar múltiples cursor y que podamos pasar código de datos
con nuestra solicitud Además, si
creamos datos con éxito, entonces devolvemos respuesta
con Stas 201. Guarda el queso chan
y echa un vistazo. Envíe la solicitud nuevamente y vea, aquí obtenemos el código de estado de error, 400 mala solicitud. Encantadora.
37. res.send y res.json: Hasta ahora, estamos enviando la respuesta usando el método de envío de puntos de
respuesta. Pero este método response dot Sen se utiliza para fines generales, lo que significa que en este método
response dot SN, podemos enviar cualquier tipo de
contenido como texto plano, SDML o también podemos
pasar datos JSON Ahora cuando creamos API en nodo, mayoría de las veces
queremos devolver datos en el JSNFMat porque es
mucho más fácil Aquí en la respuesta, tenemos otro método
llamado response dot JSON. Esto convierte automáticamente nuestros datos en el JCNFMat y también establecerá tipo de contenido de
encabezado a la
aplicación No te preocupes si no conoces
el tipo de contenido de encabezado, lo
veremos en
la siguiente sección. Utilizaremos el
envío de puntos de respuesta para respuestas simples, ya sean texto, SDML u objetos, y usaremos response dot JSN cuando queramos asegurarnos de que la respuesta está en formato JSN y correctamente formateada
para Ambos funcionan casi igual. Pero para los datos de JSN, punto de
respuesta GSN es
más conveniente En la primera solicitud de GAD, queremos enviar un texto plano Utilizamos aquí respuesta punto SN. Después de eso, queremos enviar
a hacer array, así podremos usar ar
response dot JSN siguiente, también, queremos enviar objeto,
entonces lo que vamos a usar Usamos response dot JSN vamos a eliminar
también esta consola. No necesitamos consolas
en nuestro servidor. Es sólo para pruebas. A continuación, aquí estamos
devolviendo error. Primero, cambiamos el
envío con JSN JSON, y JSN es mejor que
pasemos ese error en objeto Envuelva esta cadena en objeto y
simplemente agréguela propiedad de mensaje y dos puntos Lo mismo hacemos por este error y
también por este último error. Y cuando
creamos con éxito un nuevo que hacer, entonces estamos regresando
el nuevo objeto para hacer. Entonces también cambiamos
la arena con JSON. Asegúrate de no pasar texto
plano en el método JN de
respuesta. Te dará error. Guarde los cambios, y en
las pruebas anteriores, vaya a la sección de encabezado. Aquí obtenemos un montón de detalles, pero por ahora, necesitamos
este tipo de contenido. Ver, se establece en texto STML. Ahora enviemos otra solicitud de publicación
no válida. Ver, aquí obtenemos objeto que enviamos con propiedad de
mensaje, y ahora si comprobamos
nuestro tipo de contenido, vemos que está configurado en JSON. Use el envío de puntos de respuesta
para texto plano o DML y use el punto de respuesta
JSN para enviar datos GSN
38. Actualiza un solo Todo con solicitud PUT: Ahora vamos a crear una API para
actualizar nuestro único todo. Supongamos
que queremos actualizar el texto de tarea o queremos
actualizar el estado. Entonces aquí queremos
actualizar pequeños detalles
sobre nuestros datos actuales, o también podemos actualizar
toda la información. Entonces es mejor que utilicemos
aquí put request. Además, puedes usar tu
método de página. Está totalmente bien. Así app dot pot 0.2 slash Todos. Ahora aquí necesitamos el
ID de todo que queremos actualizar. Agregamos aquí
parámetro de ruta, calma ID. Después de eso, agregamos función de
devolución de llamada con
solicitud y respuesta Ahora, antes que nada, vamos
a obtener el parámetro ID. CSid es igual a solicitar ID de parámetros de
punto. Sabemos que este ID es string, así que lo envolvemos con función de entero
parse. Nuestra primera tarea es que
tenemos que encontrar qué elemento de la
matriz tiene este ID. Y entonces por ese índice de elemento, podemos cambiar otros
valores muy fácilmente. Entonces, para encontrar el índice, usamos todos array dot
find index método. Aquí, obtenemos single to do
object en esto y luego pasamos condición T ID debe ser
igual a nuestro parámetro ID. Esta expresión devuelve
el índice del elemento, por lo que lo almacenamos en la variable
llamada a hacer index. ¿Y si ID de pase de usuario, que no está disponible
en nuestra matriz? En ese momento, este
valor de índice de todo se convertirá en menos uno porque este método de
índice fino devuelve menos uno si no lo
encontró para hacer índice. Aquí pasamos si la condición para hacer índice es igual a menos uno. Después devolvemos el estado del
punto de respuesta 404, que no se encuentra y luego
punteamos Json y enviamos objeto con mensaje de propiedad y simplemente devolvemos aquí
mensaje para no encontrar. Asegúrate de agregar
aquí esta devolución. Genial. Supongamos que
encontramos un índice de todo, entonces tenemos
que actualizar los campos de ese elemento con nuestros nuevos datos pasados
con solicitud API. Entonces en la parte superior, primero
obtenemos datos de request dot body y almacenamos
ese objeto en todo variable. Ahora, en lugar de definir
tres variables diferentes, podemos usar aquí la desestructuración de
objetos En el lugar de nombre de variable, simplemente
podemos agregar corchetes
CLI y escribir nuestros nombres de propiedad que pasaron en el cuerpo del punto de solicitud Primero, obtenemos tarea, luego texto y luego
estado. Y eso es todo. Esta sola línea de código funciona igual que estas
tres líneas de código. Ahora en la actualización,
no cada vez que
cambiamos de tarea o
solo cambiamos datos Podemos cambiar cualquiera de
estas tres propiedades, y nuestro front-end debe pasar solo aquellas propiedades
en el cuerpo de la solicitud que
quieran cambiar. Entonces aquí podemos hacer
algo como esto. Si tarea está disponible, entonces hemos actualizado matriz para hacer índice punto tarea
es igual a tarea. Entonces, si esta tarea está disponible
en la solicitud de cuerpo, solo entonces line
actualizará la propiedad de tarea. Duplicemos esta
condición dos veces más. Reemplacemos esta tarea
con etiquetas, etiquetas y etiquetas. Además, este estado, estado, aquí está el
estado, y eso es todo. También, aquí nos
falta una cosa. Me puede decir, tenemos que
devolver respuesta al
final de esta función. Respuesta dot Json y aquí enviamos nuestro objeto
actualizado para hacer. Todos array en
paquete cuadrado, índice todo. Guarde los cambios, y
probemos esta implementación. Así que ve a Thunder Client
y crea una nueva solicitud, escribe nuestro endpoint, que
es SDDP Local host, Columna 3,000 Todos slash Aquí pasamos todo
ID. Digamos uno. Cambia este método Get para poner método y pasemos
los datos en el cuerpo de la solicitud. Objeto con tarea de propiedad y valor a esta es
la tarea actualizada. Y simplemente enviar la solicitud. Mira, aquí estamos obteniendo
los datos actualizados. Y si pasamos aquí ID
diez y enviamos la solicitud, entonces obtenemos aquí
mensaje de error no encontrado. Se puede ver
lo sencillo que es crear un PI. Entonces, si quieres
guardar tu prueba, luego presiona Control pluss o
Command pluss entonces desde aquí, también
podemos renombrar nuestra solicitud de
prueba Actualizar
39. Ejercicio: eliminar todo específico: Ahora es el momento de hacer ejercicio
interesante. Tienes que crear API para eliminar lo específico
a hacer usando su ID. Esto es mucho ejercicio fácil. El ejercicio te ayudará a aprender rápido y también a aumentar
tu confianza. Aunque no puedas completar todo
el ejercicio, al
menos intenta
resolverlo porque así es
como sabes en qué parte
tienes que trabajar más. Pruébalo y luego
cuál es la solución. Entonces espero que resuelvas este ejercicio o
al menos intentes resolverlo. Ahora
veamos rápidamente la solución. Así que aquí definimos
una nueva API usando app dot Tilt porque
estamos borrando datos aquí, puntos finales para hacer slash Callan ID, solicitud de
devolución de llamada, respuesta En primer lugar, obtenemos ID
del parámetro route. Entonces Const ID es igual a
solicitar punto params dot ID, y simplemente envolverlo con la función
parse integer Esta práctica de análisis de enteros
es muy útil porque cuando estoy aprendiendo nodo Jaz este
error repito mucho Asegúrate de no
repetir este error. Aquí también, primero, tenemos que encontrar el índice
del objeto todo, que tiene este ID. Entonces desde el método Put, copiamos esta línea variable, y además copiamos esta
condición para no encontrado y los orinamos
en nuestro método delete Ahora, después de eso,
tenemos que simplemente eliminar ese todo específico
de nuestra matriz de todos. Así que para eso, utilizamos todos
array dot splice method. En esto, tenemos que
pasar dos argumentos. Primero, qué índice
queremos eliminar, que es esto para hacer index. segundo argumento es
cuántos elementos queremos eliminar
de este índice. Supongamos que tenemos el valor índice dos, y aquí pasamos tres. Este método de empalme eliminará tres elementos con
el índice dos, y también eliminará el elemento con
índice tres y cuatro. En nuestro caso, solo queremos
eliminar este único elemento, pasamos aquí uno,
y al final, simplemente
devolvemos
respuesta punto Json y aquí pasamos mensaje de
éxito, objeto con propiedad de mensaje y valor dos eliminados con éxito. Guarde los cambios, y probemos también
esta solicitud de eliminación. Crear una nueva solicitud, cambiar la URL a STP, Columna doble
diagonal hacia delante host local, Columna 3,000 slash Studo Vamos a eliminar la
tarea Seleccione el método delete. Aquí, no queremos
pasar nada en nuestro cuerpo de solicitud,
enviar esta solicitud. Ver, aquí obtenemos
el mensaje de éxito, lo que significa que nuestra tarea uno se elimina de
nuestra matriz a dos. Ahora si volvemos a enviar la
solicitud con el mismo ID, vea, aquí no nos encontramos. Y. puede ver que crear
APIs no es tanto difícil. Y en esta sección,
creamos get,
post, put, delete,
all crud APIs Entonces espero que
entiendas cómo usar Express y crear
API elevadas con Express. Ahora en la siguiente
sección, aprenderemos algunos
conceptos avanzados de Express, vemos en la siguiente sección.
40. Sección 05: introducción al middleware: Bienvenido a la quinta sección del curso definitivo de NodeJS Esta sección trata sobre conceptos
avanzados de express
y nodo. Comenzamos con middleware, múltiples tipos de middleware, cómo trabajar con
diferentes entornos como desarrollo o producción, motores de
plantillas y la estructura profesional más completa
de la aplicación Empecemos con middleware.
¿Qué es el middleware En express, middleware es una
función que o bien llama a la siguiente
función de middleware o envía una respuesta para finalizar En palabras simples, cualquiera que sea la
función que llame a la siguiente función de middleware o envíe una respuesta para
finalizar la solicitud, esa función se
llama como Ahora déjeme hacerle una pregunta. Piense en esta
función de devolución de llamada que pasamos aquí. ¿Podemos llamar a esta
función como middleware? Sí, porque esta función está enviando una respuesta para
finalizar esta solicitud de Gad Cuando nuestro front-end envía
solicitudes a cualquier punto final de API, esa solicitud pasa
a través de un túnel o pipeline en el que se
colocan todas
nuestras funciones de middleware en orden Esta canalización se denomina tubería de procesamiento de
solicitudes. Supongamos aquí definimos
middleware uno, middleware dos, y el último middleware tres
enviará enviará Ahora cuando el front-end
envía la solicitud de API, primero, este middleware se
ejecutará una función Después de eso, eso pasará nuestra solicitud al
middleware NST dos,
y después de completar
la ejecución, el middleware dos pasará esta solicitud al
middleware tres nuestra solicitud al
middleware NST dos,
y después de completar
la ejecución, el
middleware dos pasará
esta solicitud al
middleware tres, el cual enviará la respuesta. Nuestro servidor
mantendrá este orden. Si obtenemos error en
middleware uno, entonces otros dos
middlewares Tan simple como eso. Aquí hay algunas tareas comunes
para middleware En primer lugar, se utiliza para
registrar los detalles de la solicitud. Además, se utiliza para verificar que el usuario que envía la solicitud
está conectado o no. Este es el caso más común y de
mejor uso del middleware. No te preocupes, lo veremos en la sección
de autenticación de usuarios. Ahora, la última
tarea común para el middleware es pasar los datos entrantes
. Ya terminamos. Recuerde, este punto de prensa JCN
es una función de middleware, que es pasar los datos
entrantes en formato
JSON y luego pasar nuestra solicitud a la siguiente función de
middleware,
que es esta función principal que Ahora podría preguntarse ¿por qué
necesitamos estos middlewares? ¿Podemos escribir todo el código
en la función única? Para eso, imagina que
estamos creando Bend para la aplicación de
redes sociales. Tener una API que se utiliza
para crear una nueva publicación. Ahora queremos establecer la
condición para esta solicitud. Solo los usuarios de iniciar sesión pueden
crear una nueva publicación. Si el usuario no ha iniciado sesión, le
devolveremos un error, por favor inicie sesión con su cuenta. Ahora tenemos otra API que se utiliza para agregar likes
en la publicación única. En esta API, también queremos la misma condición que
es que el usuario debe iniciar sesión. Aquí, tenemos que volver a
agregar ese mismo código. Ahora en lugar de repetir este código de
verificación bloqueado, podemos definirlo en una función de
middleware y simplemente agregar ese middleware
para todas las De esta manera, no
necesitamos repetir nuestro código. A usando middleware, dividimos
nuestro código en trozos pequeños, y eso hará que nuestro código sea
limpio y más legible Además, por middleware, podemos detener solicitud de usuarios
no deseados para
acceder a las rutas protegidas Para recapitular rápidamente, middleware es una función que o bien llamada la siguiente función de middleware
envía una respuesta a la envía una respuesta Podemos ver que el middleware es muy útil para cualquier aplicación de
nodo Entonces, en la siguiente lección,
veremos cómo construir middlewares
41. Creación de middleware personalizado: Ahora vamos a crear nuestro
propio middleware personalizado. Es realmente
emocionante y simple. Entonces aquí en nuestra aplicación, ya
agregamos express
dot Json Middleware usando app dot U. Ahora, después de eso, agregamos
otro método ABDTUuse,
y en eso, agregaremos nuestra Por lo tanto, este
método ABDTuse se utiliza para agregar
middleware globalmente a middleware globalmente a Ahora dentro de este método de uso, pasamos la función de devolución Esta función de Colbec
tiene tres parámetros, request response, y next Ahora podrías preguntar, sabemos
solicitud y respuesta. Pero, ¿cuál es el siguiente parámetro? Este siguiente parámetro se utiliza para llamar a la siguiente función de
middleware Ahora, dentro de esta
función callback, escribimos nuestra lógica. Digamos que queremos consola dot log nuestros
métodos de solicitud y puntos finales En la cadena de plantilla,
agregamos corchetes de dólar C, solicitamos método de punto,
cbakets de dólar solicitamos URL de punto Ahora aquí hay una cosa. En
cada middlewares personalizados, que definimos,
en la última parte, tenemos que llamar a
esta siguiente función De lo contrario, nuestra
solicitud se quedará atascada en este middleware y el usuario
no obtendrá la Déjame mostrarte
eso prácticamente. Guarde los cambios y vuelva
a nuestro cliente tunder. Permítanme abrir esta solicitud
y enviar la solicitud. Oh, lo siento, olvidé
ejecutar esta aplicación
usando nodemon Asegúrese de que su aplicación también
se esté ejecutando en la terminal. Nodemon index dot js, bueno. Ahora enviamos esta solicitud. Ver que se está procesando. Y si abrimos nuestro terminal, C, aquí obtenemos la consola
de esa petición,
lo que demuestra que se llama a nuestra función de
middleware Entonces nuestro
pipeline actual de procesamiento de solicitudes es así. Primero, hemos expresado middleware
adyacente, luego tenemos middleware personalizado, y luego tenemos la
última función de middleware que devuelve la luego tenemos middleware personalizado,
y luego tenemos la
última función de middleware que devuelve la respuesta. Cuando no llamamos aquí
siguiente función de middleware, nuestra solicitud nos pegamos aquí en este middleware y nos
muestra el estado de procesamiento, lo que hace que toda nuestra Es por eso que siempre recordamos
en cada middleware personalizado, es
necesario llamar a siguiente función de middleware
o devolvemos Aquí llamamos siguiente función de
middleware, guardamos los cambios
y echamos un vistazo Ahora, si nuevamente enviamos
la solicitud, vea, aquí obtenemos la respuesta
y en la consola, también
obtenemos el registro de solicitudes. Así de sencillo
definir nuestra función de
middleware personalizada Sé que esta es una función de
middleware muy básica, pero en el futuro, crearemos
middleware personalizado que
comprueba que nuestro usuario está
conectado Además, cuando definimos nuestro middleware usando el método de uso de punto de
aplicación, ese middleware se
aplicará para todas las llamadas API, igual que este middleware express
42. Construido en Middleware: Express, tenemos muy pocos middlewares
construidos. Ya usamos uno
de los
middleware integrados que es
express dot Este middleware pasa nuestros datos del cuerpo de solicitud
al formato JSN Sin usar este middleware, no
podemos obtener datos en el cuerpo de Dot de
solicitud ¿Recuerdas que
no tenemos nada en pedido Dot body. Ahora, otro
middleware integrado útil es el codificado por URL. Este es el
middleware integrado similar como
express dot Express dot JSN
Middleware utilizado para pasar JSNData y presionar el middleware
codificado por
URL de punto utilizado para pasar datos codificados por URL JSNData y presionar el middleware
codificado por
URL de punto utilizado para pasar datos codificados por URL. Este
formato de datos codificados por URL se usa generalmente cuando los datos se envían a través formularios SML
simples usando
el método post En palabras simples, estos
dos middlewares se utilizan para extraer
datos de la solicitud Cuando enerQuest tiene JCNData,
luego Express usa JCN Middleware y
cuando nuestra solicitud tiene datos en formato codificado por URL,
entonces Express usa este middleware codificado por URL entonces Las funciones de middleware
simplifican el proceso de acceso a los datos de solicitud, por lo que no necesitamos
analizar manualmente de manera simple como eso Ahora veamos cómo agregar middleware codificado por
URL en
nuestra aplicación .
Es realmente simple. Agregamos aquí app.us
y dentro de esto, llamamos función codificada por
URL de punto Express Guarda los cambios y
veamos que este middleware
está funcionando o Vamos a la solicitud de correos. Anteriormente, estamos enviando
datos usando este formato JSON. Ahora aquí tenemos otra
opción que es la forma codificada. Aquí pasamos datos en par de valores
clave como tarea
y aquí agregamos nuestro texto. Esta es una nueva tarea codificada. Después de eso,
queremos pasar texto, que es array y en eso
pasamos SDML y CSS Y por fin, queremos pasar
estatus, que es hacer. Ahora simplemente
enviemos esta solicitud. Ver, aquí obtenemos nuevos datos
creados con estado 201, nuestra URL codificada está funcionando.
Pero espera un minuto. Aquí obtenemos esta extraña
sintaxis de esta matriz. En realidad, no es array. Nuestro servidor almacena esta
matriz como cadena. Ver, está codificado
en códigos dobles, lo que significa que es cadena. Por qué sucede esto.
Cuando queremos pasar array u objeto en formato codificado de
forma, tenemos que agregar
ajustes adicionales en nuestro middleware Aquí en el middleware
codificado por URL, agregue objeto con propiedad única extendida a true. Guarde esto. Y en el post request, en lugar de pasar esta
matriz en un solo campo, tenemos que pasarla
en diferentes rellenos. Al igual que nuestro nombre de matriz es tags, entonces escribimos etiquetas, y aquí agregamos corchetes, que indican que es una matriz, y luego pasamos valores
en múltiples rellenos. Primero escribimos DML. Después de eso, agregamos otro par de valores
clave, nuevamente, etiquetas, paquete cuadrado, y
escribimos otro valor CSS. Por fin, pasamos etiquetas, paquete
cuadrado y JavaScript. Ahora entiendes
por qué los desarrolladores dejan de usar este formato
codificado en forma. JSNFMat es mucho más fácil de pasar
y probar. Ver, ahora obtenemos nuestro array de texto. Además, veamos si eliminamos la propiedad
extendida
del middleware todavía está funcionando o no. Yo
sólo quiero ver. Oh, no está funcionando. Ver, aquí estamos obteniendo
textos son requeridos, lo que significa que
no estamos recibiendo textos. En versiones de nodos anteriores,
esto podría funcionar. Pero como estamos usando su
última versión de nodo, no
está funcionando, así que
es mejor que se extienda a verdad,
simple como eso. Puede que tengas dudas ¿
qué middleware deberíamos agregar en nuestro proyecto JS de
nodo Punto expreso JCN o URL
Express codificado. En el mundo moderno, el 90% de los desarrolladores utilizan JSNFMat para JSNMDDLEWare es común. Pero si no sabes
en qué formato, tu front-end
enviará datos de solicitud, JSN o codificados en forma, entonces agregar ambos middlewares
es beneficioso
43. Compartir archivos estáticos desde el servidor: Veamos otro middleware integrado
que se utiliza para enviar
archivos estáticos desde el servidor Si no conoce archivos estáticos, entonces los archivos estáticos
son simplemente activos que son
necesidades de front-end como archivos SDML, archivos
CSS, archivos JavaScript, archivos de
texto, imágenes,
patas, PDF, etcétera Se llaman estáticos
porque nuestro servidor no modifica ni procesa esos archivos antes de enviarlos
al cliente. Ejemplo, tenemos el logo de
nuestra empresa en el servidor. Enviaremos ese archivo de logotipo a nuestro front-end y el front end
se mostrará en el sitio web. Ahora se podría pensar que tenemos un archivo
estático en el servidor.
¿Cómo podemos compartirlo? No te preocupes,
es realmente sencillo. Déjame mostrarte eso.
Aquí usamos app dot ug. Ahora para compartir los
archivos estáticos desde el servidor, tenemos que usar otro
middleware integrado llamado
press dot Dentro de esta función, tenemos que pasar el nombre de la carpeta
que queremos compartir. Más comúnmente, los desarrolladores lo
llamaron público. Puedes llamarlo como
quieras, pero público es una convención
común. Podrías preguntar, no tenemos esta carpeta pública
en nuestro proyecto, así que tenemos que
crearla llamada pública. Asegúrese de escribir el mismo nombre que le
da a su carpeta, y también asegúrese de que la carpeta esté disponible en la
raíz del proyecto, no en ninguna otra carpeta. Ahora para demo agregaremos aquí
cualquier tipo de archivo o imagen. Entonces aquí tengo esta imagen. Descargo esto y
lo agrego en mi carpeta pública. Y cambiemos el nombre de este archivo como Fire Watch o como
quieras llamarlo. Bueno. Ahora, como establecemos nuestra carpeta
pública como estática, podemos acceder a todos los archivos que están disponibles
dentro de esta carpeta. Así que abre un navegador, y aquí escribimos nuestra URL base, columna host
local 3,000 slash Y después de eso, podemos escribir nuestro nombre de archivo al que
queremos acceder, firewach punto P. Si tu
extensión de archivo de imagen es PNG o JPG, entonces tienes que escribir
la misma extensión de archivo Aquí, no me sale el
archivo. ¿Qué pasa? Oh, nos olvidamos de
guardar estos cambios. Ahora de nuevo, intente
acceder a este archivo. Ver, aquí obtenemos nuestra imagen. Entonces agregaremos todos
nuestros archivos estáticos a la carpeta
pública y podremos
acceder a ellos directamente aquí. Nuestro front-end utilizará esta URL para mostrar imágenes,
peones o cualquier cosa Además, en nuestra aplicación, podemos definir una o
más de una carpeta estática. Al igual que
a algunos desarrolladores les gusta agregar la carpeta Assets, así podemos duplicar
este middleware y simplemente reemplazar el
nombre de la carpeta por Solo asegúrate de que la carpeta
esté disponible en la raíz. Ahora a muchos desarrolladores les gusta
agregar prefijo para la ruta de archivo estática. Actualmente estamos accediendo a nuestros archivos estáticos directamente
después de la columna host local 3,000. Al agregar prefijo,
se verá así. Columna host local 3,000, slash Barra estática
firewatcht web P, o columna host local 3,000 OTRs firewatch Déjame mostrarte cómo
podemos hacerlo. Para eso, simplemente agregamos nuestro prefijo antes de nuestro middleware
expreso estático ATR si los cambios si
actualizamos nuestra página, vea, no obtenemos
aquí archivo estático Tenemos que agregar Autar en la URL, y ahora obtenemos nuestros archivos estáticos Así es como podemos compartir archivos
estáticos desde el servidor. Ahora déjame hacerte
un poco de ejercicio. Agrega un archivo estático en la
carpeta llamado assets y simplemente accede a ese archivo en el navegador con perfil de prefijo. Sé que puedes hacer eso, así no
te
estoy mostrando la solución. Es realmente simple.
44. Middleware útil de terceros: Veamos algunos útiles middleware de
terceros. Los llamamos middleware de
terceros porque es creado
por terceros El primero es Morgan. Este middleware es el middleware de terceros más
popular
para registrar el SDDPRquest para Ahora cuando estaba aprendiendo nodo
tiene, tengo esta pregunta. ¿Por qué los desarrolladores quieren
registrar la solicitud SDP? ¿Qué obtendrán con el simple
registro de la solicitud SDP? Sé que tienes
la misma pregunta. Cuando registramos la
solicitud SDP usando Morgan, podemos seguir rastreando qué
API está llamando más tiempo Qué API está tardando
más en responder, cuántas llamadas a la API se llenan, depura la API débil y muchos más beneficios. Por lo general,
al registrar la solicitud SDP, los desarrolladores pueden monitorear, depurar
y mejorar sus API Ahora veamos cómo podemos registrar la solicitud SDP usando Morgan Aquí hay un paquete Morgan. C, tiene 4 millones de
descargas mensuales, lo cual es una locura. Y como sabemos, utilizamos este comando para
instalar el paquete Morgan. Así que simplemente copie esto y detenga nuestra aplicación
con Control plus C y péguela en nuestro terminal. Bueno. Ahora
volvamos a ejecutar nuestra aplicación. Ahora, en nuestra aplicación,
creamos este middleware de
registro personalizado No lo necesitamos, así
podemos comentar este código. Ahora para usar Morgan, primero, tenemos que importarlo
en nuestra aplicación. Entonces en la cima, Morgan consed
iguala a exigir a Morgan. Y en la parte inferior,
agregamos app dot U, y dentro de esto, llamamos a
esta función Morgan. Dentro de esta función Morgan, podemos pasar
formato predefinido de solicitud de registro. Por ejemplo, tenemos Dev para desarrollo combinado
para más detalles, comunes, diminutos, etcétera Si quieres ver
todos los detalles, entonces puedes consultar
esta página del paquete. Aquí, obtienes toda la
información sobre formatos. Ahora, en nuestro código, simplemente
agregamos aquí códigos dobles. Ver, aquí recibimos sugerencias. Combinado, común Dov corto, diminuto por ahora, vamos por Dev Guarda los cambios
y echa un vistazo Ahora golpea cualquier API en el terminal. C, aquí obtenemos los detalles de la
solicitud. Primero, obtenemos el método SDDP, luego el punto final, luego el estado, tiempo de
respuesta y el
tamaño de la respuesta Con estos datos, podemos
mejorar nuestras APIs. Si volvemos a enviar la solicitud, vea, obtenemos nuevo registro. Entonces así es como Morgan nos
ayudará. Ahora el próximo
middleware de terceros es el casco. Es otro middleware popular, y todos sabemos lo que
hace el casco en nuestra vida habitual Protege nuestra cabeza
de accidentes, y eso es lo que también hace el
middleware de casco Es una excelente
opción para mejorar la seguridad de nuestra app
con una configuración mínima. Y también, es de uso común
en ambiente de producción. Muchas aplicaciones de nodo
utilizan este middleware. Entonces buscamos aquí casco. Aquí conseguimos este paquete. Vamos a instalar este paquete. Abrir terminal, detener
la aplicación, pegar el comando aquí. Y si quieres instalar la
misma versión que estoy usando, entonces puedes agregar aquí versión
también y presionar Enter. Capucha. Volvamos a ejecutar nuestra
aplicación. Ahora para usar este paquete, primero, lo importamos en la parte superior. Entonces casco Const, equivale a
dos requieren casco. Y en la parte inferior, antes de
nuestro otro middleware, agregamos app dot g y simplemente llamamos aquí casco
Middleware. Y eso es todo. Esto agregará automáticamente encabezados
seguros que
asegurarán nuestra aplicación Express. También, quiero aclarar una cosa. Cuando agregamos middleware
en nuestra aplicación, Express los agrega en el mismo orden que
agregamos en nuestro código Por ejemplo, actualmente Express, agregue middleware de casco primero en la canalización de
procesamiento de solicitudes, luego JSON, luego codificado URA, luego estático y luego Morgan El orden también es
importante para el middleware.
45. Cómo codificar según el entorno: Ahora veamos cómo podemos codificar según nuestro entorno de
aplicación. Por ejemplo, actualmente
nuestra aplicación está en proceso de desarrollo, y cuando implementemos
nuestra aplicación, será en el entorno de
producción. Ahora, cuando nuestra aplicación
está en etapa de desarrollo, sólo entonces queremos habilitar el middleware
Morgan
para nuestra Entonces, antes que nada, necesitamos
conocer el entorno actual. Y sí, sabemos que de la
misma manera tratamos de conocer puerto. Entonces simplemente podemos consultar el proceso de registro de
puntos ENV, y aquí accedemos al
dólar Cully Brackets, progreso punto env punto
nodo subrayado ENV Este nodo subrayado ENV
es el nombre de la variable, igual que este puerto Veamos qué tenemos aquí. Guarda los cambios, y aquí
nos ponemos indefinidos. ¿Por qué? Porque inicialmente nuestro entorno no
es desarrollo STS. Ahora, en Express, tenemos otra forma de conocer el entorno
actual, que es mediante el uso de la app dot gat. Y dentro de este intestino, tenemos que
pasar ENV por medio ambiente. Esta app dot gt ENV
devolverá el
mismo resultado que este proceso dot nw dot
node underscore environment Pero cuando no configuramos entorno de subrayado de
nodo, en ese momento, esta app dot gt ENV devolverá por
defecto el desarrollo,
lo cual es genial, lo cual es genial, Déjame mostrarte. Así
consola dot log app ENV Dólar corchetes,
app dot Obtener ENV. Guarda a los Gengs y mira, aquí tenemos desarrollo Pero aún así, nuestro proceso
punto ENV no está definido. Ahora solo queremos agregar este middleware Morgan si estamos en el entorno de
desarrollo Entonces podemos codificar así. Aquí agregamos I condición, app dot Obtener ENV También puedes usar process dot NV, pero luego tienes que cambiar la
condición de acuerdo a eso. Ahora equivale al desarrollo. Es cierto, sólo entonces
agregamos este middleware. Los movemos dentro de
este blog If. Ahora para indicar, agregamos aquí otro
registro de puntos de consola, agregó Morgan. Bueno. Guarde los genes, y en la terminal, vea, aquí conseguimos que Morgan agregó. Ahora cambiemos
nuestro entorno a
producción para ver que Morgan
está sumando o no. En primer lugar, dejamos de ejecutar nuestra
aplicación. Para establecer la variable de
entorno, escribimos, dólar ENV,
columna, nodo, subrayado ENV es igual a en
códigos, pasamos producción Si eres usuario de Mac o Linux, entonces tienes que
escribir aquí export,
space, node, underscore ENV
es igual a producción Asegúrese de escribir el nombre
y el valor correctos de la
variable de entorno . Golpea Enter. Ahora
volvamos a ejecutar nuestra aplicación nodemon index dot js. Mira, aquí no
conseguimos que se agregue Morgan. Así es como cambiamos nuestro entorno de
aplicación y código de acuerdo a eso. Volvamos a cambiar el
ambiente al desarrollo. Entonces dólar ENV, nodo colon, subrayado EN V es
igual al desarrollo O para Mac o Linux, export, node, underscore ENV
es igual al desarrollo Y si volvemos a revisar nuestra
aplicación, mira, aquí obtenemos Morgan agregado.
46. archivo env y paquete dotenv: Hasta ahora estamos configurando variables de
entorno usando ENV
dólar o
comando export en la terminal Pero hay otra forma
sencilla de definir esas variables
usando el archivo ENV punto En este archivo NV, simplemente
podemos agregar nuestras todas las variables de
entorno como port is equal to 3,000 or node underscore
ENV to development O también podemos definir aquí
la URL de nuestra base de datos. Y muchos desarrolladores utilizan
este enfoque para definir variables en lugar de
definirlas en la terminal. Este archivo ENV mantiene a
nuestras aplicaciones información
confidencial como
credenciales fuera de nuestro código, lo cual es una buena práctica de
seguridad Ahora bien, este archivo ENV es
un archivo de texto simple. Podemos cargar su variable
en nuestra aplicación de nodo, para que podamos usarlas y
codificarlas de acuerdo a eso. Para utilizar estas
variables de entorno en la aplicación de nodo, tenemos paquete llamado punto ENV No te preocupes por
una sola línea de código, podemos usar estas variables de
entorno. Vamos a instalar este paquete. NPM instalar punto ENV. Bueno. Ahora bien, en nuestro índice
punto sile en la parte superior, solo
tenemos que agregar una
línea requieren punto NV, y luego aquí llamamos método
punto config, y eso es todo No necesitamos hacer
otra cosa. Y también,
lo bueno de este enfoque
es que podemos acceder a ellos mismo usando process dot nw dot PorD y process dot nw
dot node underscore Vamos a ejecutar esta aplicación. Bueno. Ver, actualmente estamos en el
entorno de desarrollo, y es por eso que
conseguimos que Morgan se agregue. Ahora, para mostrarles,
cambio el puerto a 8 mil. No utilices el puerto 5,000 en MAG porque ya está
funcionando en tu sistema, y cambiamos ENV a producción Guarda esto, y ahora tenemos que reiniciar
manualmente nuestra
aplicación porque Norman solo reinicia
nuestra aplicación cuando los archivos con estas
extensiones cambiarán. Verás, nuestro puerto se cambia a
8,000, pero ¿qué es esto? Nuestra ENV es la misma que
antes, que es desarrollo. Pero en el archivo ENV, lo
colocamos a la
producción. ¿Puedes adivinar? Es porque en
la última lección, codificamos nuestro
nodo subrayando valor ENV usando
ENV dólar o palabra clave de
exportación Entonces nuestra aplicación,
recuerda esos ajustes. Así que siempre recordemos
cuando tenemos el archivo punto ENV y también establecemos nuestra variable de entorno
usando terminal, nuestra aplicación de nodo le da más prioridad al valor
del terminal Para resolver este problema, simplemente
podemos eliminar ese valor de
subrayado de nodo ENV Así que escribe, quítala, ruta, ENV, colon,
nodo, subrayado O si eres usuario de Mac o Linux, entonces escribe unset, space,
node, underscore
ENV y presiona Enter Ahora reinicia la aplicación. Ver, aquí tenemos la producción. Y si en el archivo ENV, cambiamos ENV a desarrollo,
guardamos los cambios, reiniciamos nuestra
aplicación usando nod Ver, aquí obtenemos el desarrollo porque
obtenemos Morgan agregado.
47. Diferentes configuraciones para diferentes ENV: Actualmente estamos cambiando
manualmente nuestras variables de entorno
porque son solo dos. Pero en el mundo real, podríamos tener más de dos variables de
entorno. Al igual que tenemos diferentes URL de
base de datos en el desarrollo y diferentes
URL en la producción. Del mismo modo, podríamos tener clave
secreta para la
autenticación, etcétera Ahora cuando tenemos estas muchas variables de
entorno, es difícil cambiar
las variables manualmente. Ahora bien, ¿cómo podemos resolver esto? Para resolver este problema,
podemos crear dos archivos ENV separados
dot nw dot development
y dot nw dot Production Incluso puedes crear
punto nw dot Testing. En estos dos archivos,
definiremos nuestras diferentes variables de
entorno. Después de eso, en nuestro index dot js, podemos simplemente poner condición si nuestro entorno de nodo
es desarrollo, entonces cargamos el archivo de desarrollo
punto nw punto. Y si nuestro ambiente
es degustación, entonces cargamos este archivo dot
NV dot tasting. Tan simple como eso. Déjame
mostrarte esto prácticamente. Aquí creamos un nuevo archivo
llamado dot nw dot Development. Este archivo, definimos diversas variables de
entorno. El primero es puerto
es igual a 3,000. K es igual a hacer
subrayados secretos. También podemos agregar el subrayado de
nodo ENV es igual al desarrollo,
y eso es todo. Ahora vamos a crear un archivo más llamado dot nw dot production. Y dentro de esto, agregamos Pd
es igual a 8,000 K es igual a pro qi y al último nodo y un cuadrado E y
V es igual a producción. Guarde esto, y ahora
en el punto índice s, solo
necesitamos agregar condición. Entonces en la parte superior, aquí, primero
creamos una variable
llamada archivo ENV igual a, y aquí para usar operadores
ternarios, pasamos condición si proceso punto nw punto
nodo subrayado NV es igual Si es cierto, entonces nuestro archivo ENV debería puntear nv dot production Establecimos el archivo de
desarrollo punto nw punto como nuestro archivo de entorno. Ahora, simplemente en este método
config, tenemos que pasar el objeto con la ruta de
propiedad al archivo ENV Estado muy sencillo. Y aquí para mostrar
otra variable NV, aquí usamos consol dot log, process dot nw dot Comprobemos que está
funcionando o no. Actualmente, estamos
consiguiendo que Morgan se agregue. Ahora detengamos nuestra aplicación. Dólar ENV, colon, nodo, guión bajo ENV es igual
a Si eres usuario de Mac o Linux, entonces tienes que usar export, node, underscore, EN V
es igual a producción Ahora comencemos nuestra aplicación. Ver, aquí estamos en el entorno de producción
porque Morgan no se agrega, y aquí obtenemos Pro key
y nuestro puerto también se cambia a 8,000 para que al
usar diferentes archivos ENV, podamos definir diferentes variables de
entorno
48. Motores de plantillas en la aplicación de nodos: Veamos el
motor de plantillas en nodo. Este tema es un poco viejo y no se usa comúnmente en
el mundo moderno. Entonces, vamos a entender
qué es el motor de plantillas. Básicamente, el
motor de plantillas es una herramienta que nos permite crear páginas SDML
dinámicas Entonces, en lugar de
escribir STML manualmente para cada página, podemos crear una plantilla, y mediante el uso del motor, podemos insertar
datos automáticamente en esa plantilla Después envíe el
archivo SGML generado al navegador del cliente. Supongamos que queremos crear un sitio web de blog de estilo antiguo donde todos los blogs tengan
el mismo diseño, pero solo su
contenido sea diferente. Ahora no queremos
crear manualmente un archivo SGML para
cada entrada de blog Eso sería
lento e ineficiente. En su lugar, podemos usar
un motor de plantillas para crear una sola plantilla
para nuestro diseño de blog, y el motor de plantillas
mostrará dinámicamente el contenido del blog en función los datos que proporcionamos de manera
simple como eso. Hay muchos
motores de plantilla en ningún Jaz, pero el más popular es PUG
y otro es Esto funciona igual. Sólo su sintaxis es diferente. Déjame mostrarte sobre PUG. Entonces en nuestro terminal, escribimos NPM install PUGor si te
gusta instalar mismo verson, luego escribimos en el rojo
tres punto cero punto tres Bueno. Ahora en nuestro archivo JS de punto
índice, tenemos que configurar el motor de vista, que es el
motor de plantillas a PUG Así que escribimos aquí app dot set. Aquí, queremos configurar el motor, por lo que escribimos motor de vista. Y en el segundo parámetro, simplemente
pasamos PUG. Así que en esta línea nos fijamos PRG como
nuestro motor de vista o plantilla. Ahora tenemos que crear una
plantilla nuestra página SDML en POG. Entonces en nuestra aplicación,
creamos una carpeta llamada views. Asegúrate de escribir el
mismo nombre que las vistas. Y dentro de estos, podemos crear un archivo llamado template dot POG Puedes tomar cualquier nombre de archivo. Realmente no importa. Aquí, tenemos que escribir
código en sintaxis Perg, que es muy
similar a nuestro SDML Aquí empezamos con HTML. Observe que aquí no estoy usando corchetes
angulares para etiquetas. Dentro del SDML, podemos tener cabeza, así que la
escribimos como esta estructura de árbol Dentro de la cabeza,
podemos agregar título aquí queremos obtener valor
de título dinámicamente. Escribimos nuestro nombre de etiqueta es igual, y aquí escribimos
nuestro nombre de variable que pasamos en el tiempo de ejecución. Título. No te preocupes, te
voy a mostrar todo. Ahora, después de la cabeza,
sabemos que podemos agregar body tag, así nos movemos en la misma
línea paralela que head y addre body En PRG, no tenemos que
cerrar la etiqueta. Ahora en el cuerpo, podemos agregar H
una etiqueta igual a
encabezado y después de eso, agregamos el párrafo
igual al contenido Plantilla sencilla para blog. Se puede ver que esta es una
sintaxis muy limpia que la SDML normal. muchos desarrolladores les gusta, pero a muchos no les gusta. Guarde este archivo y
veamos cómo podemos renderizar página
SDML y pasar estas
variables dinámicamente Anteriormente, definimos una API para ruta raíz
simple en la que simplemente devolvemos respuesta punto Enviar. Este es un proyecto de seguimiento de tareas. Ahora en el lugar del texto simple, rendericemos nuestra plantilla Perg Aquí en el lugar de
respuesta punto Enviar, escribimos respuesta punto Render. Y esta función
toma dos argumentos. primero es el nombre del archivo
o plantilla que queremos renderizar. En este caso, es template, y el segundo argumento
es el objeto con las variables y su valor que definimos
en esa plantilla. Entonces, antes que nada, título para, digamos, blog uno. Después de eso, tenemos rumbo
al motor de plantillas, y contenido para facilitar pug
muy bueno, no lo sé Guarda los cambios,
y en el navegador, vamos al
host local Columna 3,000. Error de conexión podría
olvidarnos de iniciar el nodo de
aplicación
un punto de índice js. Oh, actualmente se encuentra en el ambiente
de producción. Pongámoslo en ambiente de
desarrollo. Así que ENV dólar puede nodo subrayado ENV es igual
a O si eres usuario de Mac o Linux, entonces puedes usar export, node underscore ENV es
igual al desarrollo Asegúrate de no
pasar aquí los códigos, y luego iniciamos
la aplicación. Ver, está escuchando en 3,000
y si actualizamos nuestra página, vea, aquí obtenemos
la plantilla Perg El título es el blog uno. Encabezado y contenido
también es lo mismo que pasamos. Así es como podemos
renderizar un archivo SDML en el servidor y luego
enviarlo al navegador del cliente No creo que
las empresas modernas estén utilizando esta manera porque la mayoría de
las empresas utilizan Rag, angular o view para front end
49. Limpieza de la estructura de aplicación de código: Actualmente, si vemos
nuestro archivo JS de punto índice, se siente que realmente
arruinamos nuestro código Todo se ve muy desordenado
y no se puede conservar. Así que vamos a estructurar
nuestra aplicación de nodo, que se utiliza en el mundo real. Entonces, actualmente, agregamos todas las API
relacionadas para hacer en el archivo JS de punto de índice
único. Imagínese en otra aplicación de
comercio electrónico, tenemos otro conjunto
de API para usuarios. Tenemos otro conjunto de APIs
para funciones relacionadas con tarjetas. En ese momento, no podemos agregar todas esas API en el
mismo archivo js de punto índice. La solución es que podemos crear una carpeta separada llamada routes, y en eso, agregaremos
archivos para cada conjunto de APIs. Creamos una nueva
carpeta llamada rutas. Esta es una práctica común
para la estructura de aplicaciones. Ahora aquí, creamos un nuevo
archivo llamado todos dot js, en el que definiremos todas las rutas
API relacionadas con todos. En primer lugar, cortemos todas las rutas del archivo JS del punto
índice. Y pégalo en el
archivo todos dot js. Ahora podrías preguntar en el archivo js
index dot en la parte superior, tenemos instancia de app
y usando eso, definimos diferentes rutas API. Pero aquí, en el
archivo JS todos dot, no
tenemos esa instancia de app. Entonces, ¿cómo podemos
definir rutas aquí? Se podría decir que podemos
recrear la instancia de la app, pero eso no es posible.
No va a funcionar. Así que en el express, tenemos otra instancia llamada
router mediante la cual podemos definir API y
puntos al igual que
somos APIs usando instancia de app. Aquí, primero ingresamos express const Express es igual
a requerir Express Ahora en este expreso, tenemos otro
método llamado Router, que devolverá
la instancia del router, y por eso la almacenamos
en variable llamada router. Ahora, simplemente reemplacemos esta instancia de aplicación por
esta instancia de enrutador. Así que selecciona esta app y presiona Control plus D
o Command plus D, que seleccionará
todas las instancias de app y la reemplazará con router. Bueno. Ahora hemos definido nuestras rutas en
el archivo diferente. Pero cómo sabrá nuestro archivo index dot
js, estas rutas las queremos
agregar en nuestra aplicación. Para ello, tenemos que exportar
esta instancia de router desde este archivo y la agregamos en el
archivo index dot js. Tan simple como eso. Entonces, ¿recuerdas cómo podemos exportar variables
desde el archivo nodo? Derecha, utilizamos el módulo dot
export es igual al router. Guarde este archivo, y en
el archivo index dot js, eliminemos estos bloques. No los necesitamos,
y agregamos aquí app dot g para agregar esas
rutas en nuestra aplicación. Aquí en la primera posición, agregamos el prefijo del router, igual que este archivo estático. La mayoría de las veces, a los desarrolladores
les gusta agregar aquí la API de slash. Después de eso, en el
segundo argumento, pasamos nuestra instancia
de enrutador desde el archivo todos dot js. Entonces en la parte superior,
importamos ese router
usando la función require. Y aquí pasamos nuestra ruta de archivo, que es slash out todos. Ahora, como sabemos, esta función
require devolverá la instancia del router, así podremos almacenarla en la
variable llamada todas las rutas. Y en la parte inferior, aquí, pasamos rutas Tudous. Y hecho. Además, encontré que necesitamos esta matriz Tudous
en el archivo Tudos Entonces lo cortamos de aquí y lo
pegamos en nuestro archivo Tudous. Guarde los cambios,
y comprobemos que nuestra aplicación está
funcionando bien o no. Recuerde, para que todos hagan rutas, necesitamos agregar el prefijo API antes de los endpoints.
Enviar la solicitud. Verás, está funcionando. Ahora, un último cambio que quiero
hacer es en nuestro TudsRoute, podemos ver que estamos agregando Tudos antes de cada Así que comúnmente podemos
pasar ese slash todos en el prefijo en el archivo
index dogs Guarde estos. Ahora en
el archivo todos dot js, podemos eliminar slash
todos del endpoint Además, eliminamos todos
para todos los endpoints de API. Guarda esto y estamos bien para irnos. También podemos eliminar
estas líneas no deseadas. No los necesitamos. Ver, ahora nuestro archivo index dot js se ve limpio y
más mantenible Seguiremos esta estructura de
aplicación durante el resto de nuestro curso. Entonces aquí se acabó nuestra Sección
cinco. Rápidamente podrás ver el
resumen PDF y recapitular toda
la sección en dos a 3 minutos y te
veré en la siguiente sección
50. Sección 06: asíncrona vs. síncrona: Bienvenido a la sección seis
del curso ultimate not JS. Esta es la
sección represora para algunos temas de AdvanceVascript como sincrónico
versus asíncrono, función de devolución de
llamada, promesas de infierno de devolución de llamada y espera algunos temas de AdvanceVascript
como sincrónico
versus asíncrono, función de devolución de
llamada, promesas de infierno de devolución de llamada y espera asíncrona. Muchos desarrolladores están
confundidos en estos temas, así que es mejor que lo entendamos. Entonces, si
ya estás confundido en estos temas y
quieres dominar el nodo js, entonces en próximas secciones, te enfrentarás a muchos problemas. Es mejor
aprender estos temas, que podemos llamar como JavaScript
asincrónico antes de sumergirnos realmente
en las aplicaciones de nodo En todas las aplicaciones de nodo, utilizamos mucho estos temas. Aprendamos estos temas. Son simples y fáciles de aprender. Además, si ya tienes
confianza en estos temas, entonces puedes saltarte esta sección. Depende totalmente de ti. Ahora antes de comenzar a aprender conceptos de
JavaScript asíncrono, entendamos la diferencia entre asíncrono y sincrónico Nos ayudará a
entender mejor. ¿Qué es sincrónico?
Programación sincrónica significa que nuestro código se ejecuta línea por línea. Cada línea debe ser completada antes de
pasar a la siguiente línea. En palabras simples, la programación
sincrónica es como seguir una
receta paso a paso. Cada paso debe
completarse antes
de pasar al siguiente. Si un paso lleva mucho tiempo, tenemos que esperar hasta que
termine la ejecución, y luego podemos continuar. Por ejemplo, estamos preparando
un pastel para la fiesta de cumpleaños. Ahora hay
proceso paso a paso para digamos, primero mezclamos los ingredientes, luego lo ponemos en
horno para hornear, y finalmente,
decoramos el pastel. Aquí, tenemos que seguir
los pasos línea por línea. No podemos comenzar directamente a decorar el pastel
sin hornear. Tenemos que ir en el paso uno, paso dos y el paso tres. Ese es el ejemplo sincrónico. El código sincrónico también se
llama código de bloqueo. Déjame mostrarte el comportamiento de
bloqueo o ejemplo de código de
bloqueo
en JavaScript. Entonces, para practicar estos temas, creamos una nueva carpeta en
la carpeta projects llamada JavaScript
asincrónico y abrimos esta carpeta en el código VS Ahora dentro de esta carpeta, creamos un simple
archivo JavaScript llamado index dot js. Bueno. Ahora aquí escribimos
tres líneas de consola. Así consola dot log. Paso uno, empieza. Otra consola dot log. Paso dos, y último,
consol dot log. Paso tres, y
vamos a ejecutar este código. Entonces en terminal,
escribimos nodo, perros índice. Verás, estamos obteniendo la
salida línea por línea. Primero, obtenemos el paso uno, luego el paso dos, y
luego el paso tres. Ahora se podría decir, no podemos ver el comportamiento
de bloqueo de este código. ¿Cómo podemos verlo prácticamente? Actualmente, estamos obteniendo
esta salida sin bloqueo debido a que ni una sola línea
tarda más tiempo en ejecutarse, cada línea se ejecuta inmediatamente. Agreguemos pequeño
bloque en este código. Aquí, después de Consola uno, creamos una función
llamada fetch data En esta función, vamos a pretender que estamos recuperando
datos de la base de Como podríamos saber, la obtención de
datos de la base de datos puede llevar tiempo como de dos a 3
segundos o más que eso Por ahora, solo agregamos algo de
retraso usando cuatro bucles vacíos, lo que puede tardar algún
tiempo en ejecutarse. Aquí, que yo es igual a cero, yo menos de uno y nueve
veces cero y yo más más. Simplemente, no queremos hacer
nada en este bucle de otoño, así que abre cierra las llaves. Ahora bien, esta línea puede tardar uno o 2 segundos en
ejecutarse y después de eso, movemos nuestra consola paso dos arriba y aquí mismo, los datos recuperados Aquí antes de nuestro paso tres, llamamos a esta función de datos fah ¿Puedes adivinar lo que
obtenemos en la salida? A ver. Guarde los cambios y ejecutemos este archivo. Ver, después del paso uno, nuestro código se detiene un poco para que nuestra
función se ejecute. Después de eso, obtenemos datos
y luego el paso tres. Aquí, por un poco, podemos ver el comportamiento
de bloqueo de nuestro código JavaScript, que se llama código JavaScript
síncrono. Ahora podrías adivinar
lo que es asincrónico. En asincrónico también, nuestro
código corre línea por línea. Pero para seguir adelante, no
necesitamos esperar
para terminar esa tarea. Podemos iniciar una tarea, y
si lleva más tiempo, entonces podemos pasar
a la siguiente línea. En palabras simples, la programación
asincrónica es como hacer múltiples cosas a vez y no
esperar a que cada línea termine de ejecutarse antes de
comenzar la siguiente Puedes iniciar una tarea, y mientras esperas a que se complete, puedes hacer otra cosa. Por ejemplo, estás preparando un barril y también
viendo este curso Entonces pones el pastel
en el horno para hornear, pero este horneado puede tardar de
diez a 15 minutos de tiempo. Entonces en ese momento, puedes hacer otras cosas en lugar de solo
esperar a que el pastel se hornee. Entonces empiezas a ver
este curso. Y si te gusta este curso, entonces en ese momento, puedes compartir este curso
con tus amigos. Del mismo modo, si definimos nuestro código de suma usando JavaScript
asíncrono, si esa línea tarda
más tiempo en ejecutarse, entonces nuestro código JavaScript no
esperará ahí Correrá hacia adelante
en el código y cuando esa línea termine
su ejecución, entonces ejecutará esa línea. Podemos hacer múltiples cosas
en JavaScript asincrónico sin solo esperar una
línea para terminar su tarea. Esta es la
diferencia fundamental entre JavaScript síncrono y
asíncrono. Por defecto, nuestro
código JavaScript es sincrónico, pero Javascript proporciona algunos
métodos mediante los cuales podemos hacer que nuestro código sea asincrónico para realizar
tipos específicos de trabajo También, como sabemos, nodo es popular porque puede
aplicar naturaleza asincrónica Ahora déjame mostrarte cómo
podemos convertir nuestro código sincrónico o bloqueo en código asincrónico
o no bloqueante Aquí en el lugar de este bucle de cuatro que está
manteniendo nuestro código ocupado, podemos agregar otro método
para agregar delay. Agregamos tiempo de espera establecido. Este método toma dos argumentos. La primera es la función y la
segunda es un tiempo de retardo. Por ejemplo, pasamos aquí
10,000 milisegundos, que son 10 segundos. Ahora en primer lugar, simplemente
pasamos función
y dentro de ella, movemos este paso a la consola de
datos recuperados Después de 10 segundos, esta función
consolará data fest. Ahora bien, ¿puedes adivinar la salida
de este código? A ver. Ver, primero obtenemos el paso uno. Después de eso, en segundo plano
o función se está ejecutando, pero eso no detuvo
nuestro código ahí. Nuestro código
continúa ejecutando el paso tres, y cuando esos 10
segundos terminen, obtenemos los datos del paso dos pies. Entonces este es el código no bloqueante
o asíncrono. Código síncrono,
espere a que una línea complete la ejecución y código
asíncrono, espere esa línea en segundo plano y
continúe trabajando hacia adelante Podrías preguntar, cuál es el mejor sincrónico
o asincrónico En mi opinión, ambos son útiles. Nadie es mejor. Ambos tienen un propósito
diferente. Sincrónico es genial cuando
necesitamos tarea para ejecutar en un orden específico o cuando la tarea es rápida
y sin bloqueo. Proporciona simplicidad
y previsibilidad. Nosotros asíncronos es importante
para tareas que llevan tiempo, como manejo de archivos, acceso a
bases o solicitud de red,
donde no
queremos bloquear el
hilo principal de nuestro servidor En la aplicación de nodo,
usaremos JavaScript asíncrono queremos realizar operaciones sin bloqueo como
realizar consultas de base de datos, llamadas
API, leer y escribir archivos sin
congelar el hilo principal Lo principal es que nuestra aplicación debe funcionar de manera no
bloqueante, lo que brindará a nuestros usuarios una experiencia
rápida y excelente. Entonces como sabemos, por defecto, nuestro código JavaScript
es sincrónico. Pero JavaScript proporciona algunos
métodos mediante los cuales podemos hacer que nuestro código sea asincrónico para hacer
tipos específicos de El primero es mediante el uso de la función de
devolución de llamada. Otro método es
usar promesas. En esta sección, aprenderemos profundamente sobre estos métodos.
51. Devoluciones de llamada en Javascript: Ahora vamos a entender
callback en JavaScript. Entonces, ¿qué es la función de devolución de llamada? Una función de devolución de llamada es una función que se
pasa como argumento a otra función y se ejecuta después de completar una
tarea específica Déjame explicarte la devolución de llamada
usando escenario del mundo real. Supongamos que está ordenando sándwich en la
tienda de sándwiches con su teléfono, así llama a Sandwich
Shop y da su pedido. Te dicen que tardará 20 minutos en
prepararse y entregar. Entonces colgaste la llamada y haces otras cosas en lugar de solo
esperar el sándwich. Ahora, cuando el sándwich se prepara, el repartidor toca
tu timbre y
te da ese sándwich simple Entonces en este caso, llamas a
la tienda de sándwiches y dar tu pedido es como iniciar
una tarea asincrónica Después de eso, te dicen
que tardará 20 minutos. Este es el retraso en
la tarea asíncrona. Entonces colgaste y haces otras cosas en lugar de solo
esperar el sándwich. Este es el comportamiento de no
bloqueo, lo que significa que nuestro código
sigue avanzando. Cuando Sandwich se prepara, lo que significa que nuestra
tarea asincrónica está terminada, el repartidor toca
tu timbre y
te da ese Esta es la
función de devolución de llamada que se ejecuta cuando se completa la
tarea asíncrona Entonces una función de devolución de llamada se pasa como argumento a
otra función, y también se ejecuta después de completar una
tarea específica En palabras simples,
lo que queramos
hacer después de que se complete la
tarea asincrónica, eso pasaremos en
la función callback Ahora bien, si estás trabajando o aprendiendo Javascript
desde hace mucho tiempo, entonces apuesta conmigo, ya
usaste la función de devolución de llamada
en tu código Simplemente no
sabes que la función se llama ColWCFunction Por ejemplo, ¿recuerdas en la función de tiempo de espera establecido
en la primera posición, pasamos la función que
se ejecutó después de algún retraso Y tienes razón,
esta función que
pasamos como argumento se
llama función callback Igual que pasamos devolución de llamada en la función
de intervalo establecido Déjame darte otro ejemplo. Yo casi todos los métodos de matriz, pasamos funciones de devolución Al igual que en el método de forraje, mapa, método de filtro En todos estos métodos, pasamos la función de devolución Además, en nuestro proyecto anterior, pasamos la función de devolución de llamada en la app dot get app dot post, app dot pot, delete, y en todos los métodos Recuerde, esos también se
llaman como funciones de devolución de llamada. Ahora para la comprensión básica, vamos a crear una
función y pasarla como función de devolución de llamada
porque en nodo, necesitamos pasar mucho la
función de devolución de Así que vamos a eliminar este código. Si quieres ver
el código anterior al final de esta lección, obtendrás la carpeta
Recursos Zip. Descárgalo y descomprímalo. En la carpeta de recursos, obtendrás enlaces de Gita para
todos los códigos sección por sección Para que puedas obtener
referencia a partir de eso. Entonces, antes que nada,
escribimos consola dot log. Inicio. Ahora creamos
aquí la función llamada fetch student en la que vamos a pretender que estamos recuperando
datos de la base de datos Entonces, para simular el retraso
para la obtención de datos, agregamos aquí de nuevo,
establecemos la función de tiempo de espera. Y en la primera posición,
¿qué pasamos? Correcto, no solo función, pasamos la función de devolución Así que estamos pasando aquí función usando la sintaxis de la
función de flecha. La función de flecha es otra
forma de definir la función, y es mucho más limpia
para las funciones de devolución Ahora en el segundo argumento, pasamos milisegundos,
digamos 3 mil Y aquí en el tiempo de espera establecido, consultamos registro de puntos obteniendo estudiantes de la base de datos Ahora llamemos a esta función
fetch student aquí después de la línea de la consola Para hacerlo más realista, también
pasamos aquí la identificación de estudiante, que es la identificación
del estudiante que queremos
obtener. Digamos uno. Ahora cuando completemos
la búsqueda de datos, después de 3 segundos, queremos
devolver los datos de ese estudiante Por lo que devolvemos
objeto estudiante con identificación. Aquí obtenemos ID como parámetro y simplemente
pasamos ese mismo ID aquí. También nuestro alumno
tiene nombre a Harley, y digamos que queremos su número de
inscripción, supongamos 500. Estamos fingiendo que estamos obteniendo este objeto estudiantil
de la base de datos Ahora cuando llamamos a esta función, aquí obtenemos los datos del alumno, así que simplemente podemos almacenarlos en
la variable llamada student. Para verificar, simplemente
const dot log, estudiante y pasar
aquí este alumno Al final, simplemente
consul dot log, y ahora, ¿puedes adivinar qué
vamos a obtener en la salida ¿Obtendremos los datos del
alumno o no? A ver. Nodo índice punto js. Mira, aquí obtenemos inicio,
estudiante indefinido, y luego estamos obteniendo datos de la base de datos.
Déjame explicarte por qué. Cuando llamamos a esta función
bien stud con ID uno, en primer lugar, se ejecuta
el tiempo de espera establecido, que ejecutará esta pieza
de código después de 3 segundos. Ahora, en su momento,
no obtenemos nada
de la función. Por eso se situó valor
indefinido en
la variable estudiante. Nuestro código JavaScript
siguió ejecutándose. Es por esto que conseguimos que el estudiante desdefina entonces y
luego después de 3 segundos, la función de tiempo de espera establecido consolará esta línea de datos de
obtención Ahora la cosa es, ¿cómo podemos ejecutar este código y obtener
los datos de los estudiantes? ¿Cuál es la solución aquí? Para resolver esto, usamos función de
devolución de llamada y
lo haremos en la siguiente lección
52. Resolución de problemas mediante Callback: Entonces en la lección anterior, obtenemos el error estudiante
indefinido. Ahora, vamos a resolver este problema
usando la función de devolución de llamada. En primer lugar, no necesitamos
almacenar el resultado en
la variable estudiante. Ahora, para resolver este tema, vamos a hacer poco cambio en
la función estudiantil de la Fed. Entonces después del ID, pasamos su
función de devolución de llamada como parámetro Y en el lugar de retorno el objeto alumno
de la función, llamaremos a esta
función o devolveremos la llamada a esta función y simplemente
pasaremos objeto estudiante en ella. Sé que es un
poco confuso. Mira esta lección y
entenderás muy bien las
devoluciones Ahora, como estamos accediendo a la función
callback como parámetro, tenemos que pasar esa función como segundo argumento cuando
estamos llamando a la función fair
student Entonces aquí pasamos función, y dentro de esta función, podemos simplemente mover
esta consola estudiante. Ahora de donde sacamos
este objeto estudiantil. Correcto, aquí obtenemos
el objeto student en parámetro porque
cuando estamos llamando a esta función callback en
la función fast student, estamos pasando objeto
student aquí, y ese objeto student, accedemos directamente aquí en
este parámetro callback Veamos que esto está
funcionando o no. Así nodo índice punto Js. Verás, primero empezamos
y luego después de 3 segundos, obtenemos la obtención de datos de
la base de datos y luego
usando la función de devolución de llamada
imprimimos este objeto estudiante, y eso es exactamente lo que queremos Aquí está nuestro código anterior
y actual. En el lugar de devolver los datos de la función fat
student, llamamos a otra función para registro de puntos de
consola,
los datos del estudiante. Esta línea de consola solo se ejecutará cuando esta
función de devolución de llamada llame Mediante esta técnica de
función de devolución de llamada, hacemos que nuestro código sea asíncrono
o Ahora para dejar esto claro en
el lugar de esta función, utilizamos la sintaxis de la función de flecha. Eliminamos la
palabra clave function y entre los paréntesis y los
corchetes GLY, agregamos flecha Verás, ahora nuestro código
se ve simple y esta manera es muy útil en
nodo porque como notas, siempre
pasamos
función de devolución de llamada así En lugar de
declararlo por separado, aquí
definimos directamente Se puede ver mediante el uso del método de función de
devolución de llamada, podemos manejar tarea asíncrona Anteriormente, usamos
esta notación Colbec para definir rutas API Entonces esa es la función de
devolución de llamada. La función de devolución de llamada es solo un nombre de la función que pasamos como argumento a
otra función, y se ejecuta
después de completar tarea, específicamente tarea
asíncrona Tan simple como eso. Ahora agreguemos
poca dificultad en esto. Supongamos que a partir de este número de
matrícula de estudiante, queremos obtener
sus detalles de resultado Después de esta función fetch
student, creamos una nueva función
llamada Get result Parámetro, agregamos el
número de inscripción porque usando eso, obtendremos el resultado de la base
de Ahora, dentro de esta función, simplemente devolvemos objeto
con propiedades, ID de
resultado al número de inscripción, que obtenemos en el parámetro, y después de eso, porcentaje
a, digamos, 70. Ahora como sabemos, nuevamente estamos recuperando el resultado
de la base de datos, lo
que significa que
nuevamente tomará tiempo, y por eso esta
función es cantante sobre nosotros. Entonces para simular el retraso, aquí agregamos la función set timeout y dentro de ella la función callback, y nuevamente, esperamos
3,000 milisegundos Ahora bien, en esta función de
tiempo de espera establecida, movemos este retorno, y como sabemos este retorno no
tiene sentido Tenemos que pasar este resultado a función de
devolución de llamada.
Como hicimos aquí. Así función de devolución de llamada
y simplemente envolver este objeto resultado con paréntesis de función de
devolución Además, antes de eso,
podemos consultar resultado de búsqueda de log de
punto
de la base de Bueno. Ahora, donde llamamos a esta función de resultado Gad,
piénsalo Sí, podemos llamar a la función Gad
result en esta
función callback porque
obtenemos la inscripción en
el objeto student, y también podemos llamarlo aquí en la función fetch Pero como esa función se
trata de obtener los datos, y por eso no
queremos mezclar las cosas Entonces llamamos a la función de
resultado Ga
en la función de devolución El primer argumento,
pasamos el número de matrícula, que es estudiante
punto E underScenum Y lo que pasemos en
el segundo argumento, vamos a pasar la
función callback aquí Ahora, aquí en el parámetro, obtenemos el objeto resultado
que pasamos aquí, y simplemente consola punto
log resultado a resultado. Además, tenemos que obtener esta
devolución de llamada desde el parámetro. Salva a las pandillas y
vamos a ejecutar este marcador. Aquí, primero obtenemos
los datos del alumno, y luego después de 3 segundos, obtenemos resultado de ese alumno. Entonces déjame mostrarte rápidamente
lo que está pasando aquí. Entonces, antes que nada, la consola de
inicio funciona, y luego llamamos a este
otoño función estudiante. Pero debido a esta función de tiempo de espera
establecida, no
se ejecutará de inmediato Entonces nuestro código avanza y
simplemente consolar este fin. Ahora, después de 3 segundos, el tiempo de espera establecido ejecutará el código que está
disponible dentro de ocho Entonces llamamos a la función Callback
y simplemente pasamos Object. De donde obtenemos esta función de
devolución de llamada. Bien, lo obtenemos
del parámetro, y donde definimos
esa función de devolución de llamada, es aquí en la función fat
student, y es por eso que primero obtenemos los detalles del
estudiante Ahora, después de obtener
los datos del alumno, llamamos a otra función, que es resultado G. Entonces esta
función de resultado G se ejecutará, y debido al tiempo de espera establecido, nuevamente
toma 3
segundos para ejecutarse Y dentro de esto, llamamos a
otra función de devolución de llamada, y donde definimos esa función de
devolución de llamada, sí,
aquí, y por fin, esa función de devolución de llamada
consola este resultado,
y esto es lo Si sin función de devolución de llamada, queremos ejecutar nuestro código en el mismo orden, entonces podemos hacer eso Obtenemos estudiante indefinido
y por eso, ni siquiera
podemos obtener resultado. Entonces ahora entiendes por qué
pongo tanto peso en
la función de devolución Porque si te confundes
en la función de devolución de llamada, ¿cómo puedes
enfocarte en el nodo de aprendizaje
53. Infierno de devolución de llamadas: Actualmente en este código, agregamos esta función de devolución de llamada
dentro de otra función de devolución de
llamada. Ahora imagina si tenemos
otra tarea asincrónica, digamos resultado de actualización Dentro de esto, pasamos el ID de
resultado del punto del resultado, y la función Callback se ejecutará después de que nuestro resultado se actualice Obtenemos aquí resultado actualizado. Puedes ver que nuestro código se ve
desordenado y difícil de leer porque aquí tenemos muchas funciones de
devolución de llamada anidadas una
dentro Déjame quitar estas
todas las consolas para que
podamos ver claramente ver, aquí obtenemos callbacks anidadas Esta situación se llama
como callback hell, donde tenemos muchas funciones de
devolución de llamada anidadas dentro de la
otra y eso hace que el código sea
difícil de leer y administrar Si tenemos el mismo
código en sincrónico, entonces se ve así. Primero, llamamos función
estudiante justa y almacenamos sus datos
en variable estudiante. Igual que llamamos función Obtener
resultado y aprobar el
número de matrícula de ese estudiante. Por fin, llamamos a función de estudiante
actualizada
y aprobamos ID de resultado, que queremos actualizar. Se puede ver que el
código sincrónico es muy sencillo y fácil de
leer y administrar. Ahora podrías preguntar, ¿cuál es el problema con el infierno de
devolución Ver, incluso si tenemos
devolución de llamada, nuestro código funcionará. El problema es que solo es difícil leer y administrar porque
en el mundo real, podríamos tener más de
tres callbacks anidados Entonces a la vez,
será muy difícil de leer, administrar e incluso escalar. Entonces necesitamos que nuestro
código sea fácil de leer. Es realmente simple. Sólo tenemos que hacer
nuestra función anónima, que es la función
que no tiene nombre. Convierta estas funciones de
devolución de llamada anónimas
en funciones nombradas En palabras simples, en el lugar de definir aquí esta función de
devolución de llamada, definiremos por separado
y pasaremos ese nombre de
función aquí Vamos a agregar nuestras consolas nuevo bien y eliminar
esta última función. Acabamos de agregarlo
para devolución de llamada de demostración. Aquí creamos una función
llamada costo, imprimir estudiante. Podemos llamarlo de cualquier manera, y estoy usando aquí las funciones de
flecha en el texto porque es fácil
para la función de devolución Ahora podemos cortar esta función
Callback desde aquí y pegarla en el
lugar de esta función de flecha Bueno y en el lugar de
esa función de devolución de llamada, simplemente
pasamos la función de
estudiante de impresión Asegúrate de no llamar a la función de estudiante de
impresión aquí. Solo tenemos que pasar la
función como parámetro, y esta función print
student se ejecutará aquí como la función
callback Ahora, vamos a convertir rápidamente esta función de devolución de llamada anónima en
función nombrada Así que el
resultado de impresión Contras es igual a, y aquí simplemente pegamos
esta función de devolución Y en el lugar de esto, pasamos resultado de impresión. Ver, ahora nuestro código se ve
limpio y fácil de mantener. Para recapitular rápidamente, cuando tenemos funciones de devolución de llamada
anidadas, obtenemos el problema de curación de devolución de llamada, que es difícil de leer y administrar ¿Cuál es la solución?
Bien, convertimos nuestras funciones de devolución de llamada anónimas
en funciones nombradas.
Tan simple como eso.
54. Promesa en JavaScript: En la
lección anterior, vemos cómo manejar tareas asíncronas
usando funciones de devolución de llamada Pero en esa implementación, obtenemos este problema de
hel de devolución de llamada, y también resolvemos ese
problema con la función nombrada Ahora mi pregunta es, ¿cuántas funciones
nuevas creamos? Imagina que tenemos diez funciones de
devolución de llamada anidadas, entonces tenemos que crear
diez funciones nombradas antes de llamar a nuestra función
principal ¿Hay alguna otra forma de
manejar la tarea asincrónica? Sí, hay
otra manera que es
mediante el uso de promise.
¿Qué es promesa? Una promesa es un
objeto especial que es capaz de mantener el resultado de una operación
asíncrona En otras palabras,
promise es promesa darle el resultado de
la operación asíncrona,
o si falla la operación asincrónica,
entonces
devolverá entonces Por ahora aprendemos promesas en el nuevo archivo llamado
promises dot js. Y luego actualizamos nuestro código anterior con la implementación de
Promesas. Entonces primero, creamos promesa, y luego veremos cómo
consumir esa promesa.
Es realmente simple. Entonces, para crear promesa, escribimos nueva palabra clave
y luego prometemos. Ahora bien, esta promesa es
una clase y toma un argumento que es función
con dos parámetros. Entonces aquí, el primer
parámetro es resolver y el segundo parámetro es la función de
rechazo y flecha. Ahora dentro de esta función, podemos realizar nuestra tarea
asincrónica Entonces aquí, de nuevo, estamos asumiendo que estamos obteniendo
datos de la base de datos. Así que escribimos aquí,
establecer la función de tiempo de espera
y pasar la función de devolución de llamada
y 3,000 milisegundos Ahora imagina aquí obtenemos nuestros
datos de la base de datos. Entonces creamos una
variable llamada student equals to object, digamos, id a one
y name to Hurley Ahora aquí llamamos a
resolver porque conseguimos con éxito los datos y
pasamos aquí a este alumno. Aquí, nuestra promesa está lista. Ahora hagamos esta promesa invariable llamada
PR por promesa Bueno. Ahora veamos cómo
podemos consumir esta promesa. Es realmente sencillo escribimos PR, que es esta promesa, punto, y aquí tenemos dos
métodos principales, entonces y catch. Entonces cuando creamos promesa, es por defecto
en estado pendiente. Y si completamos la tarea
asíncrona, entonces la promesa está en estado resuelto
o cumplido Y si hay un error, entonces prometer en estado rechazado. Esto se llama un
ciclo de vida de promesa. Aquí, nuestra promesa se cumple porque llamamos
aquí función de resolución. Entonces cuando se cumple promesa, entonces obtenemos nuestros datos
este entonces método. Ahora almacenamos nuestros datos en este parámetro de resultado y luego simplemente consultamos dot
log este resultado. Entonces esto vamos a ejecutar este archivo. Nodo promete punto gs, ver, después de 3 segundos, obtenemos este resultado. Ahora imagina aquí
por alguna razón, no
obtenemos datos
de la base de datos. Aquí creamos una
variable llamada status, y la hacemos falsa. Aquí agregamos condición. Si el estado y mi sistema se apagan automáticamente,
déjame iniciarlo de nuevo. Sí, estoy de vuelta,
así que continuemos. I status es cierto, entonces ejecutamos esta función de
resolver, lo contrario simplemente llamamos
aquí función de rechazo. Ahora para una mejor práctica, cada vez que queremos
devolver error, creamos un nuevo error y pasamos
nuestro mensaje de error aquí. Este es un mensaje de error. Guarde los cambios, y vamos a ejecutar estas promesas punto js archivo. Verás, obtenemos este error aquí. Ahora vamos a consumir este error, igual que obtenemos aquí los datos
en el método then. Después de este método entonces, agregamos otro método llamado
caché y dentro de este también, pasamos la función de devolución Aquí obtenemos error en parámetro y consultamos
punto log este error. Guarde esto y volvamos a
ejecutar este archivo. Verás, obtenemos ese error aquí, y así es como podemos consumir promise usando el método then
y catch. Podemos ver en lugar de usar la función de
devolución de llamada para hacer algo después de la tarea
asíncrona, podemos usar promise para realizar esa tarea asincrónica y
luego simplemente consumir luego En resumen, si nuestra
promesa se resuelve, entonces este método entonces se ejecutará, y si nuestra promesa es rechazada, entonces este método de caché
se ejecutará, simple como eso. Si te preocupa
la creación de la promesa, entonces no te preocupes con la práctica, te sentirás
cómodo con ella. Déjame decirte una cosa. En el mundo real, 99% de tiempo, solo consumimos promesas. Sólo unas pocas veces necesitamos
crear una promesa. Ahora en la siguiente
lección, manejaremos nuestro código de recuperación de devolución de llamada usando
promesas. Será divertido.
55. Reemplazo de devoluciones de llamadas por promesas: Manejemos nuestro código Callback
L usando promesas. Puedes descargar el código de Callback hel desde
abajo de esta lección Este código lo escribimos
en la lección cuatro. Copia el código y pegarlo en otro archivo callbacltjs o también en la carpeta de recursos
y dentro de la carpeta asíncrona, obtendrás este archivo
como También puedes agregar eso
en tu proyecto. Ahora, como sabemos, en promesa, definimos nuestra tarea asincrónica Y aquí tenemos las
dos tareas asíncronas en dos funciones separadas Ahora en lugar de eliminar
estas funciones, simplemente
podemos devolver una nueva
promesa de esta función. No te confundas.
Déjame mostrarte a lo que me refiero. Entonces aquí, en la función
estudiantil sentida, simplemente
regresamos
aquí una nueva promesa. Ahora bien, lo que pasamos
en esta promesa, pasamos aquí la función, que tiene dos parámetros,
resolver y rechazar. Ahora en esta función,
lo que hacemos bien, realizamos aquí una tarea
sincrónica. Así que movemos esta función de
tiempo de espera establecido aquí usando mantener alterado u
opción y chies aro Ahora aquí no
necesitamos esta devolución de llamada. En el lugar de devolución de llamada, pasamos nuestros datos en
la función resolve, y además no necesitamos
callback en el parámetro Ahora hagamos lo mismo en
esta función de resultado de Gad. Entonces devolvemos promesa, y pasamos aquí función con dos parámetros,
resolver y rechazar. Si no quieres
escribir toda esta línea, entonces déjame mostrarte un
atajo para eso. Entonces aquí escribimos nueva
promesa sin espacio, y seleccionamos esta sugerencia. Mira, aquí tenemos
nuestra nueva promesa. No muestro esto
previamente porque quiero que te pongas cómodo
con las promesas. Ahora vamos a mover este código
asíncrono también en la función y en
el lugar de callba, devolvemos esos datos en método
resolve y desde
arriba, eliminamos Ahora vamos a consumir esta promesa. En la parte superior, comentamos este código anterior en el que
experimentamos el infierno de devolución Ahora aquí, primero llamamos función de estudiante
justa
y pasie ID uno Esta expresión
devolverá esta promesa. Almacenemos esa promesa
en una variable llamada PR. Aquí tenemos nuestra promesa
en esta variable PR. Ahora sólo tenemos que
consumir esta promesa. Parte. Que método usamos aquí, usamos punto entonces método. Aquí pasamos función. Aquí, obtenemos parámetros, datos, o podemos llamarlo
estudiante cualquier cosa, función de
flecha, y lo
que queremos hacer si
tenemos datos de estudiantes. Simplemente queremos llamar a Get
result function y pasar aquí estudiante dot Inscripción porque aquí tenemos propiedad de
inscripción. Asegúrate de escribir la misma propiedad
que has hecho y has hecho. Entonces así es como
consumimos primera promesa. Además, en lugar de almacenar
esta promesa en variable, aquí podemos
escribir directamente esta expresión. Te confundes en
esto, entonces no te preocupes, puedes almacenar promesa en
variable y luego consumirla. Esta es la práctica común, y por eso te muestro aquí. Ahora, como sabemos esta función
de resultado
gat también devolverá promesa. ¿Cómo podemos consumir esta
promesa? Es realmente simple. El lugar de escribir
diez método aquí, podemos escribirlo después de
nuestro primer método diez. Ahora lo que obtenemos de
esta promesa, resultado, función de
flecha, y
simplemente resultado de
registro de puntos de consola a este resultado. Guarde los cambios y
ejecutemos nuestro archivo Callback Hel. Nodo callback hell dot gs. Bueno. Ver, primero,
va a buscar los datos de los estudiantes Después de eso, recuperamos el resultado
y luego imprimimos el resultado. Entonces podemos ver usando
estas promesas, nuestro código se ve más
limpio y fácil de leer. Ahora bien, si tenemos otra función en CallBal entonces similar a esta, volvemos aquí, esa nueva
función y la llamamos Ahora cuando llamamos a esa
función y la
devolvemos, podemos agregar aquí otro
método que no sea, simple como eso. Algunos estudiantes pueden confundirse acerca de esta llamada a
la función get result. Preguntan ¿qué está pasando aquí? Explique este código en detalle. Entonces aquí, de nuevo, llamo a esta
función de buscar estudiante y simplemente pasar aquí y consumir esa
promesa usando entonces método Y aquí obtenemos datos de estudiantes. Cuando obtenemos datos del estudiante, podemos pasar la
función de flecha normal con corchetes C. Ahora dentro de estos corchetes CL no
tenemos ningún código. Solo queremos regresar Obtener función de resultado con matrícula de punto de
estudiante. Entonces porque solo queremos
devolver esta línea, podemos eliminar estos corchetes C y también podemos eliminar la palabra clave
return. Esta es la manera corta de
devolver algo de
la función de flecha. Entonces, cuando queremos devolver una línea de la función
arrow, entonces escribimos
directamente después de arrow. Aquí estamos regresando
esta función. Toda esta expresión está
devolviendo una nueva promesa. Así podemos almacenarlo en nueva
variable llamada nueva PR. Ahora vamos a consumir
esta promesa también. Escribimos newpar dot the
y luego obtenemos resultado, función de
flecha, y
simplemente consola dot log, resultado e imprimimos
aquí este resultado Ahora bien, en el lugar
de esta nueva PR, ¿podemos escribir
toda esta expresión? Claro. En el lugar de las nuevas relaciones públicas, pegamos esta expresión. Y eso es lo que hicimos aquí. Ahora, como una mejor práctica, cuando tenemos promesa
esa promesa también
puede devolver error
usando el método de rechazo. Entonces es mejor
manejar ese error. Para eso, tenemos otro
método, que es el cache. Esto también lo vemos en
la lección anterior. Así que aquí también
agregamos método de caché. Aquí obtenemos error objeto y simplemente consolatog este Ahora para probar, simplemente agregamos rechazar en la función de resultado gat
antes del método de resolución, y pasamos aquí nuevo error, y mensaje de error,
resultado no encontrado. Guarda los cambios
y echa un vistazo. Volvamos a ejecutar esta
aplicación. Se trata de parchear datos. Ver, aquí obtenemos
resultado no encontrado. Si obtenemos error en alguna
de estas promesas, se ejecutará
este método de boceto. Tan simple como eso. Permítanme comentar
este método de rechazo. Es solo para pruebas. Espero que todas sus
dudas sean claras. Ahora en la siguiente
lección, veremos otra forma más fácil de
escribir este mismo código.
56. Asíncrono:await en Javascript: Ahora como podemos ver en el Calbecl después de esta función
get result, estamos consumiendo
otra promesa Ahora imagínese en este Colbecl después de esta función de obtener resultado, estamos consumiendo
otra promesa Para eso, tenemos que agregar
otro que no sea método, y eso también puede resultar
un poco confuso. Hagamos que este código sea más
simple usando asincrónico y wait. ¿Qué es awight asíncrono? Awight asíncrono es una forma de escribir asíncrono como código síncrono. Al usar awight asincrónico, podemos consumir promesas de
manera mucho más fácil Entonces antes que nada, llamamos aquí función de estudiante
justa y
simplemente pasamos aquí ID uno. Ahora bien, esta función
devolverá una promesa que
inicialmente se encuentra en el estado pendiente
porque en esa promesa, estamos realizando una tarea
asincrónica Así que podemos esperar aquí a
que esa promesa se resuelva
usando la palabra clave Awight Entonces awight pausa la ejecución
del código hasta que se resuelva la
promesa Una vez resuelta la promesa
, devuelve los datos. Ahora cuando obtengamos datos, podemos almacenarlos en
variable const student Ahora tenemos objeto estudiante, así podemos llamar Obtener resultado y pasar aquí
estudiante punto Inscripción. Esta función
también devolverá promesa, por lo que nuevamente nos adherimos a la
palabra clave Award para esa promesa, obtener resolución y esto
también devolverá datos. Resultado const. Después de eso, simplemente escribimos CLO Parkansa
log con nombre de propiedad,
resultado, y
presionamos Ascap Ahora puedes ver usando
una palabra clave weight, podemos escribir código asíncrono
que parece código síncrono Permítanme comentar
este código anterior. Guarde esto, y volvamos a
ejecutar este código. Nodo, puntos callbhll. Ver, aquí obtenemos empezar a buscar
datos de la base de datos, y luego obtenemos resultado, y al final, obtenemos Entonces nuestro código está funcionando
como sincrónico porque nuestro código está
bloqueando aquí este fin. Ahora como una mejor práctica y para hacer que este
código sea asincrónico, tenemos que usar siempre
esta función esperar dentro asincrónica porque en función normal,
no va a Así que aquí creamos una función
llamada print result. Y simplemente mueve este código
dentro de esta función. Ahora podrías preguntar que esta
es la función simple, pero un peso solo es
válido en la función ASN Entonces, ¿cómo podemos hacer que nuestra
función simple sea una función acing? Es realmente simple. Solo tenemos que agregar la
palabra clave ASN antes de la función. Y después de eso, simplemente
llamamos a esta función print result. De lo contrario, cómo va a funcionar. Haz los cambios, y
vamos a comprobar esto. Ejecute de nuevo nuestro archivo. Bueno. Es ir a buscar y ver aquí obtenemos resultado y además no
está bloqueando este fin Podemos ver usando
asincrónico y esperar, podemos escribir nuestro código
asíncrono que
parece código síncrono parece Esto es más legible y
claro que este código anterior. Ahora bien, ¿y si esta promesa escribía error usando el método de
rechazo? Aquí eliminamos comentario
del método de rechazo. Veamos cómo podemos manejar errores en el método asincrónico at Entonces, para manejar el error en asincawt necesitamos usar el método
try and catch También es simple.
Déjame mostrarte. Entonces, antes que nada, agregamos try y en los corchetes Gy,
movemos nuestro código. Ahora bien, si algo sale mal en este triplog nuestro código
se mueve directamente al bloque de caché Entonces agregamos aquí bloque de caché, y este bloque de caché tiene
un parámetro llamado error. Y sí, es el mismo error que promesa escrita
en la función de rechazo. En el soporte CLI, simplemente
podemos consultar
dot log este error Ahora veamos que
está funcionando o no. Guarde esto y ejecutemos
este archivo una vez más. Ver, aquí nos sale el error. Entonces, en términos simples, si ocurre algún error en este triplog entonces este bloque
catch se Ahora, algunos estudiantes podrían preguntar. Esto parece que este 08 está bloqueando nuestro código
para que no funcione hacia adelante. Y sí, es cierto, pero eso es cierto sólo
para esto como función. Aquí tenemos consola y
después de esta llamada de función. Entonces en la salida, obtenemos inicio, entonces nuestra función llamará. En esa función, primero, se llamará función de
estudiante justa, que devuelve promesa. Entonces un peso detendrá la ejecución del código
hasta que se resuelva la promesa. Por lo que nuestro código no
avanzará solo en esta función, sino que se moverá hacia adelante
fuera de la función. Y por eso después del inicio, conseguimos N. Entonces si
tenemos otras líneas, entonces también las ejecutará. te preocupes,
Asynchronous es una forma de
escribir código asíncrono que
parece código síncrono,
pero nuestro código funcionará Para recapitular rápidamente, cuando
tenemos promesa, podemos usar una palabra clave de pesaje Un peso pausa la ejecución
hasta que se
resuelva una promesa y
solo podemos usar un peso en
la función asíncrona Para el manejo de errores
en un método syncowt, usaremos try and catch blog Obtenemos algún error
en el blog seco, entonces nuestro método de caché
se ejecutará simple como eso. Así es como podemos
consumir promesas de una manera mucho más fácil que
este método T y catch. Es tu elección,
lo que quieres usar. Ambos funcionan igual. Depende totalmente de ti
lo que quieras usar. Además, si en Asynchronous y AD
quieres agregar el blog de TryCatch, entonces simplemente escribe Tricach
y Ver, aquí conseguimos Tri case block. Espero que aprendas mucho de esta sección o estos
conceptos se refresquen Sin borrar estos conceptos, no
podemos saltar sobre las aplicaciones
BG. Si continuamente estás
viendo este curso, entonces tómate un descanso de cinco a
10 minutos, toma un poco de aire fresco, y te
veré en
la siguiente sección.
57. Sección 07: conceptos básicos de MongoDB: Bienvenido a la séptima sección del curso ultimate no JS. Hasta ahora en nuestros proyectos, estamos definiendo datos en una
simple matriz de JavaScript. Pero el problema con
este enfoque es cuando reiniciamos nuestro
servidor o aplicación, nuestros datos se restablecen a un valor
definido y perdimos
nuestros cambios en nuestros datos. Ahora, en ese momento, la base de datos
viene en la imagen, por lo que almacenaremos nuestros
datos en la base de datos. Existen muchos tipos de opciones de
bases de datos como MySQL, SQL lite, Mongo Dib, etcétera. Mongo DB es la base de datos más utilizada
con aplicaciones de nodo, y eso es lo que vamos
a aprender en este curso Ahora, una cosa que quiero
aclarar es que después de
completar este curso, no
vas a
dominar completamente Mongo DB porque Mongo Di B en sí es un curso de
cuatro a 5 horas, pero voy a tratar de cubrir
tantos temas como sea Entonces en esta sección,
comenzaremos con muy básicos de base de datos, y luego
avanzaremos para crear, leer, actualizar y eliminar
los datos con ejercicio. Estoy muy emocionada, y
espero que tú también. Entonces, vamos a sumergirnos en esta sección.
58. Introducción a la base de datos: Ahora antes de comenzar a
aprender Mongo Deb, es mejor
que aprendamos algunos términos
básicos de base de datos Entonces, como
sabrás, la base de datos es una colección organizada de información
estructurada
llamada datos, y se almacena en la
computadora o en la nube. En las escuelas antiguas, nuestro
maestro utilizó un libro o registro para realizar un seguimiento
de la asistencia de los estudiantes. Eso es base de datos,
pero está en papel duro. En el mundo actual, utilizamos sistema
informático para
almacenar esos datos, de manera que podamos acceder a ellos
en cualquier momento y desde cualquier lugar. Todos sabemos esto, ¿verdad? Ahora, hay dos
tipos de base de datos. primera es una base de datos SQL
o una base de datos relacional, y la segunda
no es una base de datos SQL o una base de datos no
relacional Difieren en la forma en
que organizan, almacenan y administran los datos. Déjame
explicarte esto uno por uno. Entonces SQL significa lenguaje de consulta
estructurado. La base de datos SQL está bien
organizada llenando gabinetes. Estos dos datos en tablas usando múltiples columnas
y filas como esta. Podemos ver que esta es una estructura muy
organizada. Cada columna de la
tabla representa diferentes rellenos de
datos, como nombre, dirección de
correo electrónico,
número de teléfono y contraseña, y cada fila de la tabla
es un nuevo conjunto de usuarios. Tenemos que pasar
datos de un solo usuario para todas estas columnas, y por eso
es tabla organizada. Ahora, por otro lado,
ninguna base de datos SQL es como una placa
flexible donde podamos organizar los datos como queramos. En ninguna base de datos SQL, no
tenemos tablas
porque no
siguen una estructura estricta
basada en tablas
o una estructura basada en esquemas. Las bases de datos SQL almacenan datos en formatos
más flexibles como documentos
DSN o pares de valores
clave Por ejemplo, si tenemos
los mismos datos de usuario, podemos almacenarlos
así en par de valores clave. No necesitamos proporcionar
todos los campos para cada usuario, y es por eso que podemos llamarlo esquemas o esquema estructura
flexible Las opciones populares para SQL son
MesquleQtoracle, etcétera. Donde en el NoSQL, tenemos Mongo DiBrds Podría preguntar cuándo elegimos SQL y cuándo vamos
por ninguna base de datos SQL. Por lo
que depende del tipo de datos que esté tratando y
lo que necesite su aplicación. Utilizamos SQL, si queremos que nuestros datos estén estructurados y
organizados en tabla. Además, si necesitamos ejecutar consultas
complejas para análisis o si se usa
consistencia de datos, entonces usamos la base de datos SQL. otro lado, no
usamos SQL, si queremos que nuestros datos estén
desestructurados o semiestructurados, excepto el rápido crecimiento de los datos, necesitamos flexibilidad
en nuestro modelo de datos
nuestra aplicación es en tiempo
real o big data,
entonces no usamos ninguna base de datos SQUL Por ejemplo, estamos creando aplicaciones de comercio
electrónico, que tiene muchas características como el
usuario puede subir reseñas, sugerencias de
productos en las que nuestros datos están desestructurados
o semiestructurados, y también los usuarios podrían dar
reseñas en grandes cantidades En su momento, ¿qué
base de datos debemos elegir? Bien, usamos aquí,
sin base de datos SQL. Tomemos un ejemplo más. Supongamos que estamos construyendo un sistema
bancario donde necesitamos datos
estrictos y transacciones
financieras precisas. ¿Qué base de datos debemos elegir? Derecha, usa aquí SQL. Entonces realmente depende de
qué tipo de datos estamos tratando y qué tipo de aplicación queremos construir. La mayoría de las veces, tu
equipo te dirá qué base de datos debes
agregar en tu aplicación. Así que no te preocupes por eso. Muchos desarrolladores realmente
no conocen la diferencia entre SQL y ningún
SQL. Ya sabes, ¿verdad? En muchas aplicaciones de nodo, elección predeterminada de
los desarrolladores es Mongo DB, que es la base de datos sin Squal. Y si quieres
convertirte en desarrollador de MSTech, esto es para Mongo En este curso, agrego
MongoDB como base de datos. No te preocupes, aprenderemos
MongoDB paso a paso.
59. Instala MongoDB en Windows: Vamos a instalar Mongo
DV en Windows, y si tienes MG, entonces puedes saltarte esta lección En primer lugar,
dirígete a mongodib.com. Ahora ve a estos productos y
selecciona Community Edition. Ir a descargar Comunidad. Desplácese hacia abajo. Y aquí podemos
seleccionar la versión Mongo Di B. En mi recomendación,
por favor no lo cambies. A continuación, podemos seleccionar
nuestra plataforma, y luego usted puede seleccionar paquete. No te preocupes por esto,
haz clic en Descargar. Ver, se inicia la descarga. Ahora, después de completar
la descarga, abre esa configuración y te pedirá permiso de
instalación. Permitirlo. Haga clic en siguiente. Acepte el acuerdo.
Haga clic en completar. Después de eso, a partir de aquí, podemos cambiar nuestra ruta
de instalación. Pero si no tienes ninguna
razón, entonces no la cambies. Simplemente haga clic en siguiente. Asegúrate de seleccionar
esta brújula Mongo DB, que es la aplicación
para MongoDB,
en la que podrás ver
todas las tablas de la base y editarlas o Da clic en siguiente e instala. Esto tomará algún tiempo alrededor cinco a 10 minutos porque también
estamos instalando la brújula
Mongo DB Ahora, después de completar esta instalación,
verifiquemos esto. Abra el símbolo del sistema y
escriba Mongo D y presione Entrar. Obtenemos este error,
Mongo D no es reconocido como un comando interno
o externo Entonces para resolver este error, tenemos que volver a ir al sitio web de
Mongo Db y aquí en los mejores productos e ir a
ver todos los productos en herramientas Ahora, desplácese hacia abajo en esta página, y aquí obtenemos la opción de celda. Así que seleccione estos ahora haga clic
en Descargar, desplácese hacia abajo. Y aquí volvemos a
descargar esta configuración. Ahora, después de completar
la descarga, abre esa carpeta de descargas y extrae ese zip que
acabamos de descargar. Bueno. Ahora, abre esa carpeta, y en la carpeta bin, obtenemos este archivo Mongos Así que simplemente copie estos y abra los archivos del programa de
su unidad C. Servidor MongoDB, 8.0 B, y aquí pegamos
conjunto Este Mongos es nuestro celular
Mongo DB. Ahora tenemos que dar un último paso, que es establecer este camino
hacia el camino del entorno. Así que copia esta ruta en inicio, busca la variable de entorno y abre la edición de las variables de
entorno del sistema. Déjame cerrar como cosas. Ahora, haga clic en estas variables de
entorno, y en las variables del sistema, seleccione la ruta, y haga clic en Editar. Ahora tenemos
que agregar esa ruta de bin aquí, así que da click en Nuevo y pasea
ese camino. Haga clic en Bien. Bien, y bien. Ahora, de nuevo, abra el símbolo del sistema. Escribimos mangos y golpeamos Enter. Obtendremos la celda Mongo DB, por lo que instalamos con éxito
Mongo DB en nuestro sistema Ahora déjame darte un rápido recorrido por esta brújula Mongo DB Cuando abrimos esta
brújula por primera vez, tenemos que ingresar a nuestra cadena de
conexión, que es nuestro
anfitrión local, Columna 27017 Puedes escribir esta cadena de
conexión, que agregué y hacer clic
en Guardar y conectar. Ver, aquí podemos ver nuestra
base de datos y también
podemos ver tablas y A
podemos ver documentos.
60. Conecta MongoDB con la aplicación Node: Por lo que instalamos Mongo
Di B en nuestro sistema. Ahora conectemos ese Mongo
Di B con la aplicación de nodo. Entonces para aprender Mongo Di B, vamos a crear un nuevo
proyecto porque no
quiero que te confundas con el proyecto
anterior tastak Añadiremos Mongo Di B como ejercicio en ese
proyecto. Será divertido. Entonces por ahora, en la carpeta
projects, creamos una nueva carpeta, digamos Mongo demo, nombre
raro, pero está
bien para aprender Vamos a abrir esta carpeta
en el código VS. Ahora para inicializar este proyecto, abrimos nuestra terminal
y escribimos NPM en ella I. Bien. abrimos nuestra terminal
y escribimos NPM en ella I. Bien.
Y aquí creamos
un nuevo archivo, index dot gs. Ahora en aplicaciones de nodo para administrar y trabajar
con MongoDB, usaremos una
biblioteca muy popular, que En palabras simples, al
usar la biblioteca Mongoose, podemos trabajar fácilmente
con Mongo DB Vamos a instalar esta biblioteca
usando NPM install Mongoose, si quieres obtener
el
mismo resultado que estoy obteniendo en este curso, entonces aquí mismo a
la tasa 8.13 Bueno. Ahora para usar esta biblioteca, primero, la importamos
usando la función requerida. Aquí pasamos mangosta y la
almacenamos en mongoos de
const variable Ahora bien, este
objeto mangosta tiene muchos métodos. Uno de ellos es connect, así mongoos dot Aquí tenemos que pasar la URL de la base de datos
Mongo DB a la que
queremos conectar Abrimos aquí, aplicación de
brújula MongoDB. Aquí podemos ver que tenemos la cadena de
conexión, que es
host local, columna 27017 En nuestro código, escribimos
en códigos, Mongo DB,
columna, barra diagonal doble, host
local, Columna 27017, que representan la base de datos local
Mongo Deb, que representan la base de datos local barra diagonal
hacia adelante,
y aquí escribimos nuestro nombre específico de colección de
base de datos, digamos Mongo Demo este
no es el nombre de la aplicación, este es el nombre de la base de datos. No te preocupes,
lo veremos en próximas secciones. Ahora bien, esta expresión
devuelve una promesa, y recuerdas, ¿cómo
podemos manejar la promesa? Podemos usar el método then
y catch, o podemos usar asincrónico esperar Actualmente, no
tenemos promesas anidadas, así que para simplificar, podemos
usar aquí, luego método Si quieres usar
ASN y Aviate, entonces tienes que crear
una nueva función ASN Así que aquí agregamos ese método diez, lo que significa que lo conectamos
con éxito la función de flecha, y simplemente consola dot log, Mongo Dib conectado con Entonces podría suceder que
algo salga mal como la
conexión a Internet se perdió, o no se encontró la base de datos o algún tipo de errores en
la cadena de conexión. En ese momento, obtendremos
error en esta promesa. Así que también agregamos
aquí el método catch, y aquí obtenemos el objeto error. Y simplemente consola dot log, conexión
Mongo DB falló Coma ese objeto de error. Entonces básicamente, le estamos
diciendo a Mongoose, conecte nuestra aplicación a esta base de datos local, demostración de Mongo Ahora podrías preguntar, no
creamos esta base de datos
demo de Mongo ¿Cómo puede Mongoose conectar nuestra aplicación
a esa base de datos ¿Nos dará error? Y la respuesta no no nos
va a dar error porque si esa base de datos Mongo demo no está
disponible en nuestro sistema, entonces Mongoose creará una nueva base de datos
llamada Mongo demo, y si esa base de datos ya
está disponible, entonces simplemente usará eso Ahora bien, si esta base de datos se
conectó correctamente, entonces logramos el mensaje de éxito, y si nuestra conexión falla, entonces logramos este error. Guarda los cambios, y vamos a ejecutar nuestra aplicación usando
nodemon index dot JS Ver, aquí conseguimos
conexión exitosa. Entonces así es como conectamos
Mongo Di Be con nuestra aplicación de nodo usando el método
Mongos dot connect Ahora, déjame decirte algo. Anteriormente, Mongo
Di Be solía tener una forma más antigua de
conectarse con la base de datos, pero no era perfecta, y los desarrolladores tenían
algún problema con eso En algún código antiguo, verás pasar
estas opciones
con conexión. Estas opciones son solo para manejar mejor
la conexión. Podrías usar el nuevo analizador de
URL para true, lo que le dice a Mongoose que use la forma moderna de
conectarse con Mongo Además, obtenemos uso de
topología unificada a True, que le dice a Mongos que administre las conexiones de una manera más fluida
y estable Ahora en la nueva versión de Mongo Di, estas opciones están por defecto encendidas, así que no necesitamos
pasarlas aquí. Te lo dije, si
ves este tipo de código, no
te confundes con eso. Ahora en la siguiente lección, crearemos nuestro
primer esquema de documento.
61. Importancia del esquema: Antes de almacenar nuestros
datos en nuestra base de datos, es mejor definir la
estructura de la camada para esos datos. Por ejemplo, queremos
registrar un nuevo usuario
en nuestro sitio web. Por lo que llena el formulario con nombre, correo electrónico, número de teléfono
y contraseña. Y cuando golpeamos registro, almacenamos estos datos
en nuestra base de datos. Ahora, como desarrollador, sabemos que a veces
el usuario olvidó escribir su nombre u olvidó escribir
correo electrónico o contraseña. El usuario puede olvidar cualquier cosa. Entonces, para evitarlos,
definiremos la estructura de la camada
para esos datos, lo que significa que podemos
definir el nombre es obligatorio, correo electrónico como campo único, lo que significa que cada usuario debe
usar una dirección de correo electrónico única. El número de teléfono puede ser
cualquier cosa o el usuario también puede omitir esta información y
contraseña también se requiere. Ahora bien, si el usuario no pasa
nombre o escribe correo electrónico incorrecto, entonces sus datos no se
almacenarán en nuestra base de datos. Devolveremos el error
para ese usuario, y así es como podemos evitar que datos
no deseados e innecesarios se almacenen datos
no deseados e innecesarios en nuestra base de datos. Por eso es
importante definir la estructura y a esta estructura
se le llama esquema. Podrías preguntar en la lección de
introducción a la base de datos, te
dije Mongo DB o ningún SQL es el
esquema o estructura flexible del esquema, y SQUL es la estructura
basada en esquemas, y ahora
te estoy diciendo ¿Por qué? Sabemos que en MongoDB, almacenaremos datos en
el par de valores clave Supongamos en nuestro ejemplo anterior, algún usuario pasa nombre de
campo, correo electrónico, como dirección de correo electrónico, o
nombre como nombre de usuario, entonces ¿cómo podemos administrar
este tipo de datos? MongoDB es un esquema flexible, lo que significa que no
tenemos que definir el Sin embargo, la definición de un esquema
proporciona consistencia, validación y
previsibilidad, que son cruciales en la mayoría de las aplicaciones de nivel de
producción Un esquema nos ayuda a evitar datos
no deseados o sucios. Además, al definir el esquema, podemos escribir la
lógica de consulta con mayor claridad. Ahora podrías preguntar a Mongo Di B es esquemas o esquema de estructura
flexible ¿Cómo podemos definir
la estructura en MongoDB? La respuesta es Mongo DB no
hacer cumplir el esquema de sus datos. Pero al usar otras
herramientas como Mongoose, podemos definir el esquema para
nuestros documentos Mongo DB Además, si estás
familiarizado con SQL, en eso tenemos tabla, supongamos usuario, y en esa tabla, tenemos filas para cada usuario. Ahora en Mongo Di B esa mesa
se llama colección. Esa fila se puede
llamar como documento. No te confundas cuando uso palabras como colección
y documento. Son muy similares
a mesa y fila. Para recapitular, podemos
definir esquema para nuestra colección Mongo Dew para un mejor uso de
nuestra Ahora en la siguiente lección,
veremos ¿cómo
podemos definir el esquema para nuestra colección
Mongo Dew
62. Definición de esquema para el documento: Veamos cómo podemos definir el
esquema usando mangos. Entonces para eso, usamos nuevo esquema de puntos de mangos,
que es una clase Ahora en este paréntesis, agregaremos objeto con nuestro nombre de relleno y
estructura para ese relleno Por ejemplo, primero necesitamos nombre, columna, y aquí escribimos el tipo de datos que
queremos almacenar. Entonces, por nombre,
queremos almacenar stream. Asegúrate de escribir
como en mayúscula. Ahora después de eso, podríamos tener correo electrónico y esto también
queremos en cadena. Ahora, como te dije antes, queremos almacenar el correo electrónico como valor
único para cada
documento o fila. Entonces, ¿cómo podemos definir
esa singularidad aquí? Simplemente, en el lugar de esta
cadena, pasamos objeto. Este objeto tiene
múltiples propiedades. Primero, queremos definir el tipo de este relleno,
que es string, y luego tenemos
otra propiedad que es única y la establecemos en true. Entonces, si ya tenemos
correo electrónico para un usuario, ese mismo correo no puede
usar para otro usuario. Después de eso, digamos que tenemos teléfono y pasamos aquí objeto, y establecemos tipo a número. Ahora aquí no queremos que este relleno
sea necesario. El usuario también puede omitir
este teléfono lleno. Entonces aquí no pasamos nada. Y si solo queremos pasar propiedad
tipo para el relleno, podemos escribir directamente
como este número. Pero me gusta seguir
una sintaxis consistente, así que dejo esto tal como está. Pero en el campo name en
el lugar de esta cadena, simplemente
agregamos objeto
con tipo a cadena, y también queremos que
este campo sea obligatorio. Añadimos aquí, requerido a true. Asegúrate aquí escribimos
requerido, no requerimos. No estoy seguro de que solo
requiero esté funcionando o no. Además, siempre almacenamos nuestro ID de
EML en minúsculas, y también podemos definirlo
aquí por minúsculas a true Se puede ver que definir el esquema no
es difícil. Es muy sencillo. Ahora, después de eso, tenemos
contraseña y
queremos almacenarla como cadena y
es el campo obligatorio. Dime qué propiedades
debemos agregar aquí. Correcto, agregamos aquí tipo a
cadena y requerido a true. Lo estás haciendo muy bien. Ahora, después de eso, este
usuario podría tener aficiones, que pueden ser múltiples cosas. Así que queremos almacenarlo en array. Escriba a corchetes, que es array, y en eso, queremos cadena simple. Así que nuestros pasatiempos podrían
parecerse a esta variedad de cuerdas. Ahora después de eso,
podríamos tener está verificado, qué usuario fuente
está verificado o no, y establecemos su tipo en Bullion, lo que significa verdadero o falso Y por defecto, queremos
almacenar usuario como no verificado. Entonces para eso, tenemos otra
propiedad llamada default. Pasamos el valor por defecto como false. Así es como definimos el esquema
para nuestra colección Mongo DB. En el esquema, tenemos múltiples tipos de
esquema como string, number, booleano,
date, object, array, object ID, que
veremos en el futuro, B para almacenar los datos binarios mezclados para cualquier tipo
de datos mucho más Si quieres conocer todos los
tipos de esquemas y su propiedad, entonces puedes visitar esta documentación de
mangosta En esta página, obtenemos
toda la información. Ahora en la siguiente lección,
veremos cómo aplicar este
esquema para la recolección.
63. Crear modelos: En la lección anterior,
creamos este esquema de usuario. Ahora bien, ¿cómo podemos definir qué colección debe
seguir este esquema? Para eso, necesitamos
crear un modelo. Entonces, antes que nada, almacenamos este esquema en una variable
llamada esquema de usuario. Ahora para aplicar este esquema de usuario, necesitamos crear modelo. Así que escribimos aquí
Mangosta punto Modelo. Dentro de esta en la
primera posición, pasamos el
nombre singular de nuestra colección, que es aquí usuario. Por lo que este usuario se convertirá en colección de
usuarios. Si queremos crear colección llamada post, que es plural, entonces aquí, tenemos que escribir nombre
singular de esa
colección, que es post. Ahora en el segundo argumento, pasaremos nuestro esquema
para esta colección de usuarios, que es este esquema de usuario. Ahora esta expresión
devolverá el modelo para la colección de
usuarios. Así que lo almacenamos en la
variable llamada usuario. ¿Me pueden decir por qué estoy usando esta convención pascal o
por qué uso U para modelo de usuario Es porque este usuario es una clase y usando esta clase o modelo de
usuario, haremos muchas cosas. Simplificar el modelo es
como un blueprint para crear y trabajar con documentos en una colección Mongo
Deb Define la forma
de nuestros datos usando un esquema y proporciona una forma de interactuar
con esa colección. En términos simples, el modelo
nos permite crear nuevos documentos
basados en el esquema, leer datos de la colección, actualizar documentos existentes, además, eliminar documentos
de la colección. En definitiva, sin modelo, no
podemos hacer nada con la colección
Mongo Di Bi No te preocupes vamos a ver todo esto en las
próximas lecciones. Actualmente, déjame
mostrarte cómo podemos crear un nuevo usuario
usando este modelo de usuario. Entonces para crear un nuevo usuario, escribimos nuevo usuario, y dentro de este,
pasaremos nuestro objeto de usuario. Entonces el primer campo de
esta colección es nombre y valor de pase como código más U. Puedes escribir tu nombre. A continuación, tenemos correo electrónico, digamos, código en did gmail.com Actualmente, estamos escribiendo
manualmente estos valores, pero
en el mundo real, nuestro usuario desde el
front-end escribirá este valor y
lo entregará usando post request. Y en el back end,
manejaremos esa solicitud de post, y dentro de la lógica post
request, escribiremos esta
nueva expresión de modelo. Así que no te preocupes por eso. A continuación, tenemos teléfono, que puede ser cualquier cosa
23, 51, 552. A continuación, tenemos contraseña. Asegúrate aquí escribimos el mismo nombre de relleno que
definimos en el esquema. Contraseña para cadena 123, cuatro, cinco, seis, 78. Y aficiones para armar, y aquí agrego el aprendizaje,
la enseñanza y el seguimiento. Para el último campo, ya
establecemos el
valor predeterminado en nuestro esquema, así que no necesitamos
pasar ese relleno aquí. Así es como podemos crear un nuevo usuario o documento
de la colección. Aquí, lo almacenamos en una
variable por nuevo usuario. Ahora, actualmente, este nuevo usuario
está disponible solo a nivel local. En la siguiente lección,
veremos cómo
podemos almacenar este nuevo
usuario en nuestra base de datos.
64. Guardar un nuevo dato: Entonces aquí tenemos nuevos datos de usuario. Ahora vamos a almacenarlo
en nuestra base de datos. Por lo que este nuevo
dato de usuario tiene un método, que es el punto CV. Al utilizar este método save, podemos almacenar estos nuevos
datos de usuario en nuestra base de datos. Ahora guardar los datos en la
base de datos es tarea asincrónica, lo
que significa que puede llevar algún tiempo guardar nuevos
datos en la base de datos Y por eso esta
expresión devuelve una promesa. Puedes adherir, esperar y cuando nuestros datos
se almacenen con éxito en la base de datos, devolverá el
objeto de usuario almacenado de la base de datos, por lo que podemos almacenarlo
en una variable llamada datos
almacenados y simplemente consola
dot log con datos almacenados. Ahora como sabemos, cuando
queremos usar esperar, necesitamos una función acing y
solo dentro de esa función, podemos usar esperas. De lo contrario, nuestro código
bloqueará las siguientes líneas. Aquí, antes de este
nuevo objeto de usuario, creamos una nueva
función acing llamada create user. Y dentro de esta función, podemos simplemente mover este
nuevo usuario y guardar método. Y al final, llamaremos a
esta función de crear usuario. Ahora no guarde el archivo
, automáticamente
ejecutará este archivo. I terminal, detengo nuestro enlace de nodo usando Control más C.
Ahora guarda los cambios, y veamos que esto
está funcionando o no. El terminal, ejecutamos este
archivo usando el nodo index dot js. No uses aquí nodemon
porque solo
queremos ejecutar este archivo index
dot js una vez Si usamos nod M y cambiamos
algo en nuestro archivo, un nuevo usuario
creará cada vez Mira, aquí obtenemos
nuevos datos de usuario con nuestros rellenos y al final
también obtenemos underscore ID, que es el
ID único para este documento, y es generado por
Mongo DB y usando este ID, podemos hacer muchas cosas Además, llegamos aquí subrayado
subrayado a cero. ¿Eso es? Este
subrayado se utiliza para el
empeoramiento de documentos Cuando creamos un nuevo documento, Mongoose agrega el
subrayado subrayado rellenado y lo establece Ahora cada vez que se actualiza el
documento en particular, mangos aumentan el subrayado
subrayado rellenado Por ahora, no te preocupes por eso. Además, podemos ver estos datos en la aplicación de
brújula Mongo DV Ver en la base de datos local, aquí no obtenemos nuestra base de datos, da clic en la base de datos Puntos de árbol
y refrescar. Ver, ahora obtenemos la base de datos
Mongo Demo. Dentro de esto, tenemos colección de
usuarios, que creamos usando modelo, y en esa colección, tenemos nuestro primer documento
con ID único, y también tenemos nuestros rellenos. Digamos que esta matriz Obs, que es un par de valores
clave, key es el índice
de ese elemento, y value es nuestra cadena. Obtenemos datos de la base de datos
en nuestro archivo JS de punto índice, luego obtenemos
matriz normal de cadena. Simplemente se muestra aquí
en el par de valores clave. También, vea, por defecto, establecemos este
valor verificado en false. Y sí, podemos cambiar los datos
de esta aplicación. Entonces, para recapitular rápidamente, primero, creamos un nuevo objeto de usuario
usando este modelo de usuario, y luego simplemente podemos usar método
Lots para guardar
este documento Ahora intentemos almacenar
otros datos de usuario porque necesitamos esos datos
en las próximas lecciones. Cambié su nombre a Halley, correo electrónico a Halley en
direct Si quieres cambiar algo, y puedes cambiar en el número de
teléfono, contraseña, Harley 123, y hobbies, digamos, codificación,
Jimming y seguimiento Guarda los cambios y
en nuestro terminal, ejecutamos node index dot js. Bien, mira, aquí obtenemos nuevos datos. Si revisamos nuestra brújula
Mongo Di B, no
obtenemos aquí datos Entonces nos refrescamos desde aquí y
vemos aquí obtenemos nuestros nuevos datos. Así es como son los datos
en nuestra base de datos. Si seguimos esto paso a paso, entonces es realmente sencillo.
65. Consulta los datos: Ahora veamos cómo
podemos consultar los datos. Pero podría preguntarse, ¿cuál
es el significado de consulta? La consulta es simplemente una solicitud de información
de la base de datos. En palabras simples, una
consulta es solo una forma de pedir a la base datos datos
específicos basados en
ciertas condiciones. Por ejemplo, de la colección de nuestro
usuario, queremos obtener
datos de todos los usuarios. En primer lugar, escribimos el
modelo de esa colección, que es el punto de usuario aquí
obtenemos múltiples métodos de consulta. Tenemos encontrar por
identificación, y encontrar uno. Además, tenemos otros métodos finos para actualizar, eliminar y reemplazar. No te preocupes por esos. Los veremos en las
próximas lecciones. Actualmente, solo nos
enfocamos en este hallazgo, que se utiliza para encontrar múltiples documentos de nuestra colección. Así que tenemos Fine n
que se utiliza para recuperar un solo documento
de la colección También tenemos Fine by ID, que se utiliza para buscar
documento por su ID único Actualmente, queremos
recuperar varios documentos, así que usamos aquí punto Find Ahora bien, esta expresión
también devolverá promesa. Podemos usar aquí entonces método, o podemos usar Ising esperar. En este caso de uso, ain esperar es más sencillo y nos ayuda
a escribir núcleo limpio. Aquí, creamos una nueva función
ing llamada get users y simplemente movemos esta
espera dentro de esta función. Ahora, esto
devolverá los datos de todos los usuarios de la colección de
usuarios. Lo almacenamos en variable llamada usuarios y Consol dot
log estos datos de usuarios También en el lugar de
esta función creatuser, llamamos gtUsersFunction, y la
movemos por debajo de esta función Ahora veamos que estamos
obteniendo datos o no. Guarde los cambios. Y vamos a ejecutar esta aplicación usando
nodo index dot gs. Ver, aquí obtenemos matriz
de datos de dos usuarios. El primero es el código
PlusU y después Harley. Encantadora. Así es como obtenemos
todos los datos de la colección Ahora, hagamos esto
más interesante. Supongamos que queremos encontrar sólo aquellos usuarios
cuyo nombre es Harley. Entonces para hacer eso, pasamos
objeto en el método fine. Aquí, podemos definir múltiples condiciones
en par de valores clave. Ese es un nombre dos
codifica Harley. Esto encontrará todos los
datos de los usuarios cuyo nombre es Halley. Además, aquí podemos pasar múltiples condiciones como Es
verificado a falso, etcétera Esta consulta
comprobará si el nombre es Halle y su
valor es verificado es falso o no Si ambas condiciones son ciertas, sólo entonces obtenemos
los datos de esos usuarios. Di esto y
ejecutemos nuestra aplicación. Ver, aquí obtenemos matriz
vacía. ¿Por qué? Como podemos ver en nuestra base de datos, tenemos nombre Halle y ademas
se verifica se establece en false Entonces por qué no estamos
obteniendo estos datos. Aquí en la propiedad de nombre, pasamos Halle en minúsculas Pero en la base de datos,
H es mayúscula. Entonces cambiemos esta condición, veamos qué cambia y ejecutemos nuestra aplicación
una vez más. Ver, aquí obtenemos nuestros datos. Así que recuerda, si pasamos
cadena por condición, asegúrate de escribir
en mayúsculas y minúsculas. Bueno. Ahora actualmente estamos
obteniendo datos con todos los rellenos. ¿Y si solo queremos buscar
el nombre de usuario y los pasatiempos? Entonces para eso, después de
este método fino, podemos agregar método select
y dentro de los códigos, pasamos nuestro nombre de campos
separados por espacio. Escribimos nombre pasatiempos espaciales. Si queremos otros campos, entonces también podemos pasar
aquí con espacio. Por ahora, no queremos eso. Guarde los cambios y
ejecutemos nuestra aplicación. Ver, aquí obtenemos solo nombre, aficiones y subrayado ID el cual es
agregado automáticamente por Mongo DB Además, si de nuestros datos, solo
queremos eliminar uno
o dos rellenos como aquí, queremos todos los datos excepto
contraseña y se verifique. Entonces en el lugar de
estos nombres de relleno, pasamos menos contraseña, espacio, menos se verifica. Guarde los cambios, abra la terminal y ejecutemos nuestro archivo. Ver, aquí obtenemos todos los fallidos excepto contraseña
y Es verificado. Sencillo. Ahora hagamos esta
pequeña consulta más avanzada. Supongamos que tenemos 100 datos de usuario y queremos obtener esos datos, pero ¿cómo podemos obtener 100
datos en una sola matriz Es mejor que busquemos los
primeros diez datos, luego después de eso,
otros diez datos Entonces aquí eliminamos esta
condición porque queremos todos los datos y
después de la selección, agregamos límite dentro de este, podemos pasar el número de
registros que queremos ver. Digamos diez. Guarde los cambios, abra la terminal y
ejecutemos nuestra aplicación. Ver, aquí obtenemos dos registros porque
sólo tenemos dos registros. Si tenemos 20 registros, entonces solo obtenemos los
primeros diez registros. También, como tenemos límite, también saltamos método. Aquí pasamos el número
de datos que queremos omitir. Si tenemos 20 registros
y nos adherimos saltamos cinco, entonces saltará los
primeros cinco registros y luego mostrará de seis a 20 datos. Este método limit y skip son muy útiles para la
paginación y la consulta No te preocupes, agregué lección por
separado para eso. Por ahora, solo
entiende Skip y limit están disponibles.
Entonces, vamos a quitar esto. Bueno. Ahora por fin, también
podemos abreviar nuestros
datos por cualquier relleno. Supongamos que queremos abreviar nuestros datos de usuario por
su nombre llenado. Entonces podemos escribir aquí punto corto, y dentro de este, pasamos objeto, y aquí pasamos nuestro nombre de campo, que es nombre, y aquí
podemos pasar dos valores uno, que es para orden ascendente y menos uno para orden
descendente. Pasemos los dos uno por uno. Primero, guarda esto y
ejecutemos nuestra aplicación. Verás, obtenemos usuarios
con orden ascendente, lo que significa A a ZD si
cambiamos esto a menos uno, guardemos esto y
volvamos a ejecutar nuestro archivo Mira, aquí obtenemos orden
descendente, que es de Z a A, y por eso muestra primero
har y luego
código te bendiga. No te preocupes, te voy a dar PDF
detallado de esta sección. Puedes revisar estos métodos
lo más rápido posible.
66. Operadores de comparación en MongoDB: Aprendamos sobre
los operadores de comparación en Mongodib. Los operadores de comparación
se utilizan para comparar valores en la base de datos con los valores
que especificamos en la consulta, y es muy importante
cuando estamos trabajando con datos, especialmente datos basados en números. Por ejemplo, imagínese
en nuestros datos de usuarios, hemos llenado de edad, y queremos buscar datos de
usuarios cuya edad 18-30 mayor que
18 o menor que 50 Puede ser cualquier cosa. Cuando queremos hacer algo como esto, necesitamos operador de comparación. Hay muchos
operadores de comparación en Mongo Deb. Primero, tenemos dólar EQ, que es para iguales a. A continuación, tenemos el dólar N, que no es igual
al dólar GT, que es mayor que el
dólar GT E. ¿Puedes adivinar? Derecha, mayor o
igual a dólar LT, que es un LT menor que dólar para menor o
igual al dólar E. Esto se utiliza para emparejar cualquiera
de los valores de la lista, edad debe ser 18, 22, 25, así. Puede pasar múltiples
valores en matriz. Y por fin, tenemos dólar NIN que no coincide con
ningún valor en array, y es opuesto al dólar
N. Los operadores de comparación
son realmente simples. Déjame mostrarte dónde tenemos que escribir operadores de comparación. Entonces, para que sea práctico, agreguemos el campo H para
estos dos documentos. Entonces Pan Mongo para ser brújula e ir a la colección del usuario Aquí, podemos modificar cada
documento usando este icono de edición. Sobre cualquiera de los campos. Y en el lado izquierdo, obtenemos icono
más para agregar nuevo campo. Seleccione agregar nuevo campo, y aquí escribimos nuestro nombre de relleno, que es la edad, y pasamos
valor, digamos diez. Actualmente, este
tipo de valor es string, pero podemos cambiarlo a partir de aquí y
lo establecemos en integer 32. Ver, ahora es entero. También agregamos nuevo campo
para el segundo documento, nombre de
relleno, edad y
valor, digamos 20. Como cambiamos un tipo a entero
32 y pulsamos en Actualizar. Código. Ahora, en nuestro código, anteriormente, como podemos ver, si quieres agregar
condición para nuestra consulta, entonces agregamos ese relleno
el objeto aquí, como edad a diez. Esto buscará todos los
datos de los usuarios cuya edad es t diez. Déjame hacerte una
pregunta donde podemos escribir nuestro operador
lógico. Porque como podemos
ver, por condición, tenemos que pasar
par de valores clave en este método find. Entonces la solución está en el lugar de este valor codal
duro diez, podemos escribir nuestro
operador de comparación en otro objeto No te confundas, mira esto. Entonces en el lugar de
diez, agregamos objeto, y simplemente escribimos operador de
comparación como
clave en este subobjeto. Digamos dólar GTE, que es
mayor que o igual a, y mayor que
o igual a qué? 18. Entonces esto simplemente significa encontrar todos los usuarios cuya edad sea
mayor o igual a 18. Simplemente reemplazamos ese valor codificado
duro diez con el objeto, y dentro del objeto, usamos operador de comparación. Ahora déjame
darte una pequeña tarea. Eliminemos todo este
objeto del método fino. Queremos buscar a todos los usuarios
cuya edad sea menor de 18 años. Aquí agregamos objeto, y primero, agregamos en qué campo queremos
aplicar condición, que es edad. Y en lugar de valor duro, pasamos aquí objeto porque queremos usar operador de
comparación, y dentro de él, usamos dólar T por menos de
y menos que a 18. Tan simple como eso. Guarda este
archivo y para el método find, podemos ejecutar nuestra aplicación usando nodemon index dot js porque no va a cambiar
nada en la base Ver, aquí obtenemos usuario
cuya edad es menor a 18. Se puede ver solo tenemos que
pasar Objeto con operador de
comparación en
el lugar de valor duro. Además, estos primeros seis
operadores son muy simples, pero muchos estudiantes confundidos en esto en y no en operador. En el lugar de valor, aquí tenemos que pasar
lista de valores. Entonces déjame mostrarte
estos dos operadores. Supongamos que queremos
buscar únicamente usuarios cuya edad sea de 18, 20 o 30 Entonces, cuando queremos comparar
múltiples valores para un campo, entonces usamos dólar en operador. Entonces en el lugar del dólar LT, usamos dólar en. En el lugar de valor, pasamos array de
valores, 18, 20, 30. Tan simple como eso, guarda los
cambios y echa un vistazo. Ver, aquí conseguimos usuario con 20
años porque pasamos
20 en esta matriz. Ahora dólar NN es
lo opuesto al dólar en. Yo lo llamo un interior, que significa usuarios de parches cuya
edad no es de 18, 20 o 30. Guarde los cambios, y vea, aquí obtenemos usuario con diez años de edad. Entonces así es como pasamos
los operadores de comparación en Mongo DV. Solo recuerda en condiciones
regulares, pasamos aquí llenar con valores, pero para operadores de comparación, pasamos aquí llenar con objeto, y dentro de este objeto, agregamos nuestro operador de comparación.
67. Operadores lógicos en MongoDB: Veamos operadores lógicos. Por lo que los operadores lógicos nos
permiten combinar múltiples
condiciones en nuestra consulta. En palabras simples, nos
ayudan a pedir más complejos de la
base de datos. No te preocupes. Solo hay pocos operadores
lógicos, y también son simples
como operadores de comparación. primer operador lógico
es dólar R. Utiremos operador cuando tengamos múltiples
condiciones y queramos, si alguna condición es verdadera, entonces devolveremos esos datos. Ejemplo, queremos
buscar usuarios que tengan
30 años de edad o
que tengan el nombre Halley En este caso, queremos que cualquier
condición sea cierta, y por eso usamos
aquí u operador. Déjame mostrarte
eso prácticamente. Comento este
código anterior y escribo costo usuarios es igual a esperar usuario punto Find. Y en este
método find, pasamos Object, y en ese objeto, simplemente
agregamos
dólar u operador. Ahora se podría pensar en un operador de
comparación en el lugar de valor, pero estamos usando el operador
lógico en el lugar de la condición. Déjame darte mi
triga para recordarlo. Como sabemos, siempre
comparamos valores, y por eso tenemos que escribir operador de
comparación en
el lugar de valor. Pero implementamos
operadores lógicos para condiciones, y por eso tenemos que escribir operador
lógico en el
lugar de las condiciones. Cuando empecé Mongo Deb lo
recuerdo de esta manera. Como sabemos, queremos agregar aquí múltiples condiciones y lo que usamos para múltiples condiciones, usaremos array. Ahora dentro de esta matriz, agregamos nuestras condiciones
en objeto individual. Entonces objetar edad a 30 o pasamos
otro nombre de condición H. Si alguna condición es verdadera, entonces obtenemos esos datos de usuario. Los cambios y echar un vistazo. Ver, aquí obtenemos el usuario Halley porque su
nombre es Halley Esta edad del usuario es la misma que nuestra condición o no.
No importa. Si alguna condición está engranada, entonces obtenemos esos datos Tan simple como eso. Ahora
supongamos que queremos para nuestra consulta. Estas dos condiciones
deben ser ciertas, lo que significa que la edad del usuario debe 30 y también el nombre
debe ser Halley En esta situación, donde
queremos todas las condiciones
deben ser ciertas. Usaremos operador final. Entonces en el lugar
de este operador, pasamos y operador. Ahora bien, ¿puedes adivinar la salida? Bien, no obtenemos nada
porque no tenemos datos donde la edad es 30
y el nombre es h Ver, aquí obtenemos matriz vacía. Ahora déjame mostrarte la
forma de atajo para escribir esto y operador. Cuando queremos que estas todas
las condiciones deben ser ciertas, ya escribimos la misma consulta al inicio
del tema de consulta. Podemos pasar directamente esas condiciones en el método
find así. Estos dos funcionan igual. Pero cuando queremos
usar operator, entonces tenemos que
seguir esta sintaxis. Ahora, después del operador de fin de dólar, tenemos otro
operador lógico que es dólar NR, o llamamos como NR lógico. Por ejemplo, queremos
encontrar usuarios que no tengan 30 años y
no tengan el nombre Harley, que significa que ambas condiciones
deben ser falsas Para eso, en el lugar
de este operador final, pasamos operador NR. Los cambios y ver, aquí obtenemos datos con nombre Dios bendiga porque para estos datos, ambas condiciones son falsas, y por eso obtenemos estos datos. Pero para nuestros segundos datos de usuario, esta condición de nombre es cierta, así que no obtenemos esos
datos tan simples como eso. Ahora el último operador lógico que
tenemos es dólar nada
o nuez lógica Este operador de nudo lógico es
poco diferente porque
solo usamos no operador con operadores de
comparación y expresiones
regulares. No te preocupes por la expresión
regular. Eso lo veremos en
la siguiente lección. Por ahora, veamos, operador de
dólar nada. Supongamos que queremos encontrar usuarios cuya edad
no sea igual a 30. Nuevamente, comento esta
sintaxis y escribo de nuevo, costo usuario es igual a
awight user dot find Objeto, y primero, agregamos relleno para lo que
queremos agregar condición, que es H. Ahora en
el lugar de valor, pasamos objeto con
operador dólar nu. Escribimos operador de nuez de dólar en el lugar de valor porque operador
dólar nada está directamente relacionado con el valor no
con condiciones Ahora lo que queremos es que la edad
no sea igual a 30, tenemos edad y tampoco nada, pero no tenemos
iguales y valor Agregamos otro objeto
con operador de dólar, lo que significa igual y
simplemente pasamos aquí valor 30 Guarda los cambios
y echa un vistazo. Ver, aquí obtenemos ambos usuarios porque ambos edad
no es igual a 30. Se puede ver que es realmente sencillo. Déjame mostrarte una vez más. En el operador de comparación, estamos escribiendo así. Columna de edad, dólar igual
o mayor
o menor que cualquier operador queramos utilizar a su valor. Ahora aquí, solo queremos
agregar no operador, simplemente
envolvemos este objeto
con otro objeto y agregamos aquí operador de dólar nada
y dos puntos simples como eso Sé que esto es un
poco confuso, pero no te preocupes si no recuerdas la sintaxis
de los operadores, te
voy a dar mi cheatsheet
al final de esta sección para que puedas usarla cuando
trabajemos en proyectos
del mundo real Eso es todo acerca de los operadores
lógicos. Si estás continuamente
viendo el curso, entonces puedes tomar un pequeño
descanso de tu pantalla, escuchar algo de música o
dar un nuevo paseo. Nos vemos en la siguiente lección.
68. Expresión regular en MongoDB: Ahora veamos sobre las expresiones
regulares. ¿Qué es la expresión regular? Una expresión regular es una forma definir
patrones de búsqueda para cadenas. Por ejemplo, queremos encontrar todos los usuarios cuyos nombres
comiencen con edge o
queremos buscar todos
los usuarios cuyo correo electrónico tenga gmail.com al
final de En estos casos, usaremos expresiones
regulares o algunos
desarrolladores lo llamaron jx Es realmente útil en de sugerencias de auto
o consulta de búsqueda. Déjame mostrarte prácticamente. Aquí comento
esta consulta anterior. Además, elimine consultas antiguas
y escriba una nueva consulta Cast usuarios iguales a
esperar usuario dot find. Aquí, pasamos objeto, y sobre qué propiedad queremos
aplicar patrón de búsqueda. Probemos nombre. Ahora en
el lugar de valor, pasamos la expresión regular. Aquí está la sintaxis de
la expresión regular. Barra diagonal con patrón de corte. Entonces basándonos en este patrón, vamos a hacer muchas cosas. Supongamos que queremos
encontrar todos los datos de los usuarios cuyo nombre comience con Así en
el lugar de este patrón, usamos el símbolo de Kerat, lo que significa comenzar con, y aquí pasamos CpTalh Esta consulta encontrara a todos
los usuarios cuyo nombre comience con mayúscula así que si queremos encontrar usuarios cuyo nombre
termine con alguna letra, entonces duplico esta
línea y en el lugar de este quilate, escribimos dólar. Este dólar significa terminar con. Por lo que esta consulta devolverá todos los
datos cuyo nombre termine con U. Ahora déjame
darte una pequeña tarea. Queremos encontrar usuarios cuyo
correo electrónico termine con gmail.com. Es realmente simple. Cambiamos este nombre de relleno a correo electrónico y simplemente en
el lugar de este, escribimos gmail.com dólar A ver obtenemos
los resultados o no. ver si los cambios, y C obtenemos ambos usuarios porque
ambos tienen gmail.com Ahora déjame mostrarte
algo genial. En la Brújula Mongo Di B, cambio el correo electrónico del segundo usuario
en el lugar de gmail.com Escribo Gmail, com. Guarde esto, y veamos
qué obtenemos. Guarde este archivo. Y mira aquí conseguimos, de
nuevo, ambos usuarios. Podrías preguntar, aunque este correo electrónico no
termine con gmail.com, por qué seguimos
obteniendo estos datos de usuario ¿Qué tiene de malo nuestra expresión
regular? En expresión regular, este periodo puede
coincidir con cualquier carácter, lo que significa que JavaScript lo
emparejará con cualquier carácter. Y es por eso que si pasamos algún carácter en el lugar de este periodo, obtenemos esos datos. Ahora podríamos preguntar, ¿y si
queremos comparar
periodo como periodo? No como cualquier personaje. Es realmente simple. Justo antes del periodo, usaremos slash hacia atrás Ahora, JavaScript comparará
este periodo como periodo, no como cualquier carácter. Guarde los cambios y vea, aquí obtenemos solo el primer usuario. También este patrón
distingue entre mayúsculas y minúsculas. Yo cualquier usuario tengo correo electrónico en
mayúsculas como gmail.com, entonces no vamos a conseguir
ese usuario en Entonces, para eliminar mayúsculas y minúsculas, solo
tenemos
que agregar I al final de nuestra expresión
regular. Ahora bien, ¿y si queremos encontrar usuarios cuyo correo electrónico
contenga Harley? No empezar con Halle
o termina con Halley. Harley puede estar en cualquier lugar. Entonces en este caso,
simplemente escribimos nuestra palabra en el lugar del patrón sin
agregar buharrón o dólar Entonces, si queremos encontrar
usuarios con palabra exacta, digamos desarrollador
en la descripción, no parte de otra
palabra como desarrollador, queremos solo desarrollador. En este caso, escribimos
patrón así. Aquí en el lugar de este
patrón, escribimos esa palabra, que es reveladora y
antes y después de esa palabra, agregamos hacia atrás B, hacia atrás B, que representa
el límite de esa palabra. Estas son algunas expresiones regulares comunes y
útiles. Si quieres
aprender más patrones de expresiones regulares, entonces puedes usar este
artículo y leer sobre otros patrones
porque es JavaScript puro. Además, en la versión actual de
Mangodib, pocos desarrolladores utilizan
dólar RejxOperator en el lugar de agregar Esto funciona igual. A mí me gusta esta versión de Sater, pero también puedes usar
este Rjxoperator Depende totalmente de ti.
69. Contar y estimar el número de documentos: Supongamos que queremos
contar el número de documentos disponibles en la colección de
nuestro usuario. Duplico esta consulta y
comento consulta anterior. Ahora cuando solo queremos contar
el número de documentos, entonces en el lugar de
este método fino, pasamos el método de contar Documentos. Esta consulta funciona
igual que antes. Obtenemos una serie de
datos en salida. En el método Count documents, pasamos nuestras condiciones o
también pasamos operadores lógicos, operadores comparación, expresiones
regulares, igual que método find. El método Find devuelve
los datos reales, donde el método Count documents devolverá el
número de documento. Comprobemos esto. Ver los
cambios y echar un vistazo. C, aquí obtenemos cero porque no hay datos
para esta condición. Ahora a veces no queremos
agregar ninguna condición, solo queremos
contar total de documentos. En ese momento, podemos
eliminar este objeto, guardarlos y ver, aquí obtenemos el
número total de datos de usuarios. Ahora, actualmente, nuestros
datos son muy pequeños. Imagina que queremos
contar el número de productos para grandes aplicaciones de
comercio electrónico. Desea mostrar el número
total de productos disponibles en la plataforma
en el panel de administración. En ese momento, no necesitamos el ext count que muestre el número
total de productos. Ahora, en ese momento, podemos utilizar otro método para contar el número estimado
de documentos, que es el recuento estimado de
documentos. Como su nombre indica, se
trata de un recuento estimado. Igual que los documentos de conteo, podemos pasar este método de conteo estimado de
documentos justo después del nombre del modelo. Ahora podría preguntarse, ¿cuál es la diferencia
entre estos dos? El primero es contar documentos
devuelve el número exacto, pero el conteo estimado
muestra un conteo aproximado. Otra diferencia
es que podemos pasar condiciones o filtros en
el método de contar documentos. Pero en el método estimado de conteo de
documentos, no
podemos pasar ninguna condición. Solo puede contar colección
completa. Por lo tanto, el recuento de documentos es poco lento que
el recuento estimado de documentos. Entonces, para resumir, usamos documentos de
conteo cuando
necesitamos aplicar filtros o
queremos obtener el conteo de salida Y al otro lado, utilizamos el
recuento estimado de documentos cuando necesitamos una estimación rápida y aproximada
del número total de
documentos en la colección.
70. Paginación y consulta infinita: Veamos cómo podemos crear
paginación o consulta infinita. Antes de ver la consulta, es mejor que entendamos
cómo funciona la paginación y el desplazamiento
infinito Supongamos que estamos trabajando en una
gran aplicación de comercio electrónico. En esta aplicación,
podríamos tener 1,000 o 10,000
productos como Amazon. Ahora en ese momento, obtenemos todos los productos detallados
en una sola llamada API. Tomará más tiempo y también aumentará
la carga en nuestro
servidor. Entonces, en lugar de
obtener todos los datos en una
sola solicitud como desarrollador de Bond, podemos dividirlos
en páginas como si
obtuviéramos solo ocho o diez
datos en una sola solicitud. Si el usuario necesita más datos, entonces obtenemos los siguientes diez datos No te preocupes por cómo
vamos a crear esta API. Por ahora, solo entiende
cómo funciona la paginación y el desplazamiento
infinito Aquí está el
ejemplo front-end de paginación. En la primera página, solo tenemos
ocho datos después de eso, cuando hacemos clic en el botón de la
segunda página, obtendremos los siguientes ocho
datos. Tan simple como eso. Déjame mostrarte también ejemplo de desplazamiento
infinito. Aquí tenemos ocho datos, y cuando lleguemos
al fondo de la página, cargará otros ocho
datos desde el back-end. Ves, esto es genial. Ahora solo piensa en el lenguaje
humano, lo que está pasando aquí. No te preocupes por el código. Solo piensa en lo que está pasando. La paginación y el desplazamiento infinito
funcionan casi igual. En ambas técnicas,
obtendremos
datos en pequeña
cantidad según lo necesitemos Solo en desplazamiento infinito, conservamos nuestros datos anteriores En donde la paginación, vamos a
sustituir los datos anteriores. Pero back end para las dos
técnicas se mantendrá igual. Déjame explicarte con
20 registros ejemplo. Se trata de 20 registros a la vez, queremos mostrar
sólo cuatro discos. Podemos definir
página variable por datos a cuatro. Obtenemos cuatro registros de aquí y podemos
marcarlo como página uno. Ahora bien, si los usuarios se desplazan o
incluso se mueven a la segunda página, entonces saltaremos los datos de
esta página uno, lo que significa que saltamos por página cuatro datos y luego buscaremos
otros cuatro registros de aquí A continuación, cuando el usuario vuelva a desplazarse
o pasar a la tercera página, entonces omitiremos los datos de la página
uno y la página dos. Matemáticamente,
saltaremos la página actual, que es tres menos
uno en los datos por página, lo que significa que dos en
cuatro es igual a ocho Nos saltamos los primeros ocho datos
y recuperamos otros cuatro, que son datos por página Cada vez que aumentemos
nuestro número de página, saltaremos la
página actual menos una en los datos
por página y obtendremos otros datos, que es el
número de datos por página Dime cuántos
saltaremos cuando pasemos
a la cuarta página. Bien, saltaremos
cuatro menos uno, que es tres en
cuatro, que es 12. Nos saltamos los primeros 12 registros
y obtenemos otros cuatro
datos. Tan simple como eso. En Mongoose,
tenemos el método skip, que hemos visto anteriormente, y también tenemos límite para
solo fetch y número de datos Entonces aquí eliminamos esta consulta porque
puede crear confusión. Ahora escribimos const
usuarios iguales a esperar usuario punto Encuentra aquí no
queremos pasar ninguna condición Ahora, después del método fino, nos adherimos al método Skip, y dentro de este, tenemos que pasar cuántos
datos queremos omitir. Por ahora, pasamos directamente cero porque para la primera página, queremos saltarnos cero datos. Después de eso, ¿cuántos datos
queremos en nuestra única página? Bien, queremos
enviar cuatro datos. Entonces agregamos aquí otro método llamado limit y pasamos aquí cuatro. Esta consulta funciona para la página uno. Ahora hagamos que esta consulta
funcione para cada página. Entonces, cuando busques una página
a dos y llamas a esta API, simplemente
saltaremos los
primeros cuatro datos Y para eso, creamos
fórmula en nuestro ejemplo. Entonces en la parte superior,
definimos variable. La página actual es
igual a decir dos. Y después de eso, otra variable llamada por datos de página
es igual a cuatro. Actualmente, como podemos ver, codificamos duro estos valores. Pero en el mundo real, estos valores son pasados por el front end. Y ¿sabes por qué
front-end mandan estos datos? ¿Alguna conjetura? Derecha, front end enviará estos datos
usando parámetros de consulta. Supongamos que nuestra
API de productos se ve así, slash API slash
products, signo de interrogación, página
actual es igual a dos, y por página los datos son
iguales a cuatro o diez, cualquier cosa que nuestro desarrollador
front-end quiera Pero por ahora, no quiero
agregar esta complejidad. Es por eso que codificamos duro
estos valores aquí. Ahora en este método kip,
pasamos paréntesis, página
actual menos uno
en datos por página Y en el límite,
lo que vamos a pasar, derecho, pasamos por
página datos y hecho. Déjame guardar esto para que
podamos ver esto con claridad. Genial. Ahora bien, si
revisamos nuestro terminal, obtenemos bandeja porque
en nuestra base de datos, no
tenemos
más de cuatro datos, así que no obtenemos
datos por página dos. Si cambiamos la página
actual a una, guarda esta y mira
aquí llegamos a los datos. Creamos consulta para paginación
y desplazamiento infinito. Esta única consulta
funcionará para ambas funciones. Espero explicar bien esto. Si aún tienes confusión, entonces trata de poner diferentes
valores en estas variables. Apuesto a que entenderás esto.
71. Actualiza los datos: Ahora veamos cómo podemos
actualizar los datos en Mongo DB. Entonces hay dos
formas de actualizar los datos. En primer método, primero
encontraremos el documento que
queremos actualizar. Después de eso, modificamos su propiedad, y por fin, guardamos los datos
actualizados en nuestra base de datos. Y segundo método es,
usaremos métodos de actualización de mangos y actualizaremos directamente
el documento en la base Después de eso, tenemos
la opción de devolver datos
actualizados
dependiendo de nuestras necesidades. Ahora, ¿qué opinas
qué método es rápido? Ahora bien, ¿qué opinas
qué método es útil? Sí, el segundo método es más útil porque en
el primer método, tenemos que hacer múltiples pasos, lo que podría llevar
poco tiempo. Pero en el segundo método, usaremos métodos
definidos por los mangos, por lo que no necesitamos preocuparnos por
actualizar los datos por los nuestros propios Además, utilizaremos el primer método de
acuerdo a nuestras necesidades. Ahora hay cuatro métodos para actualizar el documento.
No te preocupes. Cada método es muy
sencillo y fácil. Déjame mostrarte eso. Aquí
abro el proyecto demo MongoDB Y aquí, supongamos que
queremos actualizar nuestro ID de correo electrónico de usuario cuyo
nombre es código bendiga. Así que creamos aquí una
función sing llamada Update User. Y dentro de esta función, escribiremos nuestra lógica de actualización. Entonces para Update,
usamos user Module dot. Aquí tenemos Actualizar un método. Ahora, igual que el método fine, podemos pasar aquí objeto de
consulta en el que vamos a aplicar filtros o
podemos decir condición. Entonces, ¿cuál es la condición aquí? El nombre de usuario debe ser código plus. Entonces hemos declarado qué
usuario queremos actualizar. Ahora solo tenemos que pasar qué propiedad
queremos cambiar. Entonces para eso, pasamos otro objeto en el
segundo parámetro, y dentro de este, tenemos operador de conjunto de
dólares
y pasamos a objeto. Ahora en este objeto, especificaremos qué propiedad queremos cambiar con
su valor actualizado. Por lo que queremos cambiar el correo electrónico a actualizado en el gmail.com rojo Así podemos adherir
múltiples propiedades. Pero por ahora, solo
queremos cambiar el correo electrónico. Ahora, como sabemos, esta
expresión es tarea de Asnruners. Para que podamos adherirnos esperar. Déjame ahorrar para que
podamos ver correctamente. Bueno. Ahora bien, esta expresión no devolverá el objeto
actualizado. Veamos qué tenemos aquí. Así que lo almacenamos en la
variable llamada resultado, y simplemente en la parte inferior, consola dot log este resultado. También en el lugar de
esta función de usuario de Gate, llamamos a la función Actualizar usuario. Ahora, antes de guardar los cambios, asegúrese de detener
la aplicación. Ahora guarda los cambios
y echa un vistazo. Ejecute esta aplicación
usando node index dot js. Ver, aquí no obtenemos datos de usuario
actualizados, pero obtenemos alguna
información básica sobre ddt task Verifiquemos cómo
se actualizan los datos en la
base de datos o no. Así que Pamongo sea
brújula y vea aquí nuestro correo electrónico se cambia
a updated@gmail.com Entonces así es como
actualizamos los datos. Al principio, pasamos
objeto de consulta con condiciones, y en el segundo argumento, pasamos operador de conjunto de dólares, y pasamos objeto con propiedades y valores
actualizados. Tan simple como eso. Pero
también hay que tener en cuenta que esta actualización un método
sólo actualizará un documento, no todos los documentos que
cumplan con esta condición. En ocasiones también queremos
obtener el documento actualizado. No te preocupes,
es realmente sencillo. En el lugar de actualización uno, pasaremos buscar
uno y actualizar. Esto devolverá el
documento antiguo antes de que estemos actualizando. Pero aquí queremos obtener
el documento actualizado. Olvidando el
documento actualizado, pasamos aquí, tercer objeto, y en eso
pasamos nuevo a verdadero. También, como buena práctica, pasaremos otra
opción aquí, que es ejecutar validadores a True Ahora podría preguntarse ¿qué
es ejecutar validadores? No es nada que
le estemos diciendo a nuestra consulta para asegurar que estos valores actualizados deben seguir el esquema del modelo. Además, permítame cambiar este
valor de correo electrónico a blessthergml.com. Los cambios y echar un vistazo. Volvamos a ejecutar esta
aplicación. Ver ahora obtenemos aquí valor
actualizado. Así es como podemos
actualizar los valores usando update one y find
one and update method. Ambos son muy similares. Actualiza uno, no
devuelvas el documento actualizado. Donde usando find one y update, obtenemos el documento actualizado, pero estos dos solo
actualizan un documento. Ahora déjame darte
una pequeña tarea aquí. Queremos actualizar el nombre
del usuario cuyo ID es este. ¿Se puede escribir la consulta?
Es realmente simple. Aquí en el objeto de consulta
en el lugar de nombre, pasamos subrayado ID, y pasamos aquí nuestro ID de
usuario en cadena Puedes copiar tu ID de usuario
de Mongo DB Compass y también cambiar este valor de correo electrónico
a XYZ en achmail.com Guarda los cambios
y echa un vistazo. Ejecute esta aplicación. Consulta aquí obtenemos el documento actualizado. Encantadora. Entonces esto es muy sencillo. Muchas veces, queremos
encontrar nuestro documento solo en base a su
identificación única como lo hicimos actualmente. No queremos pasar ninguna
otra condición porque este ID es único y
no tiene sentido pasar
otras condiciones. Cuando queremos
actualizar los datos usando su ID en el lugar de
buscar uno y actualizar el método, tenemos otro método de acceso directo, que es buscar por ID y actualizar. Ahora aquí no necesitamos
pasar este objeto de consulta. En el lugar de eso, pasamos
directamente nuestro ID en cadena. Los cambios y echar un vistazo. Ejecute esta aplicación. Ver,
nuevamente obtenemos documento actualizado. Entonces cuando queramos
encontrar usuario por su ID, usaremos bien
por ID y actualizaremos. Ahora hemos visto estos
tres métodos de actualización. Actualice uno, busque uno y actualice, y busque
por ID y actualice. Si nota, todos estos métodos actualizan solo documento único
que encontraron primero. Dos, actualizar uno y encontrar uno y actualizar sus nombres están mostrando que sólo están
actualizando un documento. Y si hablamos de
multa por ID y actualizamos, lo que estamos pasando
aquí como condición, pasamos ID único, lo
que significa que también actualizará solo registro único
cuyo ID es este. Pero, ¿y si queremos
actualizar varios documentos? Para ello, tenemos cuarto
método de actualización, que es actualizar muchos. En el lugar de esta
multa por identificación y actualización, agregamos actualizar muchos. Entonces aquí tenemos que volver a pasar su objeto de consulta en el que
vamos a definir condiciones. Entonces pasas tu edad a 20. Entonces aquí estamos diciendo
actualizar nuestros registros cuya edad es 20 y actualizar
su correo electrónico a este valor. Déjame cambiar este
valor de correo electrónico como hegmil.com. No necesitamos este
tercer argumento, que son opciones porque
esto solo funcionará para uno fino y actualizará
y buscará por ID y actualización. Ver los cambios, y vamos a
ejecutar esta aplicación. Ver, de nuevo, no
obtenemos documento actualizado, pero si revisamos nuestra base de datos, nuestro valor se actualiza. Entonces, para resumir rápidamente, tenemos cuatro métodos para
actualizar datos en Mongo DB Actualizar uno para actualizar
un solo documento, actualizar muchos para actualizar
varios documentos, buscar uno y actualizar para encontrar y actualizar un solo
documento en un solo paso, último, buscar por ID y actualizar para encontrar un documento
por ID y actualizarlo. Además, en find one y update, y find by ID y
update method, pasamos Option object en que estableceremos new
a true para obtener nuevos datos actualizados también
ejecutamos validadores a true para seguir el esquema del modelo para valores actualizados.
Tan simple como eso.
72. Actualiza operadores en MongoDB: Ahora hablemos de operadores de
actualización. Los operadores de actualización se utilizan para modificar documentos durante
una operación de actualización. En palabras simples, los operadores de
actualización nos
permiten actualizar rellenos
específicos, incrementar valores, establecer nuevos datos, eliminar rellenos y mucho más Déjame decirte algo. Ya usamos un operador de
actualización, que es un conjunto de dólares, pero tenemos muchos otros operadores de
actualización. Así que dirígete al navegador y escribe operadores de actualización
en Mongo DB Abre este primer enlace, y aquí podemos ver
que tenemos operadores de actualización como fecha actual del
dólar para establecer el valor del llenado
a la fecha actual. Tinta dólar para incrementar el valor del relleno
por cantidad específica Supongamos que alguien como el post, así podemos usar operador de tinta
dólar para incrementar el
valor del relleno. También en el operador de tinta, podemos pasar valores negativos
que pueden disminuir el conteo. A continuación tenemos media, max, ML para multiplicar, renombrar, set, set on insert, set for remove the
field from the document También en la parte inferior, tenemos operadores para array, pull, push, pull all, etcétera No te preocupes por
estos operadores. Utilizaremos muchos de ellos
en nuestros futuros proyectos. Por ahora, solo quiero
presentarles a estos operadores de
actualización. En la siguiente lección,
veremos ¿cómo podemos eliminar documento
de MongoDB
73. Eliminar los datos: Ahora veamos cómo podemos eliminar
datos de la Div Mongo. Es muy similar a
actualizar los datos. Tenemos cuatro métodos
para eliminar los datos. Eliminar uno, eliminar muchos, buscar uno y eliminar, y el último, buscar
por ID y eliminar. Ahora entiendes por qué me tomo más tiempo para explicar los métodos de
actualización. Son muy similares
a los métodos de eliminación. Veamos rápidamente
estos métodos de eliminación. Aquí, creamos una nueva
función ASN llamada delete user. Ahora dentro de esto, usamos user dot Delete one y lo
que pasaremos en este método. Simplemente pasamos objeto de consulta porque aquí solo queremos
eliminar el documento. No necesitamos especificar
qué queremos actualizar,
podemos pasar algo como este ID de ascore a algún ID de usuario, que copié de
la brújula Mongo Dib Esto eliminará a este
único usuario con su ID. Ahora podemos adherirnos a esperar, igual que antes, y simplemente
almacenar su resultado invariable Este resultado es el objeto
con propiedad de eliminación. No llegamos aquí documento. Ahora, déjame preguntarte una cosa. ¿Y si queremos obtener este documento eliminado
en el resultado? ¿Qué método usaremos? Podemos usar aquí, encontrar
uno y eliminar. Y aquí, no necesitamos
cambiar nada. Así que en el lugar del método fine
one y delete, podemos usar fine by ID
y delete método. Pero cuando usamos fine
by ID y delete, no
necesitamos pasar aquí
objeto con propiedad ID. Podemos pasar directamente así. No quiero pedir
prestado mostrando estos métodos porque
son casi los mismos, ¿verdad Imagina que queremos
eliminar a todos los usuarios cuya edad sea mayor 15 y
tampoco estén verificados. Es realmente simple. Usamos aquí, eliminamos muchos métodos, y en las blas de este ID, pasamos objeto de consulta,
y dentro de él, edad debe ser mayor que 15 Y otra propiedad
se verifica a falsa. Ahora vamos a la consola
dot registrar este resultado. Y en el lugar de llamar a
Update user function, llamamos función de usuario eliminada. Guarde los cambios y
ejecutemos esta aplicación. Ver, aquí obtenemos
borrado contar a uno porque sólo un documento está cumpliendo con esta condición. Y si revisamos nuestra base de datos, pues veremos que tenemos
sólo un documento. Entonces eso es todo acerca de la operación de
eliminación. Es realmente sencillo
que actualizar los datos.
74. Ejercicio 01: configuración de MongoDB: Ahora es momento de hacer ejercicio, puedes practicar por tu cuenta lo que hayas
aprendido en esta sección. Abre nuestro primer proyecto, Tarea track, que dejamos
en la Sección cinco. Podemos practicar en ese proyecto. Si no tienes código de proyecto
anterior, no te
preocupes, puedes
descargarlo desde abajo de esta lección. Ahora diseño este ejercicio para que pases por varios
pasos de Mongo DB En primer lugar, paso uno, quiero que conectes este proyecto uno con la base de datos
Mongo DB Puedes darle a esta base de datos nombre, pista de
tareas o cualquier cosa. Después de conectarse con éxito
a la base de datos en el paso dos, debe crear un
esquema para almacenar Tudus. En tu proyecto,
crea una nueva carpeta llamada models y
dentro de esa carpeta, crea un nuevo archivo
llamado Tudus dot js En ese archivo, hay que
definir esquema y modelo para la colección de Tudos
separados de nuestro otro código, y los rellenos deberían ser así Primero, tuvimos tarea en la que
vamos a definir el
texto para ese Tudó Asegúrate de que este relleno
sea obligatorio. El siguiente llenado que tenemos es estado, que puede ser Tudó haciendo o hecho Tienes que pensar qué
tipo de campo quieres usar. Además, el valor por defecto de
este campo debería ser hacer. Ahora, el último campo es el texto, que es el área de
valores en la que
podemos agregar
textos de lenguaje relacionados como SDML, CSS, JavaScript, react, node, etcétera, y eso
es todo para este esquema Ahora el paso número tres,
basado en este esquema, tiene que definir un modelo
para la colección de Tudou Sencillo. Sé que puedes hacer esto. También agrego esta
instrucción de ejercicio PDF a continuación de esta lección. Además, no te preocupes si no recuerdas los
métodos de Mongo DB Puedes usar el
resumen PDF que agregué al final
de esta sección. El objetivo de este
ejercicio es
pasar por el proceso de
los pasos de Mongo DB Así que dale tu 100% y
luego mira la solución. Espero que resuelvas este
ejercicio o intentes
resolver este ejercicio y te quedes atascado en uno de estos pasos. No te preocupes, al menos
intentas resolverlo. Así que date
crédito por eso. Ahora veamos la solución. primer lugar, en nuestro proyecto, tenemos que instalar
mangos porque sin Ted no podemos
hacer otras cosas Por lo que NPM instala mangos
en el rojo 8.8 0.0. Dios. Vamos a minimizar
esta terminal. Ahora en nuestro
archivo JS de punto índice, en la parte superior, ingresamos const mangos es
igual a requerir Y después de esta ruta de Studos, escribimos mangos punto Connect En el primer argumento, pasamos un anillo sobrante, que es Mongo DV colon doble slash
delantero, Anfitrión local Columna 27017 corte diagonal, y aquí
escribimos el nombre de nuestra base de datos, que es TAS TAG Ahora, como sabemos, esta
expresión devuelve una promesa. Entonces usamosart entonces método
y dentro de él simplemente
consultamos dot log Mongo DB se conectó correctamente. Ahora bien, ¿y si
obtenemos error en esto? Así que también agregamos método de caché. Aquí, obtenemos el objeto de error, función de
error y el registro de puntos de la
consola. Conexión MongoDB llena. E imprima este error. Entonces el paso número uno está hecho. Ahora paso número dos, tenemos que
definir esquema para tarea. Así que creamos una nueva carpeta en
nuestro proyecto llamada models. Y dentro de esta carpeta, creamos un nuevo archivo
llamado todos dot js. Ahora podría preguntarse ¿por qué
tenemos que crear un nuevo archivo? No podemos definirlo en
nuestro archivo index dot js. Sí, podemos definir el esquema y los modelos en el archivo JS de punto índice. Pero imagina que nuestro proyecto
tiene cinco modelos diferentes. Piensa en lo desordenado que se vuelve nuestro
código, agregamos cinco esquemas y
modelos diferentes en nuestro archivo JS de punto índice Esta es la práctica del mundo real. Vamos a definir todos los modelos y sus esquemas en la
carpeta separada, que es modelos Y sea cual sea el modelo que
queramos crear, le damos su nombre al archivo. En este caso,
es Tudos dot js. Aquí primero importamos Cs mangos es igual
a requerir mangos Después de eso, creamos un
nuevo esquema de puntos de Mongoose, y dentro de este, pasamos
nuestros rellenos en objeto La primera es tarea, y la configuramos en cadena. Pero también, queremos que
este llenado sea obligatorio. Entonces en el lugar de esta cadena, pasamos diferentes
propiedades en objeto. Digamos tipo a cadena
y requerido a true. A continuación tenemos estadísticas para objetar, nuevamente, escriba dos cadenas. Y aquí queremos
dar los valores de campo. Así que escribimos la
propiedad Enum a array, y aquí pasamos los valores Primero uno es hacer entonces
podríamos tener haciendo, y luego escribimos hecho. Entonces, si tratamos de ingresar
algún cuarto valor, entonces estos valores, entonces
eso no va a funcionar. Además, queremos dar
su valor por defecto, así que default y
lo configuramos a todo. Bueno. Ahora siguiente, tenemos texto, que es array de cadena. Podemos pasar directamente aquí
array y dentro de ella, pasamos string Done. Nuestro esquema está listo. Vamos a almacenarlo en una variable
llamada esquema Tds. Pasemos al tercer paso. ¿Recuerdas cómo
podemos definir el modelo? Utilizamos el modelo de punto de mangos. Aquí, primero pasamos el
nombre singular de nuestra colección, que es Todo, que
se convertirá en colección Todos. En el segundo argumento,
pasamos esquema Todos. Ahora esto devolverá
el modelo todo. Vamos a almacenarlo en
variable llamada todo. Asegúrate de usar
tu caso pascal porque este todos funciona
como clase JavaScript. Terminamos nuestro primer ejercicio. En la siguiente lección,
vamos a avanzar poco.
75. Ejercicio 02: para almacenar datos: Ahora pasemos al segundo
ejercicio en el que
recordaremos sobre la inserción de
datos en Mango Div. Entonces aquí está el ejercicio
a Instrucción PDF. También puedes
descargarla desde el lado derecho. Además, agregué un archivo JSON en el que agregué ocho
registros para Todos. Ahora en este proyecto, ya
tenemos API
para crear nuevo todo. Pero en esta API, simplemente estamos empujando nuevos datos a
nuestra matriz local. En lugar de eso, queremos
almacenar datos en nuestra colección
de todos. Déjame darte
aquí una pequeña pista. Podemos hacer cualquier cosa en la
colección usando el modelo. Tienes que obtener el modelo de la carpeta de
modelos y usarlo aquí. Aquí tienes una pequeña demostración para ti. Cuando enviemos una solicitud post API con este objeto JSON,
en el back end, almacenaremos esos datos en nuestra base de datos y devolveremos los datos
almacenados en la respuesta. Ya lo hicimos
en esta sección. También puedes usar ese código de
sección actual como referencia. Intenta resolver esto y
luego mira la solución. Entonces espero que lo resuelvas
o intentes resolverlo. Ahora veamos la solución. En primer lugar, tenemos que insertar registros en nuestra colección todos. Pero sabemos que estamos haciendo
cualquier cosa con la colección, necesitamos ese modelo. ¿Cómo podemos obtener el modelo Tud
aquí en este archivo de rutas Tu Dos? aquí en este archivo de rutas Tu Dos Bien, tenemos que exportar nuestro
modelo de Tudos Modelo cinco. Entonces escribimos aquí,
módulo punto Exportaciones es igual a este modelo Tud Esto exportará este
modelo Tud como predeterminado. Guarde esto. En el TudoSrout en la parte superior, importamos Const Todo es igual a requerir ahora actualmente
estamos en la carpeta rutas,
y queremos acceder a la carpeta y queremos acceder a Así que tenemos que volver
a nuestra carpeta usando modelos de
doble punto hacia adelante slash, y dentro de este archivo
todos dot js Bueno. Entonces tenemos el
modelo Todo en este archivo. Ahora vamos a almacenar rápidamente esos datos de
Todos dentro de la recolección. Entonces pasamos a la solicitud de post, que creamos para agregar new hacer dentro de nuestro array local. En primer lugar, podemos comentar este método Tudos array
dot push, y en el lugar de esto, podemos escribir Nu para hacer Y aquí nos
desmayamos para hacer objeto. La primera propiedad es tarea, y ¿cómo podemos conseguir la tarea? Justo en la parte superior, obtenemos el cuerpo de la solicitud y lo
almacenamos en la variable do. Entonces en la parte inferior,
escribimos para hacer punto Tarea. A continuación, tenemos status, que nuevamente obtenemos del estado de punto de Tudos y también
etiquetas a etiquetas de punto Todo Aquí no estamos agregando ID porque se
generará automáticamente por MongoDB Anteriormente, en esta sección, usamos aquí valor codificado duro, pero aquí estamos usando valores que obtenemos
en el cuerpo de la solicitud. Tan simple como eso. Ahora,
esto devolverá un objeto New to do
y para guardarlo, escribimos aquí Nut dot save. Como ya sabemos, esta
es tarea de corredores asíncronos. Por eso usamos aquí lejos. Pero mira aquí estamos
obteniendo error de tiempo de ejecución. Para usar Avid, tenemos que
hacer nuestra función asíncrona. Pero cómo es así que aquí en esta API, nuestra función es esta iniciada a partir de la solicitud y respuesta
a este soporte CR. Ahora para hacer esta función asíncrona, antes de este paréntesis,
pasamos una palabra clave. Tan simple como eso. Ver, el error se ha ido. Ahora, esta expresión devolverá los datos almacenados
de la base de datos. Así que lo almacenamos en datos almacenados
const variables. Y luego enviamos esta
tienda para que haga como respuesta. Ahora veamos que esto
está funcionando o no. Guarda los cambios y ejecutemos esta aplicación usando
nodemon index dot js Se está ejecutando un buen servidor, y además conseguimos que Mongo Db se
conecte con éxito Perfecto. Ahora usando nuestra extensión de cliente de
licitación, enviaremos solicitud postal. Ya hemos guardado
este crear para hacer API, así que usaremos directamente esto aquí en el
cuerpo de la solicitud, en lugar de usar forma codificada, usaremos JS y formato. Facilitará nuestra tarea. Ahora abre JSNFle que
adjunto con esta lección. Se puede descargar a medida que descarga
PDF desde el lado derecho. Ahora, simplemente, copio
el primero en hacer objeto y pegarlo
en el cuerpo de la solicitud. Además, asegúrate de tener una
API de prefijo en la URL y
envía la solicitud. Ver, aquí obtenemos nuestros nuevos
datos con ID autogenerado. Además, podemos comprobar que en
el Mongo DBCompass ver, aquí obtenemos los Ahora adelanto esta lección y una por una,
inserte todos todos. Bueno. Se puede ver cómo estamos progresando y resolviendo
cada ejercicio paso a paso En el mundo real, también,
hay que trabajar paso a paso. De esa manera, te
confundes menos y trabajas con facilidad.
76. Ejercicio 03: busca datos: Ahora es el momento
del tercer ejercicio, que diseño para
recuperar los datos Después de agregar múltiples
valores en la colección, quiero que escribas consulta
para esta colección. Ya tenemos un método G
para buscar todas las cosas que hacer. Puedes escribir todas las consultas una por una aquí y completar
el ejercicio. El ejercicio tres primera consulta es que queremos recuperar
todos los datos de dos Después de eso, la segunda consulta es
Fatudos quien tiene etiqueta, reaccionar. Tercera consulta, esto
es un poco complicado. Festuds que tiene etiqueta STML y
también un estatus deben Tudar. Después de eso, cuarta
consulta cuenta el número de Tudos cuyo estado
está configurado para hecho La última quinta consulta es faz
tudos en qué tarea, hay palabra crear, solo la palabra crear No debe incluir
recrear creado, solo crear y también asegurarse de ignorar las mayúsculas y
minúsculas aquí Como sabes, puedes
usar mi PDF de resumen si no
recuerdas los métodos
y resuelves este ejercicio. Esto impulsará tu confianza, y así es como aprenderás en qué cosas
necesitas enfocarte más. Además, si estás
confundido en una consulta, entonces puedes avanzar con otras consultas y
resolver otras consultas. Entonces espero que intentes
resolver este ejercicio. Ahora,
veamos rápidamente la solución. Para primera consulta, para obtener all to dos
de la base de datos, aquí tenemos este GPI en que estamos
devolviendo directamente esta matriz de todos Pero ahora queremos obtener
datos de la base de datos, y luego
devolveremos esos datos Entonces aquí escribimos todo dot find. Queremos todos, así que aquí no
pasamos ninguna condición. Ahora bien, esta expresión es prometedora. Podemos esperar aquí y almacenar
esos datos en una variable
llamada todos. Ahora aquí obtenemos error de tiempo de ejecución. ¿Me puedes decir cómo
podemos resolverlo? Hacemos nuestra función función
asíncrona, y al final, enviaremos
este todos como respuesta Guarde los cambios, y
llamemos a este GTI PI. Aquí no tenemos este GIPI
así que creamos una nueva solicitud, y en la URL,
pasamos la columna host local 3,000 API SlaStudos
y enviamos Ver, aquí obtenemos
la lista de Tudos. Entonces resolvemos la primera consulta. Ahora pasemos a la segunda consulta. En estos, tenemos que parchear a los
toudos que tiene tag react. Duplico esta línea y
comento la primera consulta, ahora para encontrar ¿está disponible una
sola cadena
en la matriz o no? No necesitamos hacer
nada especial. Pasamos directamente aquí, objeto, y agregamos aquí condición, texto, y en cadena, escribimos nuestra palabra clave,
que es reaccionar. Yo en la matriz de texto
hay algún elemento, igual que esto reacciona, entonces conseguimos que haga eso. También, podemos hacer lo mismo
usando en operador. Ambos funcionan igual.
Guarde los cambios y enviemos esta solicitud. Mira, aquí tenemos tres que hacer y todos tienen tag de
reacción en ellos. Ahora pasemos a la tercera consulta, que es rápida todos, quien tiene etiqueta STML y su
estado debe ser hacer Entonces en el lugar de
esta etiqueta
reaccionamos, pasamos STML y pasamos otro estado de
condición a hacer Entonces podemos usar tu operador de
dólar, pero ya sabemos que esto también funciona igual que ese operador. Guarda los cambios
y echa un vistazo. Enviar la solicitud. Ver,
aquí llegamos a Tudos Genial. Ahora pasemos a la
cuarta consulta en la que tenemos que contar el número de tudos cuyo estado
está configurado para hacer Déjame preguntarte algo. Deberíamos usar tu método
fino o contar el número de tudos No, tenemos algo más. ¿Recuerdas que sí, utilizamos el método de contar documentos Entonces reemplazamos este
método fino con documentos de conteo, y aquí pasamos condición a D. Guarda
los cambios y echa un vistazo. Ver, aquí obtenemos cinco, lo que significa que el estado de cinco
tareas está hecho. Ahora tenemos la última consulta, que es ir a buscar dos en qué tarea hay palabra crear Aquí, nuevamente agregamos método
fino y en el lugar
de esta condición de estado, tenemos una tarea y aquí
tenemos que usar expresión
regular porque
estamos trabajando con cadena. Ahora bien, ¿recuerdas la
sintaxis de la expresión regular? Sí, es patrón slash. Ahora para buscar una palabra específica, usamos Hacia atrás B,
creamos Bwards B. Para hacer que esta palabra sea insensible a
mayúsculas y minúsculas, usamos aquí, yo, guardamos los cambios
y echamos un vistazo Enviar la solicitud
y ver aquí obtenemos tres registros en los que
tenemos crear Word en tarea. Así es como obtenemos datos de la base de datos en
el mundo real. Espero que se te ocurra
lo que estamos aprendiendo.
77. Ejercicio 04: actualización y eliminación de tareas: Ahora pasemos
al cuarto ejercicio. No te preocupes, puedes
resolverlo en solo dos a 3 minutos. En este proyecto, también
hemos puesto método de actualización
específico para hacer por su ID. La primera consulta de este ejercicio
se actualiza tarea específica por su ID y sólo cambiar el texto de la
tarea a actualizado para hacer. Como hay que devolver eso
actualizado para hacer en la respuesta. Aquí puede copiar
cualquier ID de objeto
del pase Mongo Di BC y
pasarlo en el parámetro de consulta Después de eso, la segunda consulta es, hay
que actualizar
todos los documentos cuyo estado actual está haciendo y actualizar
esos estados con De. Además, aquí no tienes que
crear una nueva API. Simplemente puedes escribir
solo consulta de actualización y verificarla cuando te
muestre la solución. En la última tercera consulta es, hay
que eliminar una tarea
específica por su ID. Aquí, también puedes usar cualquier identificación de la brújula
Mongo Divi Y después de que se complete el
proceso de eliminación, hay
que devolver el objeto con propiedad de
mensaje para que
se elimine correctamente. Y para eliminar consulta, puedes
usar delete API en nuestro código. Estos son ejercicios bastante
simples. Puedes usar Resumen PDF
o viendo la sintaxis. No te preocupes si tienes que
vigilar la sintaxis de los métodos. Incluso a veces
olvidé la sintaxis. Entonces no te preocupes con la práctica, conocerás esta sintaxis. Entonces espero que resuelvas este ejercicio o intentes
resolver este ejercicio. Date crédito por eso. Ahora,
veamos rápidamente la solución. Entonces, la primera consulta es que tenemos que
actualizar la tarea específica por su ID y cambiar solo el
texto de la tarea para actualizarla todo. Así que aquí tenemos ID, que estamos obteniendo
de solicitud punto PAMs Ahora de cuerpo, solo necesitamos tarea para poder
eliminar otros rellenos. No necesitamos este
código porque
escribimos esta lógica
para la matriz local. Pero ahora tenemos los métodos MongoDB. Podemos escribir aquí para hacer punto. Ahora bien, ¿qué método usamos aquí? ¿Deberíamos usar Actualizar
uno, buscar uno y actualizar, bien por ID, y actualizar o actualizar muchos? Sí, podemos usar
cualquiera de estos cuatro. Pero aquí, tenemos que devolver
el documento actualizado. Entonces
simplemente se eliminan dos opciones, que es actualizar una
y Actualizar muchas porque estas dos no
devolverán el documento actualizado. Ahora sólo tenemos dos opciones. ¿Cuál es más simple? Tenemos que actualizar para ver con identificación. Entonces usamos aquí, encontramos
por ID y actualizamos, y aquí pasamos este ID. Además, no necesitamos
convertir este ID en
entero porque el ID del
objeto Mongo DV es una cadena Ahora en el segundo argumento, pasamos objeto con operador de conjunto de
dólares y pasamos aquí objeto
con tarea a tarea, que obtenemos del
cuerpo de la solicitud. Ahora aquí hay una
cosa. Si en objeto, nuestro nombre de propiedad y nombre de
valor ambos son iguales, que es aquí tarea y tarea. Simplemente podemos escribirlo como tarea. Pero por dar este código, lo
estoy guardando así. Ahora bien, ¿recuerdas que
tenemos que pasar tercer argumento en este viento
por ID y método de actualización? Aquí, pasamos nuevo a verdadero y también ejecutamos
validadores a true Guardemos esto para que
podamos ver con claridad. Bonito. Ahora sabemos que esta
expresión es tarea asíncrona Entonces pasamos aquí un peso, y almacenamos valor actualizado
en actualizado para hacer variable. También, para un peso, tenemos que pasar aquí asincrónica, y en la parte inferior, simplemente devolvemos
esto actualizado para hacer Guarde los cambios y
comencemos esta aplicación. Bueno. Abra la prueba API actualizada. Aquí tenemos cuerpo listo. Justo en la parte superior, necesitamos pasar el real to do object
ID como parámetro. Así que copiamos cualquier ID para hacer
del Mongo Di convertido en pase, y aquí en el
lugar de este ID, pasamos nuestro ID y además
nos aseguramos de que agreguemos
menos prefijo API Enviar esta solicitud. Bien,
obtenemos nuestros datos actualizados. Ahora pasemos a la segunda consulta, que es actualizar
todos los documentos cuyo estado actual está haciendo y
estado actualizado con hecho. Duplico esta consulta y
simplemente comento esto. Ahora tenemos que actualizar
aquí múltiples documentos. Entonces en el lugar de
encontrar por identificación y actualización, usamos actualizar muchos. Aquí en el lugar de ID, tenemos que pasar objeto de consulta
con estado de condición a hacer y queremos
cambiar los datos como hecho. Además, eliminamos este
tercer argumento. No lo necesitamos,
guarda los cambios y no te preocupes por la
identificación y el cuerpo de tareas. No los usamos en nuestra
consulta. Enviar la solicitud. Ver, aquí obtenemos conteo
modificado a uno, lo que significa que
lo actualizamos con éxito. También puedes verificarlo desde
la brújula Mongo Di B. Este es uno, correcto, trabajar
con datos. A mí me encanta. Ahora pasemos a la tercera consulta. Es para eliminar una tarea
específica por su ID. Entonces aquí ya estamos obteniendo ID de los PRMs de punto de solicitud Además, eliminamos este método entero
pasado porque no lo necesitamos. Ahora solo necesitamos escribir consulta. Eliminamos este código anterior, y usamos para hacer punto, qué método usamos.
Piénsalo. Necesitamos eliminar tarea
específica por su ID. Sí, podemos usar Dilt uno, uno fino y eliminar, o también podemos usar
bien por ID y eliminar Aquí, no especifico, necesitamos devolver documento
eliminado o no. Entonces, para el primer rendimiento, utilizamos aquí DLT uno Si queremos documento eliminado, entonces usamos aquí, bien
por ID y eliminar. Aquí pasamos objeto de consulta con
propiedad ID de subrayado a ID Ahora al principio, agregamos esperar y almacenarlo
en la variable llamada resultado. Ahora para esperar, en la parte superior, agregamos Async y en la parte inferior, devolvemos este resultado a este objeto JSON con
esta propiedad message Guarda los cambios
y echa un vistazo, copia cualquier ID de la
base de datos y abre la solicitud de eliminación
En W de este ID, pegamos nuestro ID, y además adherimos el
prefijo de la API de slash y enviamos la solicitud Ver, obtenemos el
recuento eliminado a uno, lo que significa que
eliminamos con éxito el todo. Si actualizamos nuestra base de datos, C, solo tenemos siete todos. Uno a hacer se elimina
de la base de datos, así es como realizamos la
actualización y eliminación en Mongo DB Sé que esta sección es poco
larga que otras secciones, pero como pueden ver, Mongo Deb
es muy importante de aprender Por eso diseñé estos ejercicios específicos
para el aprendizaje de Mongo Deb Si estás viendo este
curso continuamente, entonces tómate un pequeño descanso
de la pantalla. Bebe un poco de agua y
cuida tus ojos. Nos vemos en la siguiente
sección donde
aprendemos temas avanzados de Mongo Deb
78. Sección 08: validadores incorporados: Bienvenido a la octava sección del curso Node JS definitivo. En esta sección,
aprenderemos conceptos avanzados de Mongo DB Comenzamos con la aplicación de
validadores en el esquema del modelo, devolviendo errores personalizados
para esas validaciones Después de eso, veremos cómo construir relación
entre colecciones, diferentes tipos de diseño de estructura de
bases de datos, y cómo hacer patch muy rápido. Estos conceptos son muy útiles cuando queremos construir aplicaciones del mundo
real. Empecemos esta sección. En la sección anterior en
el proyecto demo de Mongo, creamos este esquema para nuestro modelo de usuario,
y en el esquema, definimos el tipo de relleno y algunas otras propiedades
como required Este requerido es un tipo de
validador para este esquema. Anteriormente, solo los definimos, pero realmente no vemos la implementación práctica
de validador para esquema Veamos qué pasó
cuando intentamos
agregar datos sin
pasar el relleno de nombre. Cont out esta propiedad name desde aquí y en la parte inferior,
en el lugar de la función de usuario
delativo,
llamamos función de usuario creativo Guarda los cambios,
y en el terminal, vamos a ejecutar este
nodo de aplicación index dot js. Ver, aquí nos sale el error. Vamos a desplazarnos hasta la parte superior. Aquí podemos ver que estamos obteniendo error de
validación,
validación de usuario llenada. Se requiere el nombre de la ruta de acceso del nombre. Ahora podrías preguntarte por qué
estamos recibiendo este
tipo de error largo. Entonces la razón es que no estamos
manejando correctamente el error. Entonces aquí sabemos que este nuevo método de usuario dot cv devuelve una promesa, y es por eso que usamos esperar. Pero aquí estamos
fingiendo que siempre obtenemos datos en este objeto y nos
olvidamos de manejar el error Entonces, ¿recuerdas en la sección JavaScript
asíncrona, cómo manejamos el error
en los métodos de Asnawt Correcto, usamos try
and catch blog. Entonces aquí también agregamos Tr blog
mover nuestra tarea de acing en él. Ahora bien, si obtienes error al
almacenar este usuario, nuestro código, muévete a catch blog. Aquí, obtenemos
objeto error, y por ahora, simplemente consul dot
log este objeto de error, y tiene una propiedad
llamada message en la que
obtendremos mensaje de error Guarde los cambios, y nuevamente,
ejecute esta aplicación. Ver, ahora recibimos
nuestro mensaje de error. Pero aquí también estoy recibiendo
esta información de actualización. Déjame ver qué es lo que está mal. Sí, en la parte inferior, olvidé comentar
esta función de usuario de actualización. Guarde los NGs, y volvamos a ejecutar
esta aplicación. Ver, aquí nos llega
nuestro mensaje de error. Esto es bueno y claro. En el mundo real, podemos devolver este mensaje de error como respuesta
con el Código de Estado 400. Ahora, no te preocupes por eso. Ahora bien, ¿y si queremos pasar mensaje de error
personalizado para
este campo requerido? En el lugar de este valor
true, pasamos array. En primer lugar, pasamos nuestro valor por lo
requerido, lo cual es cierto. En segundo lugar, pasamos
nuestro mensaje de error en cadena. Digamos, por favor
ingrese el nombre de usuario. Guarda los cambios
y echa un vistazo. Ver, aquí obtenemos nuestro mensaje
de error personalizado. Los validadores nos ayudan a mantener la calidad y
exactitud de los datos Mediante el uso de validadores,
verificamos si los valores en el documento siguen las reglas que hemos
establecido para cada relleno Hay dos tipos de
validadores en los mangos. El primero está construido
en validadores, que son los validadores predefinidos por
mangos Segundo, tenemos validadores
personalizados, que podemos definir por los nuestros propios. Requerido es una parte de los validadores
incorporados. Déjame mostrarte otro construido
en validadores de mangos. Para string, tenemos longitud mínima, que verificará la
longitud mínima de la cadena, y pasamos la longitud
mínima aquí. Después de eso, tenemos la longitud máxima que verificará la
longitud máxima de la cadena. A continuación, tenemos match que valida cadena usando
una expresión regular, y su sintaxis es slash pattern slash developer use this match validator for
validates Por ahora, no queremos eso. Ahora supongamos para cada usuario, tenemos que mencionar el
rol de ese usuario, que puede ser simple usuario
o puede ser admin, y la cadena distinta a
esta no será válida. Entonces en ese momento,
establecemos el tipo a cadena para establecer las
dos posibilidades, usamos aquí la propiedad num
y la configuramos en array, y lo adivinaste correctamente, pasaremos nuestros
valores en esta matriz Primero, puede ser usuario y
segundo, puede ser admin. Podemos adherir tantos
valores como queramos, pero tenemos que pasar uno de estos valores cuando
guardamos nuevo usuario. Esto ya lo hemos visto en nuestro ejercicio. Recuerda, estos son los
validadores para string. Además, hay dos validadores
para el número también, mean y max, pero no
queremos agregarlos aquí. Eso es todo validadores incorporados.
Son muy útiles. Además, una cosa que
quiero dejar claro es que los validadores son
una característica de mangosta No hace nada
con Mongo DB. Si de la base de datos de Mongo Debi, eliminamos el
campo name de un registro, entonces Mongo Deb no le
importa en nuestro esquema, establecemos el campo
name Mangosta nos da estas
características para que podamos validar los valores del usuario antes de
almacenarlo en la base Si no es válido, mangosta no almacena esos
datos en la base de datos, y si es válido, Mongo los almacena en la Tan simple como eso. Ahora
en la siguiente lección, veremos cómo hacer datos válidos
personalizados
79. Validadores personalizados: Ahora veamos cómo podemos establecer validadores
personalizados en nuestro esquema Entonces aquí tenemos aficiones llenas, que es la matriz de cuerdas. Queremos asegurarnos de que el usuario
debe agregar más de un hobby. Para ello, necesitamos
definir validadores personalizados. Es realmente simple. Entonces después de esta propiedad tipo, aquí tenemos otra
propiedad llamada validate, y pasamos aquí otro objeto. Ahora, dentro de este objeto, tenemos propiedad validador,
columna, y aquí pasar la función
validador Aquí queremos checar. El valor pasado para este campo
tiene dos elementos o no, pero para eso,
necesitamos el valor aquí. Obtenemos ese valor como parámetro, y lo llamamos V por valor. Ahora en esta función, podemos simplemente devolver condición. Déjame preguntarte, ¿cómo
podemos verificar esto? V tiene dos elementos o no? Sí, podemos escribir aquí, longitud del
punto debe ser
mayor que uno. Y eso es todo. Veamos que está funcionando o no. Para eso, comentamos este campo de aficiones y también cambio el
correo electrónico a Harley one. Guarde los cambios y
ejecutemos esta aplicación. Ver, aquí obtenemos dos errores, uno para el nombre y
otro para hobby. Validador falló
para pasatiempos de ruta con valor cadena vacía Ahora imagina que devolvemos
este error con nuestra API. Casi nadie puede
entender este error. Entonces tenemos que dar mensaje de error
significativo para cambiar este mensaje de error, después de esta función validador, tenemos propiedad de mensaje y
pasamos aquí mensaje personalizado, por favor ingrese dos pasatiempos
diferentes Asegúrese de que teníamos esta propiedad
message en este objeto validador, no en la
función validador porque
he cometido este error mientras
estoy grabando esta lección Guarde esto y ejecutemos esta
aplicación una vez más. Ver, aquí obtenemos nuestro mensaje
de error personalizado. Ahora probemos más
cosas para este relleno. ¿Y si alguien pasa
solo una afición? Comprobemos esto.
Eliminamos el comando, y eliminamos otros dos
pasatiempos de nuestra matriz. Guarde los cambios y
ejecutemos esta aplicación. Bien, aquí estamos recibiendo el mensaje de error,
está funcionando. Ahora bien, ¿y si alguien
pasa aquí valor nulo? Guarde esto y ejecutemos nuestra
aplicación una vez más. Ver, aquí obtenemos no se pueden leer propiedades de null, longitud de
lectura. Ahora, ¿por qué estamos
recibiendo este error? Porque en nuestros validadores
personalizados, tratamos de obtener la
longitud de este valor Pero si el usuario pasa null como valor, no
podemos acceder a la propiedad
length. Podemos adherir otra
condición tipo de V es igual a array. Y su longitud debe
ser mayor a uno. Si estas dos
condiciones son ciertas, sólo entonces se validan nuestros datos. También podemos modificar el
mensaje para que por favor ingrese la matriz de pasatiempos con
dos pasatiempos diferentes. Guarde los cambios y
ejecutemos esta aplicación. Ver, aquí también obtenemos el mensaje personalizado para el valor
nulo. Entonces, para recapitular rápidamente para
agregar validadores personalizados, tenemos propiedad válida
después de la propiedad type Y en esa validar,
podemos agregar dos propiedades. Uno es validador, que
tiene una función validador, y otro es mensaje personalizado Y a partir de esta función
validador, devolveremos la
condición para la validación Podrías preguntar si queremos
devolver la condición, entonces ¿por qué necesitamos esta función? Podemos agregar directamente
condición aquí, pero verifique esto una vez más. En esta condición, siempre
necesitamos el
valor actual de ese relleno, y solo lo obtenemos en
la función validador Por eso necesitamos
esta función. Así es como definimos los
validadores personalizados para el esquema.
80. Validadores asíncronos: A veces en nuestro proyecto, nuestra validación puede implicar algunas operaciones
asincrónicas, lo que significa que la operación
puede llevar tiempo Por ejemplo, queremos obtener
datos de la base de datos, y en base a esos datos, queremos validar nuestro relleno En este caso, podemos
aplicar validadores asíncronos. Déjame mostrarte. Para aplicar los validadores asíncronos en
la versión anterior Aquí en el objeto validador, tenemos que agregar una propiedad
llamada asincrónica a true Pero en la última versión de
Mongoose, esta opción está activada por defecto
. Podemos eliminar esto. Ahora podemos simplemente hacer esta función asíncrona y
dentro de esta función, podemos realizar nuestra tarea
asincrónica No queremos esa
complejidad ni este modelo, así que para demostrar el retraso, utilizamos aquí el método de tiempo de espera establecido primer parámetro es la función
callback, y segundo, agregamos
3,000 milisegundos Ahora, antes de esta función de
tiempo de espera establecida, permítame consola de registro de puntos para
obtener datos para su validación Ahora supongamos que después de
3,000 milisegundos, estamos obteniendo datos de la base de datos y en
base a esos datos, podemos devolver cualquier condición Solo recuerda que tenemos que devolver condición como
regresamos anteriormente, lo
que significa que debe
ser verdadera o falsa. Guarde los cambios y
ejecutemos esta aplicación y veamos, aquí obtenemos nuestro error. Así es como podemos aplicar los validadores
asíncronos. Yo personalmente nunca uso
esto en mi proyecto porque las operaciones de acyc
para la validación son raras, pero este tema puede
ayudar a algunos de ustedes, y por eso
agrego esta lección Ahora en la siguiente lección,
veremos algunas opciones esquematizadas.
81. Opciones útiles de SchemaTypes: Ahora veamos
opciones de tipos de esquema en mangoose. Ya los usamos
en nuestro esquema, que es minúscula a verdad. Esto almacenará nuestra
cuerda en minúsculas. Igual que esto, tenemos
mayúscula a verdad. Esto almacenará toda nuestra
cuerda en la mayúscula. Y después de eso, tenemos
otra opción útil, que es stream to true. Esto eliminará el espacio
en blanco innecesario de nuestra cadena. Por ejemplo, esto convertirá esta cadena en
este tipo de cadena. Así que nuestros datos se ven bien
organizados y limpios. No es necesario,
tenemos que usar todas estas
opciones de esquema en nuestro proyecto. Podemos usar lo que sea necesario de
acuerdo a nuestro modelo. No hay reglas para eso. Al final, los validadores
son solo para mantener la calidad
y precisión de los datos
82. Relación entre modelos: Así que hasta ahora en este curso, hemos visto modelos o
colecciones que son simples y no tienen
conexión con otro modelo. Pero en el mundo real, la mayoría de nuestros modelos están conectados
entre sí. Déjame explicarte
con el ejemplo. Así que imagina que estamos trabajando en aplicación de redes
sociales
como Twitter. Entonces en eso, tenemos
una colección para usuarios en la que almacenaremos
todos los datos de los usuarios como nombre, correo electrónico, contraseña, etcétera Después de eso, tenemos
una colección para post en la que
almacenaremos todos los datos de post. En el post documento,
tenemos contenido, que es la fecha del texto del
contenido post
cuando se creó esta publicación. Después de eso, tenemos usuario que subió este post,
digamos Harley. Ahora bien, estos dos documentos
o podemos decir colecciones no
están conectados entre
sí. Tenemos que conectarlos. A esto se le llama
relación de modelo. Ahora podrías tener duda ¿por qué necesitamos conectar
modelos entre sí? ¿Por qué necesitamos esa relación? Entonces, si no usamos la relación, podríamos terminar almacenando los mismos datos de usuario repetidamente
para cada publicación que hagan. Supongamos que un usuario publica
diez publicaciones diferentes. Si no usamos relación, entonces tenemos
que almacenar esos mismos datos de usuario diez veces por cada publicación, y ese es solo un usuario. Imagínese en nuestra aplicación de
redes sociales, hay 100 mil estudiantes
o más que eso. Piensa cuántos datos tienen que
repetir en nuestra base de datos, y esto también es
más difícil de manejar. Entonces tenemos que usar relaciones entre modelos que
tienen asociación. Ahora hay dos enfoques
para implementar la relación. El primero es usar referencias, y otro son
datos incrustados en otro documento. Primero veamos cómo podemos implementar la relación
usando referencias. En el post documento, tenemos este usuario y pasamos nombre de usuario. Ahora, este usuario ya está disponible en la colección del
usuario. En lugar de almacenar el nombre de usuario
en la colección de publicaciones, podemos usar su
ID de usuario de ese usuario. Por ID único del usuario, podemos ejecutar otra
consulta para obtener los datos del usuario como nombre y foto de perfil de la colección
de usuarios. Ahora para cada publicación, solo
tenemos ID de usuario en
el lugar del nombre de usuario. Pero podemos ver que hay que
ejecutar otra consulta
en este enfoque, lo que podría ocasionar problemas de
rendimiento. No estoy diciendo que
definitivamente causará problemas de
rendimiento, pero a veces puede. El otro enfoque
que puede resolver este problema son
los datos incrustados en otro documento. En el lugar de
pasar aquí ID de usuario, podemos pasar aquí objeto de usuario y eliminamos la colección de nuestro
usuario. Este enfoque, no
tenemos que correr a consultas, así que no enfrentamos aquí problemas de
rendimiento,
pero aquí hay una cosa. Imagina que el usuario tiene de
20 a 40 detalles. Eso hará que nuestro post
documento sea mucho más grande. Además, provocará duplicación de
datos
ya que para cada publicación, tenemos que almacenar objeto de usuario. Ahora, algunos desarrolladores dicen que estos días el
almacenamiento de bases de datos es barato. Podemos permitirnos la
duplicación de datos y eso es cierto. Pero, ¿y si nuestro usuario
quiere actualizar su
nombre de usuario o ID de correo electrónico? Esa vez, tenemos que
actualizar múltiples post y si de alguna manera dos o tres documentos
no obtienen esas actualizaciones,
entonces eso nos llevará
a la inconsistencia de los datos Pero cuando usamos referencias, tenemos que actualizar los datos
solo en un lugar. En resumen, cuando
usamos referencias, obtenemos consistencia de datos porque nuestros datos se almacenan
en un solo lugar, pero podríamos obtener problemas de
rendimiento porque en eso tenemos
que ejecutar múltiples consultas. Otro lado, cuando incorporamos datos en otro documento,
obtenemos rendimiento. Obtenemos nuestros datos más rápido porque no necesitamos
ejecutar múltiples consultas. Tenemos nuestros datos en un solo
documento, pero con eso, obtenemos inconsistencia de datos porque tenemos
los mismos datos en múltiples lugares Esto es comprar uno y obtener uno gratis. Tenemos que decidir
por nuestra aplicación. Necesitamos consistencia de datos
o queremos rendimiento. Si queremos consistencia de datos, entonces usamos referencias, y si queremos rendimiento, entonces incrustamos datos
en otro documento. Diferentes proyectos tienen
diferentes requerimientos. Como desarrollador,
tienes
que decidir qué enfoque funciona
mejor para tu proyecto. Hoy en día, los desarrolladores
utilizan el enfoque híbrido, que combina
estos dos enfoques, y lo veremos
en la siguiente lección.
83. Enfoque híbrido para las relaciones: Hemos visto cuando
usamos referencias, obtenemos consistencia de datos, y cuando incorporamos datos en otro documento,
obtenemos rendimiento. Déjame mostrarte el enfoque
híbrido que los desarrolladores utilizan hoy en día. Supongamos que tenemos usuarios que
tienen de 20 a 30 propiedades, almacenaremos los
detalles de esos usuarios en la colección del
usuario. Ahora para el post, tenemos
estos otros campos, mismos que vemos en el enfoque de
referencia. Pero en enfoque de referencia, almacenamos aquí ID de usuario. El lugar de eso, podemos
usar aquí, pequeño objeto de usuario, que contiene solo propiedades
necesarias que queremos
mostrar con post. Podríamos tener ID de usuario, que es la referencia a la colección del usuario
y al nombre de usuario. No almacenamos aquí todas las
20 a 30 propiedades, pero vamos a incrustar
sólo esa cantidad de datos. Queremos exhibir con post. Con este enfoque,
podemos obtener rápidamente post porque no necesitamos
buscar múltiples consultas Tenemos todos los
datos necesarios en un solo objeto. Este enfoque funciona mejor cuando nuestra colección
necesita pequeños detalles a los que se accede con frecuencia. Por ejemplo, en nuestro proyecto de comercio
electrónico, donde tenemos productos, pedidos, carrito, etcétera Cada pedido, queremos usar pequeños detalles de nuestros
productos como ID,
nombre, imagen de portada y precio porque queremos mostrar los detalles de
ese pedido
con los productos. Así que tenemos una
recopilación separada para los datos de los productos, pero aún así vamos a incrustar algunos pequeños datos sobre los
productos en cada pedido. Entonces, cuando queremos un
acceso rápido a pequeños detalles, pero también queremos hacer referencia a datos
grandes o complejos, entonces usamos el enfoque híbrido. De nuevo, te estoy diciendo que
no tienes que apegarte
a un solo enfoque. Alguna aplicación funciona
mejor con referencias. Así que funciona mejor con datos
incrustados, y algunos funcionan mejor en
este enfoque híbrido. Tienes que decidir de acuerdo
a las necesidades de tu proyecto. No te preocupes cuando construimos
otros dos proyectos, te
mostraré cómo podemos
decidir el enfoque de relación. Estoy hablando de relación
entre colecciones, no de otro tipo
de relación.
84. Aplicación del enfoque de referencia: Veamos cómo podemos aplicar enfoque de
referencia
para la relación. Para practicar este concepto, creé este nuevo
archivo porque no
quiero que te
confundas con ese núcleo desordenado Déjame explicarte lo que
agregué en este archivo. Primero, conectamos este archivo con base de datos
Mongo DB llamada
Mongo esa es la relación. Después de eso, como
vemos en el ejemplo, definimos aquí
esquema de usuario simple con solo tres rellenos, nombre, correo electrónico y edad. Después de eso, definimos
un nuevo esquema para post. En eso tenemos
dos rellenos de contenido, que puede ser texto y luego fecha, que es la fecha actual en tiempo
real. Tenemos usuario que
agregaremos en solo un minuto. Después de eso, creamos
dos modelos para usuarios y recolección de publicaciones.
Ya hicimos esto. No quiero aburrirte
escribiendo el mismo código
una y otra vez. Ahora, después de crear
estas dos colecciones, defino pocas funciones. Uno es para crear
usuario en el que podemos crear un nuevo usuario y
almacenarlo en la colección del usuario. A continuación tenemos la
función Crear Post en la que
creamos un nuevo post usando
contenido y datos de usuario, quien creó este post. La última función es para obtener
todas las publicaciones de la base de datos. Ya hemos visto todo esto. Vamos a crear el primer usuario
con estos valores. Ejecute esta aplicación usando
nodo, punto de referencia JS. Bueno. Ahora intentemos crear una nueva publicación sin
agregar ningún dato de usuario. Aquí comento esta función de crear usuario y eliminar comentario de la función Crear
publicación. Volvamos a ejecutar esta aplicación y veamos aquí
creamos un nuevo post. Tenemos contenido y vemos, no
obtenemos ningún dato de usuario, incluso si pasamos usuario como
rellenado los nuevos datos de usuario. Podemos ver que los mangos solo
agregarán aquellos rellenos que
definimos en el esquema No agregará todos los demás rellenos. Ahora en este modelo de post, tenemos que agregar el campo de
usuario y
le damos referencia de usuario a
partir de la colección de usuarios. Déjame mostrarte a lo que me refiero. Aquí, agregamos usuario. Ahora siempre que queramos
dar referencia, podemos dar eso usando ID de
objeto porque es único. Pasamos su tipo a Mongos esquema de punto
tipos de punto, punto ID de objeto Sí, tenemos que pasar
esta expresión para definir el
ID de objeto como tipo relleno. Después de la propiedad tipo, tenemos que decir qué otra referencia de
modelo estamos agregando. Pasamos RF dos y aquí pasamos nuestro
nombre de colección en palabra singular. Igual que pasamos en este
método de modelo de punto mangosta, que es usuario Ahora pasemos nuestro ID de usuario
en la función create post. En el Mongo D BCMEPass obtenemos la nueva base de datos llamada En eso, obtenemos colección de
usuarios, copiamos este ID de usuario, que acabamos de crear y
pegarlo en el lugar de
esta cadena de usuarios. En la función Crear publicación, teníamos este ID en
el lugar del usuario. También cambiemos este
contenido a contenido también. Entonces los cambios, y vamos a
ejecutar esta aplicación. Mira aquí también obtenemos nuevo
post con contenido, y también obtenemos aquí ID de usuario, que es la referencia
al modelo de usuario. Agregar una referencia es muy fácil. Tenemos que establecer ese tipo de relleno a Mongos punto esquema punto
Tipos punto ID de objeto, y pasamos
propiedad ref para agregar el
nombre del modelo de referencia en palabra singular Ahora, si tratamos de conseguir post, así que comente esto y elimine el comentario de
esta función de publicación G. Guarda los cambios
y echa un vistazo. Ver, aquí tenemos dos post. Primero, que
creamos sin usuario y segundo en el que
definimos ID de usuario como referencia. Ahora podrías preguntar estamos
consiguiendo aquí ID de usuario simple. ¿Cómo podemos obtener los datos del
usuario como nombre de usuario o correo electrónico
de esa referencia? Esto lo veremos en
la siguiente lección.
85. Cómo extraer datos de la referencia [Populate]: Veamos cómo podemos extraer datos usando este ID de referencia? Es realmente simple. Para obtener los
datos por referencia, utilizamos un método
llamado populate. Después de este método fino, agregamos punto poblar
y dentro de este, tenemos que pasar el
nombre de relleno que es la referencia Sí, es usuario aquí. Guarda los cambios
y echa un vistazo. Vuelva a ejecutar este archivo. Ver, aquí volvemos a llegar a publicar. En el segundo post, obtenemos
todos los detalles de ese ID de usuario. Ahora imagina
que solo queremos llegar aquí nombre. No necesitamos otros rellenos. ¿Podemos hacer eso? Sí, podemos. En el segundo argumento, pasamos el nombre de las píldoras que
queremos obtener de nuestra colección de
referencia. En códigos, agregamos nombre, guardamos esto y ejecutemos esta
aplicación una vez más. Ver, aquí obtenemos solo
nombre y subrayado ID. Ahora, en lugar de solo
mostrar el nombre, queremos todos los detalles sobre el usuario, pero solo no necesitamos esta
edad. ¿Cómo podemos hacer eso? Ay lugar de nombre,
queremos eliminar, menos ge Muy sencillo. Así es como extendemos
los datos de referencia utilizando el método popular. Ahora déjame decirte algo. Teníamos referencia en nuestro modelo, solo los mangos usan esa referencia A Mongo Deb no le importa eso. Incluso si pasamos aquí ID de usuario
no válido, Mongo DB no
verifica que el ID de usuario esté disponible en la colección del
usuario o no Almacena los datos sin
preocuparse por ello. Déjame mostrarte eso.
Creamos aquí otro post. Comenta esta función de publicación de
Gad y elimina el comentario de
esta función de crear publicación Cambiemos este
contenido a tres, y simplemente modificamos este último carácter de ID de
usuario. En la colección de nuestro usuario, no
tenemos ningún usuario
cuyo ID sea este. Ahora vamos a ejecutar esta aplicación. Ver, nuestro usuario tres
se crea aquí. Ahora vamos a obtener la lista de post, comentar esta función y llamar a esta función Gad Post Los cambios y ver
para el tercer post, conseguimos que el usuario nulo
porque no
obtenemos una referencia para
ese ID de objeto no válido, lo que demuestra que MGB
no verifica que ID de
usuario esté disponible en la colección del
usuario o no Ahora en la siguiente
lección, veremos otro enfoque que está
incrustado en otro documento.
86. Aplicar el enfoque de incrustación: Para aplicar enfoque embebido, no elimino el código anterior porque quiero darte
este código para referencia. Descargamos el archivo incrustado
punto JS de abajo, o lo conseguirás en la carpeta de
la sección de recursos
ocho. Ahora en el enfoque de referencia
aquí para usuario llenado, pasamos tipo a
ID de objeto y lo hacemos referencia
con colección de usuarios. Pero en el enfoque incrustado, agregamos directamente aquí
objeto de usuario con todas las propiedades. No creamos aquí modelo de usuario, eliminamos esta línea, solo
creamos un modelo que es post. Además, podemos eliminar la función de
crear usuario de la parte inferior porque para cada post documento
tiene un objeto de usuario. Ahora podemos agregar aquí objeto
y tenemos que pasar aquí las propiedades que
necesitamos para este objeto de usuario. Podemos decir nombre a cadena, correo electrónico a cadena
y edad al número. Ahora lo malo de este objeto de
usuario es que nuestro usuario puede pasar ningún valor para
el nombre, correo electrónico o edad. Tenemos que pasar las
validaciones para estos rellenos porque necesitamos objeto de
usuario en cada post Entonces, en lugar de agregar
aquí validación, ya
tenemos esquema de usuario. Entonces en el lugar de pasar
este simple objeto, pasamos aquí esquema de usuario. Este esquema, podemos agregar todos nuestros validadores así como
tenemos colección separada También, para definir el esquema por separado tiene un beneficio más. También podemos usar ese esquema de
usuario para otra colección en la que
también queremos incrustar los datos del usuario. Ahora vamos a crear una nueva publicación
con estos datos de usuario incrustados. Entonces elimino esta llamada a crear función de
usuario, y llamamos a la función Create
Post. Ahora en el lugar de este usuario, tenemos que pasar
user object porque ese objeto user se almacenará directamente
en el post documento. Para el usuario, pasamos objeto
con nombre de propiedades al código de correo electrónico a código
etheridgmil.com Edad, digamos 25. Guarde los cambios y
ejecutemos este archivo s incrustado. Entonces nodo, incrusta, y presiona Enter. C, obtenemos una nueva publicación con objeto de
usuario que tiene
nombre, correo electrónico y edad. Y si también revisamos nuestra
base de datos en la parte inferior, obtenemos post con objeto de usuario. Entonces en la referencia, simplemente
pasamos ID de
objeto y agregamos referencia
a otra colección. Pero en el enfoque incrustado, agregamos directamente datos de usuario
completos en un solo documento. Ahora
tengo una pregunta. ¿Y si hacemos que este campo de
nombre sea obligatorio y luego no pasamos nombre
en el objeto del usuario? ¿Nuestro post creará o no? Esto no es parte de la lección
que realmente quiera ver. Vamos a et esto. Aquí en el
lugar de nombre a cadena, agregamos object, type to string, y required to true. Ahora en la parte inferior, eliminemos este campo de nombre y cambiemos este contenido a error de prueba. Guarda los cambios
y echa un vistazo. Oh, obtenemos un error de validación, lo que significa que no
se crea un nuevo post, y también podemos verificarlo
en nuestra base de datos. Ahora imagina que queremos almacenar 20 a 30 propiedades
para los datos de los usuarios. No podemos agregar todos esos rellenos
en cada post documento. A, supongamos que queremos obtener datos de
los usuarios como correo electrónico y contraseña entonces ¿cómo podemos obtener esos datos por separado
sin obtener todos los post Este método incrustado no
es realmente práctico para los
tipos de aplicaciones de redes sociales. Es por eso que los desarrolladores utilizan enfoque
híbrido para lograr el
equilibrio en la aplicación, e implementaremos el
enfoque híbrido en la siguiente lección.
87. Aplicación de un enfoque híbrido: Implementemos el enfoque
híbrido en la misma plantilla de código. Nuevamente agrego el mismo código
en el archivo híbrido dot js. También puedes
descargarla desde lo siguiente de esta lección. Ahora en el enfoque integrado, agregamos la propiedad de todos los usuarios en una sola colección y ni
siquiera creamos la colección de
usuarios. Ahora en el enfoque híbrido, creamos colección de usuarios en la que podemos agregar
todas las propiedades. Pero lo que vamos a añadir en el campo del usuario de la colección
post porque este post document necesita datos de
usuarios que crearon esa publicación así que en vez de pasar
aquí todos los usuarios propiedad, solo
agregamos pocas propiedades
que requerimos con post. Por ejemplo, con post, queremos mostrar el nombre de usuario
y el correo electrónico de ese usuario. No queremos ahí, así que agregamos nombre,
que puede ser cadena, y queremos mostrar la foto de
perfil de ese usuario,
que puede ser cadena de URL de la foto
de perfil Por lo que nos adherimos solo
los rellenos necesarios para el usuario. No todo el documento. Ahora bien, esto funcionará
perfectamente bien. Pero y si tal vez en algún caso, queremos más información
sobre usuario con el post. Algunos desarrolladores también
se adhieren al usuario Rf, que es la referencia del usuario. Es la misma referencia que
agregamos en la lección de
referencia anterior. Dijimos que es tipo a Mongos punto esquema punto
Tipos punto Id. de objeto Lo que agregamos aquí
sí ref al usuario. Además, podemos cambiar este nombre de
campo a resumen de usuario. Creo que esto es mucho mejor. Ahora cambiemos un
poco en la función create post. Aquí, agregamos ID de usuario en el
parámetro, y en esta publicación, cambiamos este campo de usuario a resumen de
usuario y después de eso, otra propiedad usa una
referencia a este ID de usuario. Ahora en la parte inferior, llamamos a
esta función create post. Aquí podemos cambiar el contenido. Esta es forma híbrida y
pasa el nombre de tu objeto a los códigos y la foto de perfil
al punto de perfil JPG. Para ID de usuario, copio el
ID de la base de datos. Y pega el ID aquí. Guarda los cambios
y echa un vistazo. Ver, aquí obtenemos nuevo post con resumen de
usuario y
representante de usuario. Llegamos los dos. Si deseas mostrar
datos rápidamente sin llamar a consulta
múltiple, entonces usaremos
este resumen de usuario y si queremos
más datos de usuario, sólo entonces usaremos
esta referencia de usuario. De esta manera, podemos optimizar el rendimiento y además
obtenemos los datos que queremos. Usa lo que mejor funciona
para tu aplicación. Al final, esto no es tuyo.
88. Índices en MongoDB: Ahora hablemos de
índices en Mongo DB. Índices es tema muy interesante
e importante de Mongo DB Index se utiliza para hacer que
nuestra consulta de base de datos sea rápida, y también veremos
la demo de eso. Incluso Mongo DB dice
que con los índices, nuestra consulta de búsqueda de base puede ejecutar Tenex
más rápido que antes, lo cual es realmente
avanzado y genial Ahora podría preguntarse cómo índice hace que nuestra consulta de
búsqueda sea más rápida. Déjame explicarte
con el ejemplo. Imagina que tenemos aquí el listado de cien usuarios datos
y queremos encontrar un usuario cuyo correo electrónico es
este y123 atgmil.com Ahora como funciona la consulta real, recojo un objeto de documento,
compruebo su correo electrónico es él 123
aterra gmail.com Si no lo es, entonces
se moverá a otro objeto de documento y
nuevamente revisará ese correo electrónico. Continuará con
este proceso hasta que se escanee
el documento de los cien usuarios. Como pueden ver, esto
es un poco lento. ¿Cuál es la solución aquí? Crearemos un índice para nuestro correo electrónico lleno de
colección. Con solo crear el
índice de correo electrónico llenado, nuestra consulta de búsqueda para
correo electrónico se volverá más rápida. Veamos esto prácticamente. En nuestra colección de usuarios, actualmente, solo
tenemos un usuario. Agreguemos algunos
datos de usuarios falsos en nuestra recopilación. Así que prácticamente podemos ver nuestra consulta está funcionando
mejor o no. Para eso, en la carpeta de la
sección ocho de recursos, agregué un archivo, probando index dot js. Simplemente en este archivo
en nuestro proyecto. Y en este archivo, agregué
casi el mismo código que antes. Primero, colección Mogadbi,
aquí tienes que
escribir tu nombre de base cual estás utilizando
para esta sección A continuación, creamos el esquema de
usuario con nombre, correo electrónico y contraseña, para que
podamos enfocarnos en nuestra consulta. Entonces en la parte inferior,
tenemos funciones. El primero es para insertar algunos datos aleatorios en
la colección del usuario. Ver, mediante el uso de este sencillo for loop y este paquete faker, podemos generar nombre de usuario
aleatorio, correo electrónico y contraseña para pruebas Para eso, en nuestro proyecto, tenemos que hacer NPM install
en el faker rojo Js faker, a la tasa Y dale a Enter. Bueno.
Ahora, simplemente llamemos esta función para
generar
datos de 100,000 usuarios porque aquí estamos
ejecutando este bucle 100,000 veces. Y aquí no queremos obtener
error en el correo de adición, así que elimino el
relleno único a true de nuestro esquema solo para permitir que entren
100 mil usuarios. Además, de tu base de datos, elimina esta colección de usuarios, para que obtengamos todos los datos frescos. Deja caer la colección y escribe aquí usuarios y suelta
la colección. Ahora en nuestro archivo de prueba inExis, llamamos aquí Insertar función de usuarios
de prueba Guarde esto y
simplemente ejecutemos este archivo. Prueba de nodo en el eje
dot js y pulsa Enter. Va a tomar poco tiempo y ver aquí conseguimos mensaje de
éxito. Si revisamos nuestra base de datos, actualizamos la colección, S
en la colección del usuario, obtenemos datos de 100,000 usuarios. Encantadora. Ahora primero, comentamos esta inserción
de esta función de datos Ya no queremos ejecutarlo. Ahora veamos qué
encontrar usuario por correo electrónico, cuánto tiempo está tomando. En la parte inferior, tenemos
la función llamada find user. En esta función,
primero, declaro tiempo. Después de eso, ejecutamos user dot Fine query en la que estamos pasando el parámetro de correo electrónico
a correo electrónico. Después de completar esta consulta, nuevamente
declaramos timer, que es la hora de finalización, y aquí simplemente
mostramos la hora de finalización menos la
hora de inicio. Por esto, obtendremos cuánto tiempo está tomando esta
fina consulta. Además, el
punto de rendimiento ahora es más preciso y confiable para
medir el tiempo de ejecución. Ahora, llamemos a esta función de usuario
fina. Luego, de la colección de nuestro usuario, copiemos cualquier correo electrónico y pasemos ese correo electrónico en nuestra función de
usuario fina con códigos. Guarda esto y en la terminal,
terminamos el código y
volvemos a ejecutar nuestro
índice de degustación punto JSFle Mira, aquí tenemos tiempo
130 milisegundos. Ahora creemos un índice para nuestro relleno de correo electrónico y probemos lo
rápido que será nuestra consulta. Para crear index, aquí
antes de crear colección, agregamos userschema dot
index y dentro de este, pasamos object email, que es el nombre de relleno, queremos marcar como índice, y como valor, podemos pasar dos
cosas una y menos una Ahora podría preguntarse, ¿cuál es el significado de uno
y menos uno? Es realmente simple. Uno es para
orden ascendente y menos uno es
para orden descendente. Cuando creamos índice, Mongo DB disparó que rellenan los datos en orden ascendente
o descendente Esto ayudará a Mongo Deb
a encontrar datos rápidamente. No te preocupes, te lo
explicaré después de la degustación. Aquí pasamos uno para orden
ascendente y hecho. Así es como creamos índice para correo electrónico llenado, una línea de código. Todo el otro código en este
archivo es para degustación, no te
preocupes por eso. Solo queremos ver
creando índice, nuestra consulta se está volviendo
rápida o no. Así que aquí volvemos a ejecutar esta misma función
find user y
vamos a ejecutar este archivo. Mira, aquí obtenemos
133 milisegundos. Déjame ejecutar este
archivo una vez más. Mira, ahora solo toma
76 milisegundos. Me sale tanto tiempo
porque en mi sistema, actualmente se están ejecutando muchos
softwares grandes Anteriormente, cuando pruebo
esto sin ningún software, está
tardando 60
milisegundos antes agregar el índice y
después de agregar el índice, solo
toma cuatro milisegundos Es casi 15 ngs
más rápido que sin consulta de índice. Esto es realmente interesante. Además, estamos obteniendo el tiempo de consulta en milisegundos
porque actualmente nuestra aplicación se está ejecutando localmente y también nuestra
base de datos es local Si desplegamos ambas
cosas en Internet, entonces los 130 milisegundos pueden llegar a ser 1.3 segundos con index, ejecutamos esa misma
consulta en 0.7 segundos. Imagina lo rápido que
se vuelve nuestro sitio web , por eso
la indexación es muy útil Déjame mostrarte el índice
que creamos. Abra la brújula Mongo Divi, vamos a los índices Ver, aquí tenemos dos índices. El primero es para ID de subrayado, y el segundo es para correo electrónico Entonces en la colección Mongo Di B, Mongo DB siempre crea índice
para subrayado ID archivado, y esa es la razón cuando
buscamos datos por su ID, entonces obtenemos esos Ahora aquí en la parte inferior, tenemos otra función
llamada width index. En esta función,
primero creamos índice manualmente usando esta línea, y luego escribimos consulta fina. Al final de la consulta, utilizo este método explicado. El método explain te ayuda a analizar cómo Mongo
DB ejecuta una consulta Muestra si
Mongo DB está usando un índice o realizando
un escaneo de colección completa Dentro de esta explicación, pasamos las estadísticas de ejecución de cadenas y simplemente unst log a estos usuarios Veamos qué
obtenemos dentro de esto. Aquí en el lugar de la función de usuario
fina, agregamos la función de índice B y simplemente me dejó mover
esto en la parte inferior. Los cambios y echar un vistazo. Vamos a ejecutar esta
aplicación usando nodo, índices de
degustación punto js. Mira aquí obtenemos todos los detalles sobre la consulta como estadísticas de
ejecución, comandos,
información del servidor, y mucho más. Aquí solo necesitamos
ver las estadísticas de ejecución. Aquí podemos ver
y volver a uno, lo que significa que
se devuelve un dato del squery si vemos
el
total de documentos examinados, que también es uno, si no
creamos aquí índice
para campo de correo electrónico, entonces estos documentos totales examinados serán mucho
más altos que esto Déjenme mostrar eso también. Aquí tenemos sin función
de índice. Primero en esta función, elimino todo el índice de
nuestra colección de usuarios, y luego ejecutamos la misma
consulta con el método explicado. No te preocupes en nuestra aplicación de nodo
real, solo
usaremos el método userschema
dot index cuando definamos el esquema
de la colección Agregué estos dos
métodos para simplemente eliminar y agregar índice
usando la función. Ahora llamemos a esto sin función de
índice y pasemos
aquí el mismo correo electrónico. Ahora otra vez, ejecute este archivo, nodo probando índices punto js. Consulta aquí en los estados de
ejecución, obtenemos el número regresa a uno y el total de documentos
examinados a 100,000. Por eso está tomando
más tiempo que con el índice. Anteriormente, si
verificamos con índice, obtenemos los documentos totales
examinados a uno, y es por eso que al
crear índice, nuestra consulta se vuelve rápida. Ahora podría preguntarse ¿cómo por índices nuestra consulta se está
volviendo así mucho más rápida? ¿Qué está pasando aquí? Eso lo veremos en
la siguiente lección.
89. Cómo funcionan los índices en MongoDB: Entonces anteriormente tenemos problema. Nuestra consulta de base de datos está escaneando los cien
mil documentos uno por uno para encontrar correo electrónico
específico, lo que
hace que nuestra consulta sea lenta. Y resolvemos ese
problema simplemente
aplicando índice para correo electrónico llenado. Pero la pregunta principal es ¿cómo? ¿Qué sucede detrás de
escena cuando aplicamos índice? Déjame explicarte con
interesante ejemplo. Imagina que estás en una
biblioteca con 100 mil libros. Ahora, necesitas encontrar
libro titulado Harry Potter. Ahora bien, si los libros no están
dispuestos en ningún orden, hay
que comenzar
desde el primer libro, revisando cada título
uno por uno y continuar ese proceso hasta que
encuentre el libro de Harry Potter. Esto es como escanear
los 100 mil documentos en Mongo Di B sin un índice que podemos
considerar lento Ahora, digamos que la biblioteca
crea un índice, algo así como la lista para almacenar la información de los libros. Esa lista, o podemos
decir en ese índice, tenemos títulos de libros, que ordenamos alfabéticamente, y también agregamos un puntero al yo exacto o ubicación en
la
que se coloca ese libro Ahora cuando
buscas a Harry Potter, vas al índice,
encuentras a Harry Potter en segundos porque está
ordenado alfabéticamente, y luego con el título del libro, agregamos el puntero Usas ese puntero para ir
directamente al libro. En lugar de escanear
100 mil libros, encontrarás tu libro en
solo un milisegundos. En Mongo DB, también,
cuando creamos índice, Mongo Di B crea una estructura similar a un
árbol, que llamamos como árbol B o árbol equilibrado y
acortamos nuestros datos en orden
ascendente o descendente
dependiendo de que pasemos el valor
como uno o menos uno Con ese relleno, se almacena el puntero que hace la ubicación del documento
original. Al crear índice, reducimos el número de
escaneos de documentos y por eso, nuestra consulta fina se convierte en
f para ese relleno. Ahora podrías preguntar los datos
cortocircuitados, también, tenemos que encontrar nuestros datos, cómo está tomando menos tiempo que revisar todos los
documentos uno por uno Esta es la pregunta realmente
genial. Déjame explicarte
eso. El caso es, supongamos que si tienes matriz
sin clasificar y una matriz en
cortocircuito en ambas, quieres encontrar el elemento 60 Entonces en la matriz de ambos, no
necesitamos escanear cada número, ¿cómo puede esa matriz
ordenada tomar menos tiempo? Como vemos anteriormente, cuando creamos índice, Mongo B crea estructura de árbol de batería
o equilibrio con puntero adjunto
a cada dato Pero en esta Batería, Mongo Dib también tiene
que buscar datos,
y para buscar los datos, Mongoi utiliza otra técnica de búsqueda, a la
que llamamos como
búsqueda que llamamos como Entonces, cuando no creamos índice, Mongo Db usa la técnica de
búsqueda lineal, lo que significa que Mongo Db verifica los datos uno por uno
para todos los documentos Y si creamos índice, entonces Mongo Dib usa la técnica de búsqueda
binaria Déjame
explicarte rápidamente cómo funciona la búsqueda
binaria para que
puedas entender mejor. Imagínese aquí hemos
cortocircuitado matriz de números diez, 20, 30, 200 En esta matriz,
queremos encontrar 60. Ahora hay dos formas. Primero, comprobamos diez
es 60, no, 20 no. 30, no. 40, no. 50, no. 60, sí. Entonces aquí buscamos todos los
elementos uno por uno, que es el ejemplo
de búsqueda lineal. Ahora déjame explicarte
qué es la búsqueda binaria. En la búsqueda binaria,
hacemos jerms a la mitad. Entonces aquí en el lugar
de checar diez, 20, 30, nos jum directamente a la
mitad de la lista, que es 50 Aquí comprobamos, 50 es
mayor que 60 o menor que 60. Sí, 50 es menos de 60, así que nos movemos al
lado derecho de la lista. Ahora nuestra lista es de 50 a cien. En esto, volvemos a
saltar sobre la mitad. Dime en qué
artículo saltaremos. Bien, saltamos sobre el 80. En eso, volvemos a verificar, 60 es mayor que 80 o
menor que. Es menor que. Entonces si nuestro número es menor que, entonces nos movemos hacia el lado izquierdo. Ahora 50-70, volvemos a
saltar sobre la mitad, que es 60, y
obtenemos el elemento Entonces en el lugar de conseguir 60 en seis átomos
en búsqueda lineal, aquí estamos obteniendo 60 en tres a cuatro átomos.
Esto es muy rápido. ¿Qué dices? Y
esto es sólo un diez datos. Imagina que tenemos 1 millón de datos, entonces cuánto tiempo
podemos ahorrar usando index. Entonces es por eso que el índice
hace que nuestra búsqueda sea más eficiente y lleva menos
tiempo que la búsqueda lineal. También tenga en cuenta que la búsqueda binaria
funciona sólo en array ordenado, y es por eso que cuando
creamos índice, pasamos si
debe ascendente array o descendente array
uno o menos uno. Ahora
entiendes adecuadamente qué es el índice y por qué
funciona muy rápido. Ahora bien, ¿eso significa que
necesitamos crear un índice para cada campo de nuestra
base de datos? La respuesta es no. Tenemos que crear índice
solo para aquellos rellenos para los
que queremos buscar. Supongamos que tenemos datos de usuarios y queremos buscar
usuarios por nombre. En eso, podemos crear
índice con nombre relleno. Entonces Mongotbcmmand,
solo utilizamos índice para grandes colecciones en las que
vamos a almacenar miles
o Podrías preguntar por qué no
podemos crear un índice para pequeñas colecciones
o para cada campo. La razón es cuando
creamos índice, como sabemos, Mongotb crea la estructura Btree, pero que Bitr también se
almacena en nuestra base de datos, y Déjame mostrarte.
Abra la brújula Mongoib y vaya a nuestra Ver, aquí conseguimos colección de
usuarios. Aquí está el
tamaño de almacenamiento de nuestra colección, que es 6.65 B en
el lado derecho, C, tenemos índices totales
tamaño a 3.86 B, lo que significa que nuestros datos
son de sólo tres MB y otros 3.86 B es recién
adquirido Entonces más del 50% es
adquirido por índices, lo cual es realmente enorme, y son solo dos índices. Si creamos índice
para todos los campos, entonces cuánto
tomará nuestro almacenamiento. Además, cuando tenemos
pequeñas colecciones, entonces nuestra búsqueda lineal también
se ejecutará rápida. La diferencia es
ignorable y
por eso no creamos índice
para colecciones pequeñas Cuando necesitamos
aplicar índice, primero,
cuando tenemos grandes colecciones, cuando tenemos grandes colecciones, indexación ayuda a usar conjuntos de datos
como millones de registros Sin índice, Mongo Di B comprueba cada documento uno por uno Segundo, cuando la búsqueda
es frecuente. Si a menudo buscamos
un relleno como correo electrónico, nombre de
usuario, ID de pedido, entonces podemos indexarlo. Por ejemplo, en el sistema de registro de
usuarios en el que buscamos
usuario por correo electrónico. Esto aumenta significativamente la
velocidad de lectura. Siguiente, tercero, cuando el
cortocircuito es común. Si a menudo usamos
Método Corto por Precio, entonces podemos indexar
ese precio llenado. Por ejemplo, en el listado de productos de
comercio electrónico. El tiempo, queremos acortar
los productos por precio o fecha. Índice evitar escaneo
de recolección completa. Número cuatro, cuando usamos rellenos en buscar actualización,
y método delete. El índice acelera
estas operaciones. Ahora veamos también cuándo
no necesitamos aplicar índice. Número uno, cuando nuestra
colección es pequeña. Si solo tenemos unos
cientos de documentos, entonces la búsqueda sin
índice ya es rápida. Número dos, nuestros datos cambian
constantemente. Índices ralentiza, inserta, actualiza y elimina método, porque Mongo Di B debe tener que actualizar el
árbol de índices cada vez Por ejemplo, un sistema de registro. En eso,
se agregaron nuevos registros cada segundo, y esto se ralentizará si
creamos un índice para el registro. Número tres, cuando ya
tenemos demasiados índices, cada índice usa almacenamiento, demasiados índices es igual
al espacio de disco conferido Por lo que la solución es solo indexar
los rellenos más importantes. Número cuatro, cuando estamos
cotejando muchos rellenos diferentes, debemos evitar el índice Entonces, si nuestras búsquedas varían
mucho en rellenos como nombre, correo electrónico, edad, ciudad, indexación, cada uno podría no ayudar Por lo que la solución es solo
indexar rellenos de uso frecuente. Entonces, para recapitular rápidamente, creamos índice en Mongodi B
cuando tenemos gran colección Queremos que nuestra
consulta sea realmente rápida. No te preocupes, aplicaremos estos índices en nuestro
proyecto cuando lo necesitemos. Ahora, a partir de la siguiente sección, comenzaremos a construir
nuestro Proyecto dos, que es backend de
aplicaciones de comercio electrónico
90. Sección 09: proyecto 02 y planificación: Es momento de crear
nuestro segundo proyecto. En este proyecto, vamos a
crear la aplicación de comercio electrónico Ben. No vamos a crear front end porque ese no es
alcance de este curso. Para eso, tengo por
separado el curso Reac JS. Ahora cuando empiezo un nuevo proyecto, me gusta planear el
proyecto más o menos. Me va a dar claridad, y también
te recomiendo que hagas lo mismo. Entonces, antes que nada, tenemos que visualizar el front-end básico, no el diseño perfecto,
solo visualizar. Por ejemplo, aquí estamos
creando aplicación de comercio electrónico. En ese sitio web, el usuario puede crear cuenta o
iniciar sesión en el sitio web. Después de eso,
pueden ver la lista de productos y al
hacer clic en ese producto, pueden ver todos los detalles
sobre ese producto, más imágenes y descripción. No importa que el usuario
haya iniciado sesión o no. Todos los usuarios pueden ver los productos. Después de eso, el usuario puede ver
su historial de pedidos. Además, pueden agregar
producto a la tarjeta, eliminar el producto de la tarjeta y realizar el pedido mediante pago. Entonces estas son las características
que necesitamos para nuestro proyecto. No te preocupes si no conoces todas las características
de tu proyecto, como te dije, esto
es sólo de plan. En el futuro, podremos agregar o eliminar funciones
de nuestra aplicación. Entonces primero,
comenzaremos con
la creación del modelo de usuario crear API
para la autenticación de usuarios. Después de eso,
pasaremos a los productos, luego a la tarjeta, y luego a los pedidos. Esto te va a encantar
y además obtendrás la confianza para
no crear proyectos por tu cuenta. Empecemos este
increíble proyecto.
91. Creación de un nuevo servidor: Ahora en nuestra carpeta de proyectos, vamos a crear una nueva carpeta para nuestro segundo
proyecto de comercio electrónico llamado cart Wish Backend y simplemente abra este
proyecto en el VS coe Bueno. Ahora cuando creamos un nuevo proyecto,
¿qué debemos hacer? Derecha. Inicializaremos
el proyecto usando NPM int Y. Esto creará un
paquete de puntos y archivo Ahora aquí, creamos un nuevo
archivo llamado index dot js. Vamos a crear un servidor Express
para esta aplicación. Const Express es igual al paquete Express
requerido. Después de eso, estamos
creando la aplicación Express, aplicación
Const es igual a, y llamamos aquí a esta función
Express Ahora vamos a escuchar este servidor, así app dot LISN aquí, primero pasamos puerto, pero en el lugar de
pasar valor codificado duro, creamos aquí la variable
const port es igual a process dot nv dot
Port o 3,000 Entonces si tenemos puerto
en el ambiente, entonces va a usar eso
más tenemos 3,000, y simplemente pasamos por aquí
puerto en primer lugar. Y lo que pasaremos en
el segundo parámetro, pasamos aquí la función callback
y simplemente consol dot log El servidor está escuchando en puerto, paquetes de
dólar Ci, puerto. Ahora, ejecutemos esta
aplicación y comprobemos que lo hemos hecho
correctamente o no. ¿Por qué creo que podríamos
llegar aquí error? A ver, el error en la vida de
los desarrolladores es constante. No te asuste con eso. Abre terminal y ejecuta
aquí nodebn index dot js. Ver, aquí nos sale el error. Oh, nos olvidamos de instalar el paquete
Express. Por lo que NPM instala Express. Y si quieres usar
la misma versión que la mía, entonces escribe a la velocidad
5.1 0.0 y pulsa Enter. Bueno. Ahora vamos a intentarlo de nuevo. Ver, aquí conseguimos escucha
de servidor. Ahora en la siguiente lección,
conectaremos esta aplicación
con la base de datos.
92. Conexión a la base de datos: Conectemos esta aplicación con una base de datos porque necesitamos almacenar información sobre
usuarios, productos, etcétera En primer lugar, en nuestro proyecto, tenemos que instalar mangos No vamos a repetir
el mismo error. Abre terminal y crea
una nueva terminal desde aquí. De esta manera, no necesitamos
detener nuestra aplicación. Así NPM instalar Mangosta
en el rojo 8.13 0.2. Bueno. Vamos a minimizar esto. Ahora en nuestro archivo index dot s, importamos mangos const es
igual a requerir mangos Y después de esta app, escribimos Mongos dot connect En el primer argumento, pasamos nuestra cadena de conexión. Si no recuerdas la cadena de
conexión de Mongo Di B, puedes obtenerla
del Mongo DB Aquí en la barra lateral, tenemos esta conexión de
host local, y en el lado derecho de eso, tenemos opción de tres puntos. Aquí, obtenemos Copy
Connection String. Y pegarlo en la
primera posición. Ahora, al final de esta cadena de
conexión, agregamos nuestro nombre de base de datos, que es Card fish. Ahora, como sabemos, esta
expresión devuelve una promesa. Así que usamos aquí el método dot TN y dentro de él simplemente
consola dot log. MongoDB se conectó correctamente. Ahora, después del método entonces, también
agregamos
método de caché de puntos para manejar errores. Aquí, obtenemos error
Object, función de error, y gonsol dot log, conexión
MongoDB, falló,
e imprimimos este Ahora probemos esta
implementación, guardemos los cambios, y en el terminal, vea, aquí conseguimos que Mongo DB se
conecte con éxito En la siguiente lección,
diseñaremos nuestro modelo de usuario.
93. Ejercicio: creación de modelo de usuario: Déjame darte poco ejercicio porque
ya hicimos esto. Por lo que hay que crear
modelo de usuario para este proyecto. Tienes que decidir qué usuarios llenamos queremos para este proyecto. No te preocupes si agregas
más rellenos o menos rellenos, pero lo importante es que
piensas en rellenos. Así que recuerda, cuáles son las
características relacionadas con los usuarios, y según eso,
decidir el relleno del usuario. Defina un esquema para esos rellenos y luego cree un modelo
con ese esquema. Después de completar este ejercicio, puedes ver la solución. Ahora veamos la solución. En primer lugar,
vamos a crear aquí nueva carpeta llamada models. Y dentro de esta carpeta, crearemos un nuevo archivo
llamado users dot js. Bueno. Aquí, antes que nada, importamos Const Mongos es
igual a los mangos requeridos Porque sin mangos, ¿cómo podemos crear esquema o modelo El esquema de usuario de costo es igual
al nuevo esquema de puntos de mangos. En los paréntesis de Cali, pasaremos nuestro esquema
en par de valor clave. En primer lugar, nombre a objeto, establecemos su tipo en string, requerido para drew, y
establecemos la longitud media en tres. Después de eso, podemos establecer campo
Emil y establecemos
su tipo en cadena, también requerido para
true también necesitamos único a true porque todos los usuarios deben tener
solo un correo electrónico único Y para la mejor práctica, también
agregaremos
minúsculas a true Después de eso, qué
campo podemos agregar, sí, podemos agregar contraseña, escribir a cadena, y también
tenemos que requerido a true. Después de eso, para el usuario de comercio electrónico, necesitamos dirección de entrega
para entregar el producto. Así que escriba a string
requerido para true, y también establecemos la
longitud media en cinco. Después de eso, podemos especificar
el rol para cada usuario, ya sea usuario o administrador. Así que establecemos que es tipo a cadena. Podemos restringir el campo de rol solo dos opciones mediante el uso de la propiedad
Enum a array Aquí pasamos nuestros
valores usuario o admin. Además, podemos establecer su valor
por defecto a usuario. Si queremos cambiar
el rol a admin, entonces tenemos que
acceder a la base de datos. Por defecto, todos los usuarios
rol establecido como usuario solamente. Creo que eso es prácticamente
todos los campos para el modelo de usuario. Si en el futuro, necesitamos
más funcionalidad, entonces también podemos
modificar el esquema. No te preocupes por eso. Además,
si durante el ejercicio, tomas diferentes
nombres para estos rellenos, entonces puedes
cambiarlos, igual que el mío. De lo contrario, podría
darte error en el futuro. Ahora tenemos listo el esquema de usuario, así podemos crear un modelo
usando este esquema. Así que el usuario de Const es igual
al modelo de punto Mongos, y lo que pasamos en
la primera posición Correcto, pasamos el nombre singular del modelo que es usuario. En el segundo argumento, pasamos el esquema de usuario. Además, vamos a exportar
este modelo de usuario. Lo necesitaremos en
la ruta del usuario. Las exportaciones
de punto del módulo son iguales al usuario. Perfecto. Ahora en la siguiente lección, crearemos la primera ruta de este proyecto para
crear un nuevo usuario.
94. Crear el nuevo usuario: Ahora vamos a crear una API
para crear nuevo usuario. Aquí, creamos una nueva
carpeta llamada rutas. En esta carpeta, crearemos todas nuestras rutas en archivos
separados. Crear un nuevo archivo usuarios punto js. Ahora bien, ¿recuerdas cómo podemos crear API en un archivo separado? Si tenemos que crear API en
nuestro archivo principal index dot js, entonces podemos usar
esta variable de aplicación. Pero, ¿cómo podemos crear
API en un archivo separado? Bien, vamos a crear
router para eso. Entonces primero, ingresamos Express es
igual a Express requerido. Después de eso, este expreso tiene método router al
que podemos llamar. Esto nos dará router. Almacenarlo enrutador invariable. Bueno. Ahora vamos a crear API
para crear un nuevo usuario. Qué método podemos usar aquí, get o put,
usaremos el método post. Entonces Router obtuvo post. Aquí escribimos nuestro punto final, que es la barra diagonal hacia adelante, y después de este punto final, agregaremos la función de devolución de llamada, que se ejecutará cuando alguien
llame a API con este Esta función tiene dos
parámetros de solicitud y respuesta, y función de
error. Ahora, antes que nada,
en esta función, queremos valores que el usuario
pasa en el cuerpo de la solicitud. Por lo que const los datos de usuario son
iguales a solicitar el cuerpo del punto. Vamos a Const dot registrar
estos datos de usuario. Y después de eso, simplemente
responsDTSN o podemos usar aquí respuesta dot JSON porque
estamos enviando datos de JSN,
que son estos datos que Ahora vamos a comprobar que nuestra API está
definida correctamente o no. A mí me gusta dar pequeños pasos porque no va a
crear confusión. Esto está funcionando, entonces
podemos pasar a la lógica principal. Actualmente, definimos API aquí, pero tenemos que agregar esta ruta
en nuestro archivo index dot js. De lo contrario, no va a funcionar. Esto lo conocemos bien. Así que vamos a
exportar este router usando el módulo dot export
es igual a Router. Guarde este archivo y
diríjase al archivo index dot js. Aquí, después de la conexión
Mongo DV, podemos agregar app dot U y
en la primera posición, agregaremos nuestro prefijo API,
slash API slash user, y en la segunda posición, tenemos que pasar Router, que
exportamos desde Entonces en la parte superior,
agregamos costo rutas de usuario es igual a requerir
aquí periodos. Aquí vamos a la
carpeta de rutas y dentro de
ella ruta de usuarios. Ahora podemos simplemente pasar ruta de
este usuario aquí.
Ya lo hicimos. Recuerda, y no te preocupes si no
recuerdas la sintaxis, está completamente bien. Muchas veces, también
olvidé la sintaxis. Por ahora, concéntrese en
construir la aplicación. Guarde los cambios y
probemos esta API de usuario. Entonces en licitación cliente aquí podemos ver nuestra actividad
anterior, pero no quiero mezclar las cosas
con el proyecto anterior, vamos a las colecciones
y desde el lado derecho, tenemos opción nueva colección
y darle nombre cartwis Vamos a añadir todo nuestro
sabor API en esta colección. Del lado derecho,
tenemos más opciones. Haga clic en Crear nueva carpeta
y darle nombre a los usuarios. Por lo que en esta carpeta de usuarios, guardaremos todos nuestros
gustos API relacionados con el usuario. Se puede ver lo
sistemático que se ve esto, y si en el futuro, visitamos este proyecto, no
nos confundimos. Entonces creamos una nueva solicitud
y le damos un nombre. Crear un nuevo usuario. Selecciona el método a publicar, e ingresamos a nuestra
APIURL que es DTP, Columna Abo barra hacia adelante Host
Local, Columna 3,000, o lo que sea que uses
como usuario de APIs de puerto No olvides agregar este prefijo. Para enviar datos en el
cuerpo de la solicitud, seleccionamos su cuerpo y
pasaremos los datos aquí
en formato JSON. Objeto, nombre del primer campo, asegúrate de que escribimos
en códigos dobles. Valor para codificar plas A continuación, tenemos correo electrónico para codificar
en el gmail.com rojo Después de eso, qué relleno agregamos, déjame verificar
el esquema del usuario. Sí, tenemos contraseña
y estado de entrega y ambos son requeridos. Contraseña, y en cadena,
uno, dos, tres, 45678 y dirección de entrega
a digamos XYZ, en XYZ Asegúrate de usar el mismo nombre relleno que
usamos en el esquema. De lo contrario, obtenemos error. Ahora, enviemos esta solicitud. ¿Qué opinas?
¿Funcionará o no? A ver. Enviar la solicitud. Mira, aquí obtenemos el estado 200, lo que significa bien,
pero no obtenemos nuestros datos en
la respuesta a esta solicitud. Comprobemos Consola A. Vea aquí también, obtenemos undefined. ¿Puedes adivinar por qué vuelve a suceder
esto? Recuerda, cuando queremos
obtener datos de
solicitud del cuerpo, necesitamos usar un
middleware para convertir los
datos en Ahora recuerdas, en el archivo index dot js,
antes de esta ruta, agregamos app dot ug para
agregar middleware y simplemente pasamos aquí
express dot Jason Por esto, obtendremos datos de la solicitud del organismo.
A ver si los cambios. Volvamos a enviar la solicitud. Ver, ahora estamos obteniendo
los datos en la respuesta, nuestra implementación actual
está funcionando. Ahora vamos a guardar estos datos
en la colección de nuestro usuario. Pero antes de guardar los datos
en la recopilación del usuario, necesitamos verificar
si este usuario ya
existe en
nuestra base de datos o no. No te confundas, mira esto
y tus asignaciones se despejarán. Aquí, necesitamos modelo de usuario
para ejecutar la consulta. Costo usuario es igual a requerir aquí tenemos que
ir una carpeta arriba,
periodo, periodo, slash modelos
y vamos a los usuarios modelo Ahora, después de estos datos de usuario, podemos hacer algo como
este punto de usuario Fine. Aquí pasamos objeto por filtro. Aquí encontraremos usuario por su correo electrónico
único y por valor, pasamos aquí userdata dot email Entonces estamos encontrando usuario, qué correo electrónico es el mismo que
este userdata dot email Además, aquí hay una cosa. Si no tenemos ningún usuario cuyo correo electrónico sea el mismo que
este userdata dot email, entonces este método find
devolverá una matriz vacía Entonces, en lugar de este método find, podemos usar aquí Find one method. Si el usuario no existe, entonces este método find one
devolverá undefined, y eso nos ayudará a
escribir la condición. Entonces usaremos aquí
Encuentra un método. Como sabemos, esta expresión
volverá promesa, así que tenemos que esperar aquí, y para usar esperar, tenemos que hacer de esta función
Cavey una Bueno. Ahora, vamos a almacenar el resultado en la
variable llamada user. Ahora puedes simplemente
poner aquí condición. Si el usuario está disponible, entonces devolveremos el
error en la respuesta. Entonces respuesta Dodge estado a 400 por mala solicitud y también en la respuesta
queremos enviar datos, así punto Json, y
aquí pasamos objeto con mensaje usuario
ya existe. Ahora aquí hay una cosa. Si
el usuario ya está disponible, no
queremos ejecutar
esta lógica inferior. Para ello, tenemos que pasar aquí regreso antes de esta
respuesta punto Status. De lo contrario,
ejecutará el código hacia adelante. ¿Y si el usuario no está disponible
en la colección del usuario? Derecho, almacenaremos los datos
del usuario en la recopilación. Entonces const nuevo usuario es
igual a nuevo usuario, y aquí en el objeto, pasamos nuestros datos Así que nombre a userdata nombre de punto y correo electrónico a userdata dot Espera, aquí tenemos que escribir datos de
usuario varias veces. En lugar de eso, podemos
desestructurar nuestro objeto aquí. Entonces en el lugar de los datos del usuario, agregamos Objeto y pasamos rellenos nombre que obtenemos
de request dot body. Esto se llama como Desestructuración de
objetos. Entonces tenemos nombre, correo electrónico, contraseña y última dirección
de entrega. Asegúrese de que escribimos aquí el mismo nombre relleno que
pasamos en el cuerpo del punto de solicitud. Ahora en el lugar del nombre del punto
userdata, podemos escribir solo nombre Además si el nombre de propiedad y un nombre de variable de valor es el mismo,
entonces podemos eliminar esto. Pero para que entiendas, no lo
voy a quitar. Correo electrónico a correo electrónico contraseña a contraseña y
dirección de entrega a dirección de entrega. También, tenemos que cambiar aquí en el método fino, correo electrónico a correo electrónico. Ahora tenemos nuevo objeto de usuario, así podemos guardarlo
en nuestra base de datos, nuevo usuario punto c, y esta es la operación asíncrona Por eso nos adherimos aguardan. Ahora, esto devolverá el usuario
almacenado de la base de datos. Si no queremos devolver
los datos de usuario almacenados, entonces también podemos usar
estos nuevos datos de usuario. No te preocupes, obtenemos
ID en ambos objetos. Entonces en la parte inferior, nos adherimos estado de punto de
respuesta
Dime código de estado que
usaremos para nuevos datos. Derecha, usamos 201 punto Json, y aquí pasamos
nuevo objeto de usuario. Perfecto. Ahora vamos a probar
esta implementación. Guarde los cambios y
enviemos la solicitud de publicación. Ver, aquí obtenemos nuevo
usuario con su ID único. Y si revisamos nuestra base de datos, actualice la base de datos,
aquí obtenemos Cardwish Dentro de esto, obtenemos usuarios, y aquí obtenemos nuestro primer usuario. ¿Y si enviamos la misma
solicitud con la misma información de usuario? Ver, aquí obtenemos usuario
ya existe con error, 400 mal pedido. Perfecto.
95. Hashing de la contraseña por razones de seguridad: Ahora actualmente en nuestros datos de uso, estamos almacenando contraseña
en cadena simple. Pero, ¿y si alguien obtiene
acceso a nuestra base de datos, entonces cualquiera puede ver las contraseñas reales del
usuario Para resolver este problema, podemos tener la contraseña en
alguna cadena aleatoria, lo que hace que nuestra
contraseña sea ilegible Para fastidiar la contraseña, utilizamos una
biblioteca muy popular llamada BCrypt NPM instala BCRP. No te preocupes por ello.
Es realmente simple. Entenderemos el
hasing de contraseñas en un archivo separado, y al final,
lo agregaremos en la ruta de nuestro usuario Aquí, creamos un nuevo archivo
llamado pass dots. Bueno. Ahora, antes que nada,
importamos const, Bcrypt es igual
a requerir Ahora Bcrptespecialmente fuerte
porque tenía SLD. Podrías preguntar ¿qué se vende? SALT es una pieza extra de datos
aleatorios agregados a una
contraseña antes de que se tenga. Déjame explicarte
con palabras sencillas. Digamos que tenemos dos usuarios, el usuario A y el usuario B y
ambos eligen contraseña. Digamos uno, dos,
tres, cuatro, cinco. Ahora supongamos que nuestro paquete BrP tiene esta contraseña que
podría verse así Si solo tenemos uno,
dos, tres, cuatro, cinco, sin ningún tipo de sal, el usuario A
y el usuario B tiene contraseña. Mira lo mismo en la base de datos. Esto es un problema porque se
dice que estos dos usuarios
tienen la misma contraseña. Si los hackers ven una contraseña de
atención idéntica, entonces podrían adivinar que ambos usuarios tienen la
misma contraseña simple. Entonces necesitamos SLT para
resolver este problema. SALT no es nada,
solo datos aleatorios, agregados a una contraseña
antes de hesing. Así que antes de UseraPassword,
agregamos algunos datos aleatorios, por lo que su contraseña se ve Para la contraseña del usuario B, agregamos algunos datos aleatorios o vendidos. Entonces es contraseña se ve así. No es necesario, Bcrypt
mantener lo mismo que contraseña. Yo sólo te muestro
para entender. Déjame mostrarte
eso prácticamente. Aquí podemos usar crypt dot y esta función
excepto dos argumentos. primera es la contraseña
original, que es la contraseña
ingresada por el usuario. Por ejemplo, aquí
pasamos uno, dos, tres, cuatro, cinco, y el segundo
argumento se vende redondo. Esto controla el costo del hasing. Alto valor significa más
seguridad pero un hesing más lento. Por lo general, un valor de diez se considera seguro
y razonablemente rápido. Ahora en el tercer parámetro, vea, aquí tenemos que pasar la función de
devolución de llamada porque esta es una operación
asíncrona Pero en lugar de usar callback, podemos usar aquí awight
al principio Para usar un peso, tenemos que escribir
esta expresión con una función sync llamada pass. Y simplemente movemos esta
línea a esta función. Ahora almacene esa invariable llamada st pass y simplemente consola
dot log este st pass Ahora, vamos a llamar a esta misma
función dos veces para que podamos ver contraseña en similar
o SALT está funcionando. Abre terminal y simplemente
ejecuta node spass dot js. Ver, aquí obtenemos dos st contraseña
diferentes. Incluso si pasamos la misma
contraseña uno, dos, tres, cuatro,
cinco, para a, este es
el poder de SLT Implementemos este código
en la ruta de nuestro usuario. Corta esta línea desde aquí y pegarla antes de
nuestra nueva variable de usuario. Ahora hagamos algunos
pequeños cambios aquí. Primero, cambiamos esta contraseña de código duro
uno, dos, tres, 45 con nuestra contraseña, que obtenemos del cuerpo de
la solicitud. Esto generará
contraseña para ese usuario. En el lugar de guardar
la contraseña original, almacenamos esta st contraseña. Además, tenemos que importar
Bcrt en la parte superior. Const Bcrypt es igual
a requerir BCR. Sears los cambios
y echa un vistazo. En nuestra base de datos, hemos
utilizado datos sin hasing. Para que podamos eliminar este registro
de aquí, eliminarlo. Ahora vamos a ejecutar nuestra aplicación
usando normon index dot js. Bueno. Ahora de nuevo, envía la solicitud de correos
con los mismos datos. Ver, ahora tenemos con éxito la contraseña y la
almacenamos en nuestra base de datos. Incluso si alguien ha entrado
en nuestra base de datos, no puede ver la
contraseña tal como está.
96. Validación de entrada de usuario con Joi: Ahora actualmente, nuestra
ruta de usuario está funcionando bien. El usuario de Weg ya está
registrado o no, y además estamos
usando la contraseña, pero hay una regla para
los desarrolladores de Bend. Nosotros como desarrollador de Bend, nunca confiamos en los datos
enviados por el cliente. Tenemos que
validar siempre esos datos. Supongamos en el lugar de nombre, pase de
cliente, propiedad de nombre de usuario. También, a veces se
olvidaron de enviar correo electrónico o incluso contraseña. En ese momento, no podemos almacenar mitad de la información
en nuestra base de datos. Ahora se podría decir que ya
configuramos la validación en nuestro esquema. Deberíamos tener que agregar
una validación más,
sí, a menudo es una
buena idea agregar múltiples capas de validación más allá de lo que está
configurado en el esquema. Realizaremos la
validación de datos de backend en esta lección. Esta es otra capa
de la validación. Si Acker de alguna manera pasa por alto
esta capa de validación, entonces ya tenemos
validación en esquema que
evitará que los datos no válidos
ingresen en nuestra base de datos. Aquí tenemos dos opciones. Se puede realizar manualmente o podemos usar
paquete muy popular llamado Joy. Además, tenemos otros validadores
como Express validator,
Yup y validator Yup y validator Puedes usar lo
que quieras. Me encanta Joy porque es
versátil y fácil de
usar y A se integra bien
con muchos frameworks nodejs, especialmente express dot Déjame mostrarte eso.
Abre terminal y escribe NPM, instala Joy ethert
17.13 0.3. Bueno. Ahora usar la alegría es muy sencillo. En primer lugar, vamos a
importar alegría en este archivo. Entonces const alegría con J es
igual para requerir alegría. Ya sabes
por qué escribimos aquí J porque este
paquete joy devuelve una clase. Ahora con alegría, tenemos que definir esquema para solicitar datos corporales. En este esquema de alegría,
y hacer muchas cosas, igual que lo hemos hecho
en el esquema de usuario. Definimos aquí nueva
variable llamada user schema o create
user schema es igual a, y aquí pasamos joy dot
Object y dentro de este, pasamos nuestro objeto de esquema. En este objeto, pasamos nuestros
campos con esquema Joy. ¿Cuál es el tipo de
propiedades? ¿Se requiere? ¿Cuál es el valor medio, valor
máximo o la longitud media de la cadena ortring length, y
mucho, mucho más En primer lugar, necesitamos
name to joy aquí, podemos especificar el tipo
de campo que es string. Asegúrate de que llamamos a
esta función aquí. Ahora también podemos agregar aquí
media a tres caracteres, y también queremos que esto
se llene a requerido. Hay muchos métodos alegría. Puedes ver todos los métodos
utilizando su documentación. A continuación, tenemos aquí email
fill joy dot string. Ahora para la alegría del correo electrónico, tenemos el método de correo electrónico, esto también valida el correo electrónico y también pin este relleno según sea necesario. A continuación, tenemos contraseña para alegría punto cadena punto Min
26 letra de contraseña, y también necesitamos esto requerido. Última voluntad, queremos validar
su dirección de entrega a joy punto punto Min a
Pi y requerido. Bueno. Aquí tenemos este esquema de
Joy ahora queremos aplicar este esquema sobre los datos que estamos obteniendo en
este cuerpo de punto de solicitud. Por eso escribimos el mismo nombre de campos que
pasamos en el cuerpo del punto de solicitud. Para validar los datos usando Joy, tenemos que utilizar este método de validación de
puntos de esquema de usuarios
creativos . Dentro de esto, tenemos que
pasar qué datos queremos validar y qué queremos
validar, solicitar cuerpo de punto. Ahora, esto devolverá el
objeto que almacenamos en la variable llamada
Joe validation. Déjame mostrarte lo que
obtenemos en esta variable de
validación de Joy. Comento este código inferior y solo valido
esta solicitud dot body aquí y simplemente devuelvo respuesta
dot json, validación de Joy. Di esto en Js y echa un vistazo. Enviar la solicitud de correo. Consulta aquí nuestros datos son validados. Por eso conseguimos que se llene
el valor. Si elimino esta contraseña de solicitar el cuerpo del punto
y enviar el De nuevo. Ver, aquí obtenemos objeto error y en eso tenemos
estos detalles, que es array, y en
eso obtenemos mensaje de error. Se requiere contraseña. Al usar este objeto de error, podemos devolver error
en nuestra respuesta. No te confundas.
Déjame mostrarte eso. Eliminar este método JSN de
punto de respuesta. No lo necesitamos y simplemente
escribimos aquí yo condición y
comprobamos si el
error de validación de alegría está disponible, entonces simplemente devolvemos
error en la respuesta. Devolver Response dot status, 400 para bad request dot Json, y aquí devolvemos Joy
validation dot error Object. Ahora como una buena práctica, los desarrolladores no pasan el objeto de
error completo de aquí. A ellos les gusta enviar
solo mensaje de error. Agregamos detalles de punto, que es la matriz y
accedemos a su primer elemento
por corchetes, cero index dot MESSage
vamos a probar esto, enviar la solicitud sin
contraseña llenada. Ver, aquí obtenemos
contraseña se requiere. Si pasamos contraseña
rellenada de nuevo, así que deshacer, pero en nombre, pasamos sólo dos caracteres. Y enviar la solicitud. Ver, aquí nos sale
bonito mensaje de error. La longitud del nombre debe tener al menos
tres caracteres. En la validación de esquemas de Mongo, no
obtenemos este tipo
de mensajes de error, y por eso a
los desarrolladores les gusta joy Ahora aquí, tengo una pregunta. Si no pasamos por aquí dos
fallas, lo que vamos a conseguir. Así que quita estos dos primeros
rellenos. Enviar la solicitud. Ver, aquí solo obtenemos un error. Joey ejecuta validación
línea por línea. Si la primera línea no
consigue validar, entonces inmediatamente
devolverá error. Por eso devolvemos siempre detalles primer
elemento punto mensaje. Así es como validamos los datos de
entrada que obtenemos
del cuerpo de la solicitud. Puedes eliminar comentario
de otro código. Dios. Para recapitular rápidamente, hay tres capas de
validación en el mundo real, validación del lado del
cliente, que los desarrolladores
front-end
realizan en el navegador Los usuarios pueden ver eso
en el formulario front-end. A continuación, tenemos la validación
del lado de Bacon, que recién
hicimos usando joy. En esto, estamos validando datos, que estamos obteniendo de
front end en request dot body A continuación, tenemos el esquema de Mongo, que es la validación final Evitará que los datos no válidos
ingresen en la base de datos. Si alguien pasa la validación
del lado del cliente, entonces tenemos la validación
del lado del vagón, y si alguien pasa eso también, entonces el esquema de Mangus siempre
está ahí Agregar estas capas proporciona un enfoque sólido para
evitar que los datos no
válidos ingresen a nuestra base de datos y garantiza una aplicación segura y
confiable. Ahora puedes ver que estamos
trabajando como profesionales. Ahora en la siguiente lección, veremos cómo
funciona la autenticación de
usuarios en el mundo real.
97. Cómo funciona la autenticación: Ahora hablemos de la
autenticación de usuarios en el nodo js. La autenticación de usuarios juega un papel
muy importante
en cualquier aplicación. Yo nodejs, hacemos
autenticación usando JWT, o podemos decirlo Ahora podrías preguntar, ¿qué es
esto JWT o JSN WebTKEN? No te preocupes por eso.
Es realmente simple. El token web JSON es una cadena de token larga,
que se ve así. Al usar este token, que vamos a generar
en el back-end, por eso, podemos
autenticar al usuario Déjame explicarte
con ejemplo cómo funciona la
autenticación antes de
JWT y cómo funciona ahora Aquí hay una Harley en la que inicia sesión con su información de cuenta,
correo electrónico y contraseña. Ahora nuestro servidor primero
verifica la información, y si es verdadera, entonces el servidor devuelve
su ID de usuario como respuesta y la almacena
en la sesión u ooki Ahora, cada vez que envía solicitudes de alguna información
segura, digamos, toda su información
bancaria. Entonces servidor primero
pide el ID de usuario, y si tiene ID de usuario, y luego el servidor envía
la información segura. Pero aquí hay un gran problema, el SSN o Cookie en el que
almacenamos nuestro ID de usuario, se puede
modificar fácilmente en el navegador Digamos que cambio este
ID de usuario por otro ID de usuario, luego obtenemos la información
sobre ese usuario. Este enfoque no está asegurado. Ahora para resolver este problema, presentamos el token web JSN Ahora Harley vuelve a iniciar sesión con
su correo electrónico y contraseña. Ahora nuestro servidor primero
verifica la información, y si es verdadera, entonces el servidor devuelve el token único cifrado
largo como respuesta y
lo almacena en el almacenamiento local. Ahora, lo mejor de
este token es que está hecho con detalles de
uso y una clave secreta que solo
definiremos en el servidor. Nadie conoce la clave secreta
excepto tú y tu equipo. Entonces cada vez que Harley
envía solicitud alguna información segura,
luego en el servidor, primero
pedimos el
token JWT y lo verificamos
usando nuestra clave secreta Si se verifica, entonces y luego desde el servidor, enviaremos esa información
segura. Y si cambiamos algo
en la información del usuario, entonces nuestro token también cambiará. Como desarrollador de Bend, nuestro trabajo es enviar
token web JSN cuando los usuarios se
registran o inician sesión y también verificar
el token cuando lo necesitemos Almacenar el token en
el almacenamiento local y todo lo demás es un trabajo
de desarrollador front-end. Establecer una suma, cuando los usuarios inician sesión o se registran
con éxito, enviamos token web JSON, que simplemente funciona
como tarjeta de seguridad. Cuando el usuario solicita datos que solo son accesibles
por el usuario de inicio de sesión, luego el servidor primero verifica
la tarjeta de seguridad, que es nuestro token web JSON y validarla con la clave secreta JWT Ese token verificado,
sólo entonces el servidor devuelve los datos a ese
usuario. Tan simple como eso. Ahora en la siguiente lección,
generaremos el token
web JCN y
lo enviaremos en respuesta
98. Generar el token de JWT para el usuario: Entonces entendemos el token web JN. Es como una tarjeta de seguridad. Ahora vamos a generar un token
cuando el usuario se
registró con éxito y enviemos un
token en la respuesta. Entonces para generar token web JSN, necesitamos paquete
de token web JSN, abrir terminal y escribir NPM, instalar token web JSN Y si quieres instalar
el mismo verson que el mío, entonces escribe a la velocidad
9.0 0.2, y presiona Enter Bueno. Ahora en el
archivo de nuestro usuario en la parte superior, importamos ese
paquete usando require y simplemente lo almacenamos en una
variable llamada JWT Ahora cuando queremos
crear este token, al principio
o al fin, queremos crear token cuando nuestros datos de usuario se almacenen
correctamente. Después de este mismo método, escribimos punto JWT Sign
In el método sign, tenemos que pasar dos argumentos Al principio, tenemos que pasar los datos que queremos
enviar dentro del token. Por ahora, solo queremos
enviar ID de usuario con nuestro token. Objeto y primera propiedad, subrayado a ID de subrayado
nwuser Asegúrate de escribir
aquí, subrayado ID. He cometido este error antes. Además, quiero enviar
la propiedad name de
este nombre de usuario tonuser punto N.
Ahora en el segundo argumento, tenemos que pasar cadena, que es nuestra clave de seguridad Por ahora, pasamos
GWT, clave de seguridad. Podemos pasar cualquier cadena. No hay reglas para la clave. Además, actualmente estamos
pasando esta clave directamente. Pero en la siguiente lección, la
agregaremos en la variable de entorno.
No te preocupes por eso. Ahora, esto generará el token web
JSN, por lo que lo almacenamos en la
variable llamada token Simplemente en el lugar de
enviar nuevos datos de usuario, pasamos solo token. Déjame mostrarte cómo se ve
esta ficha. Guarda los cambios y
desde el cliente Thunder, enviamos nuevos datos de usuario, escribimos el nombre completo y cambiamos el correo electrónico a código one@gmail.com. Asegúrate de agregar la coma
y enviar la solicitud. Mira, aquí obtenemos
este token largo, que acabamos de generar. Ahora, déjame mostrarte
más sobre esta ficha. Entonces copia este token JWT. Asegúrate de no copiar
estos códigos dobles. Abre una pestaña en tu navegador
y busca jwt dot IO. Y esta es la
documentación oficial de JWT. Aquí en las bibliotecas, puede ver la
implementación de JWT para diferentes bibliotecas
diferentes Ahora vuelve a la página principal y desplázate hacia abajo hasta la sección
Depurador Y aquí podemos
decodificar nuestro token. Ahora, entendamos
qué token contiene. Así que más allá de nuestro token aquí. Ahora todos los tokens GWT
divididos en tres partes. primera parte es sobre cabecera, que está en el color rojo. segunda parte trata sobre la carga útil, que está en el morado y última y la
parte más importante es la firma, que está en el color azul. Ahora bien, este encabezado contiene el
algoritmo y el tipo de token, que es muy común.
Enfócate en eso. A continuación, esta carga útil contiene los datos que
queremos pasar con el token. En este caso, pasamos ID de
usuario y usamos un nombre, que es este objeto
en este método de signo. La razón por la que pasamos aquí
estos datos es
que podemos mostrar esos datos en nuestro front-end
sin llamar a API por separado. Después de eso, tenemos
una propiedad más It, que significa emitida en y su valor es el momento en que se genera
nuestro token. Por esto, podemos ver
cuántos años tiene nuestro token. La última parte, que está
en el azul es firma, y se genera en
base a nuestro encabezado, estos datos de carga útil, y la clave secreta que solo está
disponible en nuestro servidor. Por lo que esto evitará que los usuarios obtengan su propio token y luego lo modifiquen con ID para
fingir ser otra persona. Porque si modificas algo
en esta carga útil o encabezado, entonces la firma
se regenerará Por lo que no hay posibilidad de que
los usuarios hagan algo poco ético Por solo esta clave secreta
nuestro token validará. De lo contrario, nos
dará error. Por eso JWT es tan popular. Para resumir rápidamente, cuando los usuarios inician sesión o se registran
con éxito, obtenemos el token web JCN que
simplemente funciona como tarjeta de seguridad Cuando el usuario solicita datos que solo son accesibles
por los usuarios de LogN, luego el servidor primero verifica
la tarjeta de seguridad, que es nuestro token web JCN y validarla con clave secreta
JWT Los dos verificados,
sólo entonces el servidor devuelve los datos a ese
usuario, simple como conjunto.
99. Fijar la expiración de un token: Muchos desarrolladores como
una buena práctica, establecen un tiempo de caducidad para
este token web JSON, como 2 horas o 24 horas. Pasado ese tiempo, este
token no será válido. Si el usuario quiere un nuevo token, entonces tiene que volver a iniciar sesión. Entonces para eso, podemos pasar tercer argumento en
este método JWT Sign, Object, y en eso tenemos la
propiedad llamada caduca en Podemos pasar valores
en milisegundos, si queremos establecer 2 horas, luego escribir dos por 2 horas en
60 por minutos porque 1 hora
tiene 60 minutos en otra vez, 60 porque 1 minuto
tiene 60 segundos y en 1,000 para convertir
segundos en milisegundos Se puede ver que esto es un
poco confuso. Así que también podemos pasar
aquí en cadena a borde, que es de 2 horas. O podemos escribir aquí
un día por un día. Alguna vez te gusta. Un valor numérico se interpreta como un recuento de
milisegundos. Si usa una cadena, asegúrese de proporcionar las unidades de tiempo como
días, horas, etcétera De lo contrario, la
unidad de milisegundos se usa por defecto. Entonces si solo pasamos
aquí 120 en cadena, entonces equivale a
120 milisegundos. Me gusta establecer 2 horas, así que dos borde, este tiempo de caducidad es realmente depende de
su aplicación. Podrías notar en las aplicaciones
bancarias, tu inicio de sesión caduca
en la última vez, como de cinco a 10 minutos. Después de eso, tienes que volver
a iniciar sesión. La razón por la que usan el tiempo de
caducidad para token es porque
quieren asegurar su aplicación. Por otro lado, muchos sitios web de redes
sociales establecen el tiempo de caducidad en
30 días o 60 días. Una vez que ingresas,
no caducan tu token porque quieren que usemos
más de sus redes sociales. El tiempo de caducidad
depende de tu proyecto. Elija lo mejor para
su aplicación. Solo asegúrate de no
molestarte con ExpiRyT.
100. Protege la clave de seguridad en Environnement: Actualmente, pasamos nuestra clave
secreta JWT directamente aquí. Pero en el mundo real,
esto no es seguro porque cuando implementamos nuestra
aplicación en Internet, también
subimos nuestro código en alguna nube como
Github o Gitlab Si escribimos nuestra
clave secreta en este código, todos podrán ver nuestra clave secreta, y esto no es seguro. Entonces en el lugar de
definir la clave secreta aquí, podemos editar en el archivo punto ENV En este proyecto, no
creamos el archivo ENV punto. Crea un nuevo archivo
aquí llamado punto ENV. En este archivo,
simplemente definimos la variable llamada
clave de subrayado JWT es igual a,
aquí vamos a escribir nuestra clave,
que es la clave de seguridad JWT Además, a muchos desarrolladores
les gusta adherir nombre de clave
aleatorio para que nadie pueda
predecir la clave de seguridad. Puedes usar cualquier clave de seguridad, solo para guardar la copia
de seguridad de esa clave de seguridad. Ahora para acceder a esta variable clave de
subrayado JWT en nuestro proyecto, necesitamos configurar Dot NV y qué paquete
usamos para eso, necesitamos paquete DotNV, abrir terminal y simplemente instalar
NPM Bueno. Ahora en el archivo index dot
js en la parte superior, agregamos require dot NV y
llamamos aquí método dot config. Guarda este archivo, y en la ruta del usuario aquí en el lugar de esta cadena
hardcod, agregamos process dot nw
dot nuestro nombre de variable, que es JWT underscore Y hecho. Ahora bien, si necesitamos volver
a usar esta clave, no
tenemos que escribir
la clave original. Podemos escribir proceso punto E
y w punto clave de subrayado JWT. Ahora en la siguiente lección,
crearemos ruta de inicio de sesión en la que nos autenticaremos,
correo electrónico y contraseña
101. Ejercicio Crear ruta de inicio de sesión: Ahora es el momento de
poco ejercicio. Tienes que crear una
nueva API para iniciar sesión, lo que debería ser una solicitud
posterior con sesión de barras de API de
punto final Y en el cuerpo de esta solicitud, el usuario puede pasar dos propiedades, correo electrónico y su contraseña. Entonces antes que nada, en esta API, hay
que encontrar
usuario por su correo electrónico. Si no has encontrado usuario, entonces tienes que enviar error en respuesta con el mensaje credenciales
inválidas, y si el usuario está disponible, entonces tienes que
comparar contraseña. Apenas estos dos pasos. No te preocupes por
comparar la contraseña, deja el ejercicio
a partir de ese punto. Simplemente defina nueva API y
encuentre al usuario con correo electrónico. Después de completar el ejercicio, puedes ver la solución. Entonces espero que resuelvas este ejercicio o al menos
intentes resolverlo. Date crédito por eso. Ahora veamos la solución. En primer lugar, en la parte inferior, definimos una nueva API
usando router punto post. Aquí en la primera posición, pasamos el inicio de sesión de endpoint slash En la segunda posición, pasamos la función de devolución de llamada
con dos parámetros, request y response, y
adherimos la función de flecha Ahora déjame mostrarte mi trigonometría por escribir código sin confusiones Me gusta escribir pasos en comman. Por ejemplo, aquí, el primer paso es encontrar usuario de
base de datos por correo electrónico. Si encontramos usuario, entonces después de eso, comparar contraseña
cifrada. Si la contraseña coincide, entonces creamos el token web JSON
y lo enviamos en respuesta. De esta manera, obtenemos el
camino claro para escribir el código. Primer paso, tenemos que
encontrar usuario por correo electrónico. Para eso, tenemos que obtener datos
del cuerpo del punto de solicitud. Los datos de costo son iguales
al cuerpo del punto de solicitud. O también podemos desestructurar
nuestro objeto aquí. Entonces en el lugar de los datos, agregamos objeto y accedemos a nuestras propiedades,
correo electrónico y contraseña. Ahora usando este
correo electrónico, encontramos usuario. Entonces el usuario de Const es igual a aquí tenemos que
esperar usuario punto Bien uno aquí pasamos objeto de
comparación y
comparamos el correo electrónico llenado
con nuestra variable de correo electrónico, igual que lo hicimos anteriormente Aquí, obtenemos un
error de tiempo de ejecución por usar un peso. Tenemos que hacer nuestra
función asíncrona. Bueno. Ahora podemos
verificar el estado. Si el usuario no está definido, entonces volvemos aquí error. Estado de punto de respuesta 401
para credenciales no válidas, y también enviamos Objeto
GSN con credenciales inválidas de
propiedad de mensaje Ahora bien, ¿y si se encuentra usuario? Sí, tenemos que
verificar que la contraseña esté desordenada o no, pero
aquí hay una cosa Almacenamos la contraseña de usuario
en formato cifrado. No podemos compararlo directamente
con una contraseña de cadena simple. Entonces aquí tenemos que volver a
usar paquete crypt. Así cripta punto comparar la primera posición,
pasamos contraseña, que obtenemos del cuerpo del punto de
solicitud, y después de eso, tenemos que
pasar una contraseña, que almacenamos en base de datos. Entonces usuario punto contraseña. Ahora bien, esta expresión
nuevamente toma poco tiempo, así que podemos esperar aquí y simplemente almacenar ese resultado en contraseña válida
variable. Podemos volver a pasar condición
si la contraseña válida
no está disponible y
devolvemos el mismo error
con el mismo mensaje de error. Yo pego esta línea aquí. Ahora podría preguntarse ¿por qué
enviamos el mismo mensaje de error? Es porque por razones de
seguridad, si especificamos
contraseña no coincide, entonces significa que encontramos usuario y simplemente contraseña
no coincide. Es por eso que los desarrolladores
envían este tipo de mensaje de error credenciales
inválidas. Ahora bien, si la contraseña es coincidente, entonces tenemos que
crear un nuevo token. Copo el código de
la API de registro y
lo pego en nuestra API de inicio de sesión. Solo nosotros para hacer pequeños cambios. Aquí en los datos, tenemos que pasar ID de
guión bajo de punto de usuario y nombre de punto de usuario Al final, simplemente enviamos
respuesta dot Json este token. Bueno. Ahora probemos
esta implementación. Así que ve al cliente Thunder y
en la colección del usuario, crea una nueva solicitud
y dale un nombre, inicia sesión en un usuario. Cambie el método para publicar, y URL a STP,
llame a una doble diagonal hacia adelante Localhost
3,000
slash API slash users slash Login Y en el cuerpo, pasamos
Objeto con relleno de correo electrónico. Aquí, pasamos el correo electrónico, que no creamos el
código 12 athergmil.com También pase la contraseña 12345678
y envíe la solicitud. Ver, aquí obtenemos el
mensaje de error credenciales inválidas. Ahora si escribimos correo electrónico válido y pasamos la contraseña incorrecta
y enviamos la solicitud, vea, seguimos obteniendo
el mismo error. Ahora si pasamos escribimos correo electrónico y escribimos contraseña y
enviamos la solicitud, mira, ahora obtenemos JSON Web Token. Así es como creamos Login API. Simplemente, tenemos que encontrar usuario, comparar su contraseña
con el paquete BCR Si coincidía, entonces generamos JSN WebTKEN y lo enviamos en
respuesta, simple Ahora, antes de seguir adelante, aquí literalmente
copiamos y pegamos el código para generar
el token web JSON Simplemente cambiamos estos datos. Es mejor que creamos una función separada para
generar el token, y luego podremos
usarlo en ambas APIs. Así que en la parte inferior, creamos
una nueva función llamada generar token es igual
a la función de flecha. Ahora a partir de esta función, queremos simplemente devolver token. Copia este
método JWT dot Sine y pegarlo aquí. Ahora aquí solo queremos
pasar diferentes datos. Reemplazamos este objeto de
datos con variable de datos y obtenemos estos
datos del parámetro. Además, si desea establecer un tiempo de caducidad de token
diferente, entonces también puede pasar el
parámetro para eso. Por ahora, no queremos que
2 horas esté bien para ambos. Ahora en la API de inicio de sesión, obtuvimos este objeto de datos, que pasamos en el método de signo de punto JWT
y simplemente llamamos aquí, generamos la función token, y pasamos ese mismo
objeto de datos como argumento Bueno. Ahora, lo mismo
hacemos en registro API, cortamos el objeto de datos, y aquí llamamos a generar para confundir y pasar
aquí ese objeto de datos Por esta implementación, nuestro
código parece más organizado.
102. ¿Cómo autenticar al usuario? ¿Has iniciado sesión o no?: Entonces en la lección anterior, vemos después de registrarse e iniciar sesión, generamos token JWT y lo
enviamos en la respuesta Ahora déjame
decirte qué
va a hacer front end con esa ficha. Entonces, cuando enviamos el token JWT
desde el back-end al front end, front-end
almacenará ese token en el almacenamiento local del
navegador o en la sesión Por eso, el front-end sabrá que
el usuario está conectado o no. Cuando el usuario quiere
acceder a datos seguros, que solo
accede el usuario de inicio de sesión, front-end necesita enviar ese
token con la llamada API. Así que hay muchas formas de
enviar token con la llamada API. Pero más comúnmente, el front-end enviará token en la solicitud, específicamente en encabezado de
autorización. Si su front-end
usa otro método, entonces
contactarán con el backend y luego para implementarlo de esa manera Así que el front-end establece el token
en el encabezado de autorización. Y cuando el usuario quiere
acceder a API protegida, que solo se accede
por usuario bloqueado, luego en el back-end, primero, qué token se verifica o no. Si se verifica, entonces permitimos que el usuario acceda
a esa API, y si el token no está verificado, entonces devolvemos error
con el código de estado 401,
token de autorización requerido. Ahora bien, ¿dónde escribimos esta lógica? Y crear un middleware, especialmente para verificar el token, y podemos agregar ese middleware
para Déjame mostrarte
eso prácticamente. Entonces en nuestro proyecto para
definir un middleware, creamos una nueva carpeta
llamada middleware, y dentro de esta carpeta, creamos un nuevo archivo
llamado Ahora, ¿recuerdas que
es middleware? Middleware es una función
que llama a la siguiente función de middleware o envía una respuesta a Así que aquí definimos
una función llamada middleware
Orth y AV know
for express middleware, obtenemos tres parámetros
request response, middleware
Orth y AV know
for express middleware,
obtenemos tres parámetros
request response,
y next error function. Ahora, antes que nada,
aquí tenemos que
obtener el encabezado de autorización, el encabezado
SeNoth es igual a solicitar encabezados de punto autorización de
punto Asegúrese de escribir la ortografía correcta
de las propiedades. De lo contrario, no
obtenemos el encabezado aquí. Vamos a la consola dot log este encabezado de autenticación para simplemente ver lo que estamos obteniendo
en esta variable En el futuro, podremos
eliminar esta consola. Además, en el mundo real, obtenemos este encabezado outh
como este en la cadena, primero
obtenemos espacio de error, y luego obtenemos el token JWT completo La razón por la que obtenemos aquí este
error es porque es un estándar de autenticación
común y asegurar que el servidor procese
el token correctamente. Ahora antes de verificar el token, tenemos que verificar si obtenemos token o no en este encabezado. Nos adherimos si condición, si O header no está disponible, o adherimos una condición más, oth header comienza
con aquí en cadena, pasamos espacio portador. Si esta condición no es cierta, entonces devolvemos error. Asegúrate de agregar aquí no es cierto. Ahora dentro de esto, devolvemos estado de punto de
respuesta 401 para
solicitud no autorizada dot Jason, y aquí enviamos objeto con propiedad de
mensaje,
autorización, token requerido. Asegúrese de enviar el objeto con la misma propiedad
por cada error. Facilita el
manejo de errores en la parte frontal. Ahora, qué en la cabecera oth. Como sabemos Oh header es
una cadena con prefijo, portador, espacio, y luego token. Entonces tenemos que obtener token
de esta cadena. Es realmente simple. Const token es igual
a oth header. Aquí, utilizamos el método split, y desde donde queremos
dividir directamente del espacio. Entonces pasamos
códigos dobles y espacio. Ahora, este método split
devolverá una matriz así. El primer elemento es portador y
el segundo elemento es nuestro token. Podemos acceder a token
por índice uno. Yo corchete, escribimos uno. Ahora solo tenemos que verificar que
este token sea válido o no. Entonces para eso, necesitamos paquete
JWT en la parte superior, escribimos Cast JWT es igual
a requerir Json web token En la parte inferior, escribimos punto JWT verificar este método
excepto dos parámetros El primero es un token
que queremos verificar, que es este token. En el segundo parámetro, tenemos que agregar la clave secreta
JWT, que es process Env dot
JWT, Ahora bien, si nuestro token se
verifica con éxito, aquí obtenemos los datos de usuario
que enviamos con el token. Podemos almacenarlo en la variable
llamada usuario decodificado. Podemos guardar estos datos de usuario como request dot user es
igual a usuario decodificado. Si en alguna ruta protegida, queremos obtener los datos actuales de los usuarios
registrados, entonces simplemente podemos acceder a
ellos usando request dot user. No te preocupes, te
voy a mostrar eso también a medida que avancemos
en este proyecto. Ahora después de configurar los
datos de usuario en request dot user, no
queremos hacer
nada en este método. Así que simplemente podemos llamar a
la siguiente función, que llamamos el siguiente
middleware en la pila de llamadas Si no llamamos a
esta siguiente función, entonces express no llamará a la función API ni a otra función de
middleware Nuestro servidor se
quedará en este punto, y eso hará que nuestro
servidor sea realmente lento. Siempre llame a la siguiente función al final de la función
middleware Ahora aquí en este código, ¿y si nuestro usuario no
está verificado? ¿Qué pasa si el usuario pasa un
token falso o un token caducado? También tenemos que encargarnos de eso. Por error de manejo,
agregamos aquí try and catch blog y simplemente agregamos estas
tres líneas en el Blog Try. Si obtenemos error en
estas tres líneas, este blog de captura se ejecutará. En este blog de captura, simplemente
podemos devolver respuesta con estado 400 para solicitud inválida dot
Json y Lo que pasamos aquí. Derecha, pasamos aquí objeto
con mensaje de propiedad y mensaje de
error será token
no válido y hecho. Completamos el middleware de
autenticación. También probemos esto. En primer lugar, tenemos que exportar este orddalware para usar este
middleware Así módulo dot Exportaciones. Igual al middleware de Auth. Guarde los cambios y
diríjase a la ruta de los usuarios. Aquí en la parte inferior, después de la ruta de inicio de sesión, agregamos el método Router dot Get y apuntamos a solo slash hacia adelante Después de eso, agregamos función de
devolución de llamada con
solicitud y respuesta Esta es la API normal. Pero, ¿cómo podemos hacer que
esta API esté protegida, lo que significa que solo los
usuarios bloqueados deben acceder a
esta ruta API Para eso, tenemos que agregar middleware antes de esta función de devolución de
llamada En la parte superior, importamos middleware
const. También puedes
llamarlo OT es igual a
requerir que vayamos uno más completo
arriba, middleware Para ejecutar este middleware antes de
esta función de devolución de llamada de la API, tenemos que agregarlo aquí antes de
la Cuando los usuarios envían Get
request a este punto final, primero, se ejecutará esta orth
función middleware En ese middleware, qué token de
acto es válido o no. Si es válido, solo entonces
llamamos a la siguiente función, que ejecutará esta función de devolución de llamada
API Si en nuestra aplicación, queremos crear
cualquier API protegida, solo
tenemos que agregar Omddalware antes de esa función de devolución de llamada de
API Tan simple como eso. ¿ Me puede decir cómo podemos obtener los datos de los usuarios que han
iniciado sesión? Correcto, obtenemos los datos de
usuarios registrados de
request dot user. Así que el usuario costo equivale
a solicitar usuario punto. Y aquí simplemente enviamos a este usuario en el método response
dot json. Ahora vamos a probar esta
implementación. Guarda los cambios y primero, necesitamos generar token. Abra el cliente Thunder
y vaya a API de inicio de sesión. Aquí tenemos los datos, por lo que simplemente podemos enviar
esta solicitud de inicio de sesión. Bueno. Aquí conseguimos el token. Asegúrate de
generar el
token de letras porque establecemos 2
horas de caducidad. Copia este token, y aquí
creamos una nueva solicitud. Dale un nombre, usuario iniciado sesión. En primer lugar, escribimos el punto final
API, que es HTP, Callan double forward
slash local host, 3,000 API Ahora envía esta solicitud. Ver, aquí nos sale el error. Se requiere token de autorización porque no
pasamos el token en
el encabezado de autorización. Entonces para pasar el encabezado de
autorización, vamos a encabezados. Aquí agregamos un nuevo encabezado,
clave para la autorización. Ver, también obtenemos autorización, y aquí lo que vamos a pasar. Sí, tenemos que pasar
token, pero con prefijo, espacio de
error, y aquí
pasamos un token. Asegúrate de no
pasarlo con códigos dobles. Ahora vamos a enviar la solicitud. Ver, aquí obtenemos
los datos de los usuarios de inicio de sesión con nombre ID, Es el que es el emitido en, este es el momento en que
se
genera este token y EXP es
el tiempo de caducidad, lo que significa cuando este
token caducará. Además, si revisamos nuestro terminal, una Consola el encabezado de autenticación Verás, primero obtenemos el prefijo portador, y luego obtenemos token. Entonces así es como agregaremos middleware de
autenticación
para que nuestra API esté protegida Entonces aquí estamos obteniendo
solo nombre de usuario e ID. Enviemos toda la información
sobre el usuario que ha iniciado sesión. Entonces en la ruta del usuario, aquí agregamos Fine query, sconctUser es igual a
esperar usuario dot find Y aquí pasamos nuestro ID de usuario, que es request dot
user dot underscore ID Seleccione punto, y aquí
no queremos enviar contraseña. Yo cadena menos contraseña, y luego devolvemos respuesta
punto jacon este usuario Quitar esta primera
línea de usuario, no la necesitamos. También, tenemos que hacer de
esta función una. Guarda los cambios y toma un. ver, ahora obtenemos los datos completos de los usuarios
registrados. Ahora podemos utilizar esta
ruta para obtener la información completa del usuario de inicio de sesión
actual. Así es como el
usuario autenticado inicia sesión
o no mediante el uso de esta función de
middleware de Os
103. OAuth en detalles: Entonces en los videos anteriores, vimos cómo nos registramos e ingresamos los usuarios usando
correo electrónico y contraseña, lo cual es muy importante. Pero hoy en día, es
posible que haya visto que muchos sitios web ofrecen
algunas características adicionales, como podemos iniciar
sesión con Google, iniciar sesión con Facebook, Twitter, iniciar sesión con Github y la lista sigue y sigue
dependiendo del tipo de sitio web. A muchos usuarios les gusta usar
estos métodos para firmar. Si utilizan estos métodos, no
necesitan
crear una nueva contraseña para otro sitio web
y recordarla. Simplemente usan su ID de Google
alguna identificación social e
inician sesión en nuestro sitio web. Además, es realmente seguro. Por lo que es muy útil que agreguemos estas características en nuestra
aplicación también. Pero antes de agregarlos, podrías preguntarte cómo
funcionan estas características detrás de escena. Entonces aquí está la arquitectura completa del proceso de firma.
No tengas miedo. Escúchala como solo una historia
porque en nuestra vida diaria, ya
estamos usando estas características. Supongamos que aquí hay un Hali que usó un sitio web llamado
Amazon o Ebay Ese sitio web, tiene opción de
firmar o registrarse con Google. Si haces clic en este botón,
este botón lo redirige
a la página de inicio de sesión de Google. Aquí ingresa su correo electrónico
y contraseña de Google e inicia sesión. Si ingresa escribe
correo electrónico y contraseña, entonces algo sucede en la página
web, y al final,
inicia sesión en el sitio web de
Amazon o eBay con su correo electrónico de nombre de usuario sin crear
la nueva contraseña. Esto es realmente increíble. Ahora la parte principal está
pasando entre estos. Déjame decirte lo que
pasó ahí. Cuando Harley ingrese, escriba correo electrónico y contraseña en la
cuenta de Google y presione Iniciar sesión, servidor de
Google generar
un código temporal y enviar este
código temporal a nuestro backend Ahora, en el backend,
usando este código, podemos obtener algunos
detalles de uso
a los que queremos acceder y
almacenarlos en nuestra base de datos, como nombre del usuario, ID de
correo electrónico, etcétera Así que nuestro backend volverá a
ponerse en contacto con el servidor de Google y les
dirá que queremos acceder a los datos de
uso en lugar de
este código temporal Por lo que el servidor de Google verifica el código y extrae los
datos del usuario de ese código. Y luego el servidor de Google envía estos datos de uso
al backend En nuestro back-end,
tenemos estos datos de uso y podemos usar esos datos
de la manera que queramos usar. Al igual que podemos almacenar el nombre de
usuario y el correo electrónico del usuario en nuestra base de datos
y generar un nuevo usuario, o si el correo electrónico del usuario
ya está disponible, no
hacemos nada y simplemente redirigimos al usuario al
front-end con token. Ahora bien, cuando aprenda
por primera vez sobre esta arquitectura, que es el Juramento o podemos
llamar autorización abierta El tiempo, tengo una pregunta y estoy seguro de que tienes
la misma pregunta. ¿Por qué el servidor de Google envía primero este
código temporal o de autorización a nuestro backend ¿Por qué no puede enviar directamente
la información del usuario? Hay algunas razones por las que servidor de
Google envía este código de
autorización. Supongamos que Google envía directamente información de
usuario como correo electrónico o datos de perfil
al front-end, luego puede ser detenida o
eliminada por piratas informáticos y también templada o mal utilizada antes de
llegar a nuestro backend También el código temporal actúa
como un permiso para dormir. Le dice a Google que este usuario ha iniciado sesión y dado
permiso a nuestra aplicación. Solo nuestro back end
con una clave secreta puede extender este código para
los datos reales del usuario. Esta clave secreta nos la
da Google, y solo estará
disponible en nuestro back end InvFle igual que nuestra clave secreta
JWT Por el motivo de seguridad, Google envía primero, solo código
temporal o de autorización. Aquí está el resumen
de cómo funciona OAuth. El usuario primero haga clic en, inicie sesión o regístrese con botón de
Google y luego se redcurs
a la página de inicio de sesión de Google, o podemos decir servidor de Google Ahora, después de eso, servidor de Google, verifique que el correo electrónico y la
contraseña sean correctos o no. Si es correcto, entonces
Google genera código de
autorización y lo
envía al backend Backend nuevamente envía el código de
autorización con la clave secreta
al servidor de Google, y el servidor de Google extrae
los datos del usuario como nombre, correo electrónico, perfil de cerdo, etcétera Ahora, por fin en el back-end, podemos almacenar esos
datos en nuestra base de datos, o si el usuario ya está disponible, entonces simplemente podemos
redirigir al usuario a página principal del
front-end
con JWT Token Tan simple como eso. Entonces
esta arquitectura funcionará para todo tipo de redes
sociales como
iniciar sesión con Facebook, iniciar sesión con Github,
Twitter, etcétera No sólo para Google. Yo uso aquí Google como ejemplo. Si necesitamos Facebook, entonces este
servidor de Google cambió por Facebook autoriza y servidor o Github autoriza y Ahora en la siguiente lección, prácticamente
implementaremos este Juramento en
nuestra aplicación Catwis
104. OAuth en una aplicación de nodos: inicia sesión con Google: Implementemos el inicio de sesión con función de
Google en
esta aplicación. Y para eso, necesitamos un
paquete llamado passpod dot js. Entonces en OT Architecture, cuando el usuario haga clic
en iniciar sesión con Google Pattern, redirigiremos al usuario a
Supongamos Local host Columna 3,000 slash APIs OT
slash página de Google Esta es nuestra
API de backend. ¿Cómo podemos definir? Queremos mostrar la página de inicio de sesión de
Google o enlazar el servidor de Google
con esta página. Además, si en el back end, obtenemos el código de autorización, ¿cómo podemos enviar solicitudes al servidor de
Google y
recuperar los datos del usuario? Sí, podemos
hacerlo todo de forma manual, pero el pasaporte Js Library lo
hace mucho más fácil. Nosotros lo usaremos.
No te confundas. Simplemente vea esta
lección completa y obtendrá cómo está funcionando esta
implementación de Juramento Entonces vamos a la página de passports.org. Aquí podemos ver pasaporte es
middleware de autenticación para No Jz, extremadamente flexible En la parte inferior, obtenemos todas
las estrategias como Facebook, Twitter, Google,
Github, etcétera No te preocupes, simplemente ve a la barra de
búsqueda y busca aquí, Google, y selecciona este
pasaporte Google Oth dos. Asegúrate de no
seleccionar este juramento 20. Usamos Oth dos. Estos dos son muy similares, pero este Juramento 20
es una estrategia más antigua No está realmente
bien cuidada. Entonces usaremos este OR dos, que tiene nuevas características y
se mantiene activamente
por pasaporte. Déjame acercarme un poco. Sí. Entonces, antes que nada, necesitamos instalar este paquete. Entonces copia este comando de
nuevo al código Vas, open terminal, y
en ese terminal, simplemente
pasamos el comando aquí. Y para la misma versión, se
puede escribir a
la tasa 0.2 0.0. Y también, necesitamos
paquete de pasaporte a la tasa, 0.7 0.0, y pulsamos Enter. Bueno. Ahora volvamos a la documentación. Aquí nos dan código completo para implementar pasaporte
con estrategia de Google. Copia todo este código, y en nuestro backend, podemos pegar este código en
nuestro índice punto Gs archivo Pero Detw estropeó nuestro archivo
index dot js, así que podemos almacenar ese código
en el archivo separado Para eso, creamos una nueva carpeta llamada Config y dentro de ella, creamos un nuevo archivo,
passport dot JS y página que codifique dentro de este. Por ahora, no te
preocupes por este código. Voy a explicar este código y también
haremos
algunos cambios más adelante. Ahora volvamos a la documentación,
desplácese hacia abajo, y aquí podemos ver que nos dan para obtener APIs para agregar
en nuestra aplicación. primera API es Auth Google y en el lugar de la función de
devolución de llamada, pasa el método de
autenticación de punto pasaporte, y en la primera posición, pasan a Google, que es
el servidor de autenticación, y después de eso, pasan
el alcance de los datos Básicamente, están diciendo qué datos de usuario
queremos obtener del servidor. Queremos correo electrónico y perfil, que incluyen muchos
detalles sobre el usuario. Ahora podrías preguntar qué va a hacer
esta API. Cuando el usuario envía obtener solicitud desde el navegador en este punto final de Google Oth
barra diagonal, este método de
autenticación de punto de pasaporte abrirá la página de inicio de sesión de Google Para agregar esta ruta
en nuestra aplicación, podemos hacer algo como esto. En la carpeta route, creamos
un nuevo archivo auth dot js. Creación de rutas separadas
para la autenticación. En esto, antes que nada, necesitamos que Cost Express sea
igual a requerir Express. Para agregar ruta, agregamos costo Router es igual
a express dot Router. Ahora, de la documentación, copiamos esta primera ruta y la
pegamos en la ruta oth. También en la parte superior, tenemos que ingresar pasaporte porque aquí
estás usando pasaporte. Const pasaporte es igual
a requerir pasaporte. Ahora en el lugar de esta app
punto GAD, ¿qué utilizamos? Derecha, utilizamos router punto GAD. Además, no agregamos este OT. Mencionaremos
barra OT como prefijo, igual que definimos
prefijo para ruta de usuarios Ahora en la parte inferior, tenemos
que exportar esta ruta. Por lo tanto, las exportaciones de punto del módulo
es igual al enrutador. Guarda esto y antes de
que nos olvidemos de agregar esta ruta en el archivo index
dot js, vamos a agregarlo. Después de la
ruta de este usuario, agregamos app.us. Aquí agregamos prefijo API OT. En el segundo parámetro, tenemos que pasar rutas de Auth Por lo que ingresamos costo Os rutas
es igual a requerir. Aquí vamos en rutas carpeta OT. Ahora simplemente pasamos estas otras rutas en
esta app due method. Ahora volvemos a auth dot js file. Aquí hemos especificado el usuario
Xs API Auth barra Google, debería abrir la página de inicio de sesión de
Google Ahora, después de que los usuarios inicien sesión
con éxito, entonces lo que queremos hacer
tenemos que especificar eso también. Recordemos anteriormente, teníamos algún código de estrategia en el archivo
Passport dot JS Entiende este código, y además haremos algunos
cambios en este código. En primer lugar, en la parte superior, necesitamos pasaporte de la biblioteca de pasaportes porque lo
estamos usando aquí. SegundoPasaporte es igual a requerir pasaporte y también
cambiar esta r a costo Después de eso, tenemos pasaporte
dot ug y dentro de esto, tenemos nueva estrategia de Google, que obtenemos de pasaporte, autor de
Google al paquete. Por esta estrategia, no
necesitamos escribir código manual para
obtener código de autorización y extraer datos
del servidor de Google Esta estrategia hace
todo esto por nosotros. Después de eso, tenemos
objeto con un montón de propiedades como
ID de cliente y secreto de cliente. Obtendrás este ID cuando registres tu app
con Google Console, y con eso, también
obtenemos el código secreto del cliente. Sin estos dos rellenos, Google no nos
dará datos a los usuarios. Entonces, vamos a generar esto también. De nuevo, te lo digo, no te preocupes por este código. Cuando terminemos
esta implementación, te
mostraré el
flujo de trabajo completo de este código. En el navegador, busque,
Google Cloud Console. Abre este segundo enlace. Aquí, tenemos que iniciar sesión
con nuestra cuenta de Google. Puedes usar cualquier cuenta. Ahora, después de iniciar sesión,
se ve así. No te preocupes, solo tienes que ir aquí Seleccionar proyecto y crear un
nuevo proyecto. Dale un nombre. Digamos Card Wish
y haz clic en Crear. Aquí en la notificación, se está creando y
seleccionar este proyecto. Cuando seleccionamos este proyecto, podemos ver ese proyecto aquí. Ahora necesitamos API y servicios. Da click en estas tres líneas
y en la API y servicios, vamos a la pantalla de contenido O OT. Simplemente haz lo que yo hago y ya
estás listo para ir. Haga clic en este botón
Comenzar. Aquí, tenemos que hacer algunos ajustes
de configuración. En primer lugar, aquí
tenemos que escribir el nombre de la aplicación. Nuevamente, escribimos Cartwish. Después de eso, seleccione su
correo electrónico de soporte y haga clic en Guardar. Ahora aquí tenemos que
seleccionar el tipo de audiencia, seleccionar
aquí externa. Por eso cualquier usuario puede iniciar sesión en nuestra aplicación
y hacer clic en siguiente. Aquí escribimos nuestro correo electrónico
en el que queremos recibir notificaciones relacionadas con esta app y pulsamos en siguiente por fin, términos
precisos y
continuar y crear app. Ahora vamos al acceso a datos
desde la barra lateral izquierda. Aquí, tenemos que seleccionar
el alcance de los datos de usuario. alcances expresan el permiso que solicitas
a los usuarios para que autoricen tu app y permitan que
tu proyecto acceda a tipos
específicos de
datos de usuarios privados desde su cuenta de Google Simplemente haga clic en agregar
o eliminar alcances. Seleccione el primero para enviar un correo electrónico y perfil y haga clic en
Actualizar y guardar esto. Ahora ve a esta audiencia, y aquí podemos agregar usuarios de sabor. A veces si después de
toda la implementación, nuestros usuarios no pueden iniciar sesión, entonces podría ser que tengamos que
agregarlos en el gusto de los usuarios. Cuando hice esto,
no encontré ningún error. Así que no te preocupes por eso.
Simplemente acude a los clientes. Aquí, tenemos que
generar credenciales OO, y para eso, damos clic
en Crear cliente. Seleccione el
tipo de aplicación a la aplicación web. Nombre, no necesitamos cambiarnos. Pero en la parte inferior, tenemos que
agregar URI de redirección autorizados Un URI de redireccionamiento es
el punto final en nuestra aplicación de back end
donde Google redirige al usuario después de
que inicia sesión correctamente Aquí, escribimos STP, Column double forward
slash local host, Column 3,000 API OT,
Google, slash Recuerda este punto final. Necesitamos definir esta
API en nuestro back-end. Y haz clic en Crear y listo. Ver, aquí obtenemos ID de cliente
y también secreto de cliente. Copia este ID de cliente y en nuestra aplicación en el lugar
de este ID de cliente de Google, podemos paginarlo
o para hacerlo seguro, podemos ponerlo en archivo punto ENV Creo que eso es más seguro. ¿Qué opinas? Así que en archivo
ENV punto en nueva variable, Google, subrayado, ID de subrayado de
cliente Es igual a asegurarse de que no addere espacio y pasado aquí ID
de cliente de su aplicación de Google Después de eso, copie este
secreto de cliente, vuelva a VSCode, y simplemente adhiera Google,
subrayado, cliente,
secreto de subrayado Igual a basar aquí secreto. Guarde este archivo y vuelva
al archivo pasaporte punto js. Aquí, pasamos proceso
punto y punto Google, subrayamos ID de subrayado de cliente Y aquí pasamos proceso
punto n punto Google, cliente de
subrayado,
subrayado secreto Ahora después de eso, tenemos la propiedad de URL de
devolución de llamada. Asegúrate de que aquí escribimos el mismo punto final que
pasamos en nuestra Google Console App. Podemos ver eso desde aquí, da clic en este botón de edición, y aquí tenemos la URL de devolución Copia esto y
pegarlo en códigos dobles. Al final, no toque esta solicitud de pase a la propiedad de
devolución Asegúrate de que esté establecido en true. Pasará el
objeto request a esta URL de devolución de llamada. Ahora, después de esto, en
el segundo parámetro, tenemos la función de devolución de llamada,
o podemos decir la función de
devolución de llamada de estrategia Esta función se ejecutará cuando los usuarios inicien sesión
con éxito con sus datos, y obtenemos aquí objeto de solicitud, token de
acceso, que es un token emitido por
Google a nuestra aplicación. Permite que nuestra aplicación realice una solicitud
autorizada a
las API de Google en nombre del usuario. Después de eso, tenemos el token de
actualización, que es un token que se
puede usar para obtener un nuevo token de acceso cuando caduque
el actual. No te preocupes, no
necesitamos esto por ahora. Después de eso, tenemos perfil, que es un objeto
con información sobre el
usuario autenticado como nombre, correo electrónico, ID de Google, etcétera Obtener estos datos de Google, y realmente depende de
los alcances que solicitamos Y al final, lo hemos hecho, que es la función a la
que llamas cuando completas el
proceso de los datos del usuario. Ahora dentro de esta función, no
queremos encontrar usuario
ni crear un nuevo usuario. Haremos todo eso
en esta API de devolución de llamada. Así que aquí eliminamos este código y simplemente reten aquí
este método hecho En el primer argumento,
pasamos error que es nulo. En el segundo argumento,
tenemos que pasar los datos de los usuarios. En este caso, podemos pasar
directamente perfil. Para resumir, cuando los usuarios iniciaron
sesión con
éxito con Google, se
ejecutará
la devolución de llamada estratégica y en este perfil, obtenemos datos
de usuarios del Ahora cuando llamamos a este método
hecho con un nulo y datos de usuario al perfil, passport ejecutará
este punto final de API, y definiremos ese
punto final en la siguiente lección.
105. OAuth con JWT: Ahora definamos este último paso de la autenticación de Google, que es agregar
esta API de devolución Donde añadimos esta API, definiremos en las
rutas ShorthtJSFLE Aquí ya agregamos una
API, que es el paso uno. Ahora agregamos aquí otro
router punto Get method, endpoint slash Google
slash callback Tienes que darle lo
mismo que pasas en la propiedad de
devolución Entonces, como sabemos, Google enviará datos de
uso en esta ruta de
devolución de llamada, y para eso, tenemos que
volver a adherir
pasaporte Middleware Passport dot autenticar. Aquí pasamos Google en
el segundo argumento, establecemos objeto con propiedad, que es SSN a false Esto le dirá a la biblioteca de
Passport que no almacene el ID de usuario
en la sesión. Y también pasamos una
propiedad más, falla, redirección, y cuando los datos del usuario fallarán,
entonces aquí, el servidor de Google
redireccionará a nuestro usuario. Entonces aquí tenemos que pasar
nuestra URL de front-end. Aquí, por ejemplo,
pasamos la app Local React. Se puede escribir columna SDTP, barra diagonal
doble hacia adelante Host local C5173 slash Iniciar sesión. Esto es muy importante. Ahora, después de eso, podemos
agregar nuestra función de devolución de llamada, que ejecutaremos después de enviar datos de
perfil desde la estrategia de contraseña
callback desde aquí Ahora bien, ¿cómo podemos obtener
datos en esta devolución de llamada? Entonces obtenemos datos en el punto de
solicitud usuario, y vamos a almacenar esta invariable
llamada perfil y simplemente devolvemos este objeto de perfil en el punto de respuesta Json
y pasamos perfil Ahora vamos a probar que esto
está funcionando o no. Para probar esta implementación, tenemos que enviar Get
request al endpoint. Abra el Navegador y diríjase a Columna SGTP doble barra
hacia adelante Anfitrión local, Columna 3,000. Si tu aplicación se está
ejecutando en otro pod, entonces tienes que escribir
tu URL de Bean aquí, y luego reducir API
OT slash Google Y aquí nos sale el error. Se trata de decir error y estrategia de no
autenticación, Google. Déjame revisar. La estrategia de Google es correcta. Además, pasamos el
nombre correcto de las variables ENV. Déjame verificarlo dos veces.
Sí, son iguales. Oh, espera. No agregamos este archivo passport dot js
en nuestro archivo index dot s, y por eso, este archivo no se configuró en
nuestra aplicación. Creo que esta es la razón por la que
estamos recibiendo ese error. Así que vamos al índice punto Gs
archivo, y en la parte superior, agregamos require, vamos a carpeta
Config y pasaporte. Vea los cambios y
reiniciemos nuestra aplicación. Lun índice punto js. Ahora volvemos a Navegador
y descanso la página,
mira, redireccionamos directamente
a la página de Google Login. Aquí podemos ver el nombre de nuestra
aplicación, que mencionamos en
nuestra Consola de Google. Bueno. Ahora, tienes que escribir los datos de
tu cuenta de Google
y simplemente iniciar sesión con eso. Aquí te pide tu
permiso para permitir que Google envíe tus datos de correo electrónico y perfil a
esta aplicación. Continúa, y aquí puedes ver que obtenemos el objeto de datos del
perfil de usuario. En la parte superior, obtenemos proveedor, que es el ID de Google, que es el ID único de Google. Nombre para mostrar a su nombre, guion de correo electrónico verificado a
verdadero para que obtengamos EML ID
y muchos más detalles Puedes usar cualquiera de estos datos y
almacenarlo en tu base de datos. Por lo que hemos completado
nuestro importante trabajo para la autenticación de Google. Ahora solo necesitamos
verificar si el usuario con este ID de EML ya está disponible en nuestra
aplicación o no No está disponible, entonces creamos un nuevo usuario con
su nombre de correo electrónico, ID de Google, pero dejamos el relleno de contraseña porque para iniciar sesión con
Google o Facebook, no
necesitamos rellenar contraseña, y luego generamos el
token JWT para los datos de ese usuario Si el usuario ya está disponible en nuestra base de datos,
entonces no se preocupe, simplemente
actualizamos
su ID de Google en nuestra base de datos y luego generamos token
JWT para los datos de ese usuario Entonces para implementar esto, necesitamos
cambiar un poco el
esquema de nuestros usuarios. Cómo hacer estos cambios
porque en nuestra aplicación, tenemos usuario que puede iniciar sesión
con correo electrónico y contraseña, y también algún usuario puede
iniciar sesión con Google. Primero modifiquemos
el esquema de usuario. Aquí hacemos contraseña,
requerida a true. Pero como sabemos, cuando
el usuario inicia sesión con Google, no
almacenamos la contraseña, por lo que tenemos que cambiar
requerido a false. Además, cuando creamos un nuevo
usuario usando el Login de Google, entonces tampoco almacenamos
la dirección de entrega. Por lo que también podemos hacer
requerido a false para la dirección y también eliminar
esta propiedad de longitud media. Después de eso, podemos
agregar un campo más para el usuario que usó
Google para iniciar sesión. Agregamos el tipo de ID de Google a la
cadena y único a True. Podrías preguntar por qué necesitamos este ID de
Google en nuestra base de datos? Necesitamos este ID de Google
porque al usar eso, podemos identificar al usuario
ya está disponible en
nuestra base de datos o no. Pero aquí,
ya tenemos el correo electrónico de los usuarios. ¿Por qué no podemos usar ese correo electrónico? Ver, en el navegador, estamos obteniendo estos detalles
de perfil. Aquí tenemos correos electrónicos propiedad, que es la matriz de correos electrónicos. Una cuenta de Google tiene uno o más correos
como arrojado gmail.com,
que es el correo principal, hurleredcorporate.com para correo electrónico de trabajo, hurleredcorporate.com Si Harley cambia
su correo principal, entonces para la misma cuenta de
Google, podríamos crear una
nueva cuenta de usuario. Para eliminar este riesgo de correo electrónico, almacenamos el ID de Google. Otra razón aquí
que tenemos para usar el ID de Google es porque alguien puede cambiar su dirección
de correo electrónico de la cuenta de Google, pero no puede cambiar
el ID de Google. El ID de Google es único
para todos los usuarios de Google, y es por eso que
almacenamos a los usuarios Google ID. Además, el ID de Google es para identificar solo a los usuarios
que inician sesión usando Google, no para los usuarios que crearon cuenta usando un simple
correo electrónico y contraseña. Para aquellos que usamos el
correo electrónico para identificar. Guarde este archivo y
escribamos rápidamente nuestra lógica en esta ruta de devolución de llamada de
Google Yo escribo comentario para esta lógica. Primero verificamos que el usuario
esté disponible o no usando su
ID de Google o con correo electrónico. Si el usuario está disponible, entonces actualizamos su campo de ID de
Google y luego simplemente generamos el token JWT
y lo enviamos en la respuesta Aquí no necesitamos verificar la contraseña porque el usuario está
conectado con Google. I usuario no está disponible, entonces creamos un nuevo
usuario con nombre, correo electrónico, ID de
Google, y luego generamos token
JWT y
lo enviamos en respuesta Al final, tenemos que enviar el
token JWT al front-end,
simple como eso En primer lugar, qué usuario
está disponible o no. Para eso, necesitamos colección de
usuarios. Entonces en la parte superior, costo
usuario equivale a requerir, vamos una carpeta
arriba modelos usuarios. Ahora en la parte inferior,
escribimos consulta fina, punto de
usuario Fine one. Y aquí pasamos Object y
agregamos condición, Google ID. Para perfilar ID de punto. Además, ¿qué pasa si alguien
primero ingresa con correo electrónico y contraseña y luego
intenta iniciar sesión con Google En ese momento, no encontramos que los usuarios Google
ID en nuestra base de datos. Por lo que necesitamos también encontrar
usuario basado en el correo electrónico. Puedes usar aquí u operador. Agregamos dólar o columna, y tenemos que agregar aquí
matriz de condición múltiple. Entonces agregamos un objeto de condición, Google al ID de punto de perfil, y segundo objeto de condición,
correo electrónico, al correo electrónico de punto de perfil. Ahora aquí hay una cosa. Este campo de correo electrónico de punto de
perfil no
estará disponible al 100%. Para algunas cuentas de Google, funciona, y para pocas
cuentas, no funcionará. Entonces, como una buena práctica, desarrollador no utilice este campo de correo electrónico
de punto de perfil. Utilizan correos electrónicos de puntos de perfil, que es la matriz y accedemos a su primer elemento por corchete
cuadrado índice cero, y por valor,
adherimos valor de punto. Como sabemos, esta consulta
devuelve una promesa, por lo que podemos adherirnos a esperar, en almacenar el objeto de usuario
en variable, dejar usuario. Además, para usar esperar, tenemos que hacer este
callback acing Ahora aquí tenemos dos escenarios. Si el usuario está disponible, y de lo contrario el usuario
no está disponible. Ahora lo que queremos hacer
si el usuario está disponible, comprobaremos que el
ID de Google está almacenado o no. Yo usuario Google ID no
está disponible, entonces establecemos usuario dot Google ID. Igual a ID de punto de perfil. Este ID de punto de perfil es
ID de Google. Y después de eso, para ahorrar ayuda, escribimos esperar usuario punto guardar. Ahora en lo demás,
tenemos que escribir lógica para que el usuario no exista. Básicamente,
crearemos un nuevo usuario. Así escribimos usuario es
igual a nuevo usuario. Aquí pasamos objeto
con propiedades. El primero es nombre a
perfil, nombre para mostrar punto. Después envíe un correo electrónico a los correos electrónicos
de punto de perfil. Aquí, accedemos al valor de punto
del primer elemento. Igual que antes. Última propiedad, necesitamos ID de
Google para perfilar ID de punto. Para guardar este nuevo usuario, escribimos aquí esperar
usuario punto guardar. Solo hay que hacer una cosa. Genera token JWT y envíalo. Entonces costo token es igual a, vamos a la ruta del usuario. Copiamos este método de signo JWT para generar token
y lo pegamos aquí Aquí al ritmo de
esta variable de datos, tenemos que pasar los datos que
queremos enviar dentro del token. Y lo que hemos
pasado en login, sí, pasamos ID y nombre solamente. Entonces aquí también pasamos ID de
subrayado, no ID de Google. Google ID es solo para backend para verificar
esta condición Simplemente copie este
objeto de datos y páselo aquí. Si quieres enviar correo electrónico también, entonces también puedes menton eso Pero es importante en todo token, envías los mismos detalles. Será fácil para el
front-end usar esos datos. También asegúrate aquí que
tenemos que importar JWT. Costo JWT es igual a
requerir token web JSON. Ahora en el lugar de enviar estos
detalles de perfil en respuesta, enviamos token JWT,
sems enviamos token en el simple registro e inicio de sesión con
correo electrónico y contraseña Además, a veces
los desarrolladores front-end te dicen que redirijas al usuario en la
página principal directa del front end. En ese momento podemos hacer
algo así. Respuesta punto RedIC y aquí
usamos plantilla de cadena. Aquí, tenemos que mencionar
nuestra URL de página de front-end en la que queremos redirigir al usuario después de
iniciar sesión con éxito con Google. F localmente, podemos escribir SDDP, Column double for
slash local host,
Column 5173, que
es Aquí tienes que
escribir tu URL de
front-end , slash dashboard Aquí pasamos token en parámetro de
consulta
usando signo de interrogación, token es igual al dólar
Cali corchetes, token. También puedes cambiar
esta URL como quieras. Realmente
depende de tu front-end. Muchos desarrolladores redirigen a los usuarios, y algunos desarrolladores
envían solo token. Te muestro en ambos sentidos, puedes elegir lo que te diga tu desarrollador
front-end. Por último, hemos implementado la
función de inicio de sesión con Google en nuestra aplicación. Recapitulemos lo que hemos
hecho en las dos últimas lecciones. En primer lugar, el usuario haga clic en el inicio de sesión con
Google Button. Nuestro front-end redirigirá al
usuario al host local Columna 3,000 barra diagonal API
Ath barra Google Esta es nuestra URL de Bend. Si tu back end se está ejecutando
en el host local 8,000, entonces el usuario debe
redirigir al host local 8,000 API Auth Google Ahora, cuando el usuario redirija
a API Auth Google, este código se ejecutará Aquí mencionamos pasaporte
punto autenticar con Google y
mencionar el alcance Ahora, después de eso, directamente se ejecutará
este código, que está disponible en
el archivo JS del pasaporte. Aquí, el pasaporte envía
nuestro ID de
cliente, el secreto del cliente y
la URL de devolución donde queremos
enviar los datos del perfil Después de que los usuarios inicien sesión con
éxito la cuenta de
Google y
permitan el permiso, entonces esta función se ejecutará, y aquí devolvemos el método con error null
y datos de perfil. Estos datos de perfil, podemos acceder como usuario punto de solicitud en
nuestra función de devolución Además, asegúrate de que aquí
no podemos pasar la solicitud
de devolución de llamada a True Después de eso, nuestra API de
devolución de llamada se ejecutará, y aquí escribimos
nuestra lógica de usuario, y luego enviamos o
redireccionamos al usuario con token Tan simple como eso. Seguro que todas
tus dudas son claras. No te preocupes, esta es tu primera
vez y por eso, estás un poco confundido. Pero con el tiempo,
entenderás esto
sin ninguna confusión. Últimas dos lecciones un poco largas, pero solo mira lo que has implementado en tu aplicación. Enhorabuena por
eso, puedes tomarte un pequeño descanso de la pantalla y luego continuar con esta sección.
106. Inicia sesión en Facebook con OAuth: Así que anteriormente, añadimos
iniciar sesión con Google. Ahora también podemos agregar
inicio de sesión con Presbook o cualquier otra plataforma
como Github o Twitter Hay algunos
pasos comunes que tenemos que seguir. Paso número uno, instalar pasaporte y
biblioteca de estrategia de pasaporte en la aplicación de nodo. Paso dos, agregar el primer punto final de
API, que activará el pasaporte
con esa estrategia. Paso número tres, agregue código de estrategia de
pasaporte en
el archivo passport dot js. Igual que agregamos la estrategia de Google. Paso número cuatro, generar ID y secreto para esa plataforma. Por último, paso número cinco,
defina la API de devolución de llamada, almacene los datos de los usuarios si es necesario y envíe el token JWT Con estos cinco pasos, podemos agregar cualquier plataforma en OT. Déjame
mostrarte rápidamente cómo podemos implementar el inicio de
sesión con Facebook. Paso número uno, tenemos que
instalar estrategia de pasaporte. Vamos a la
documentación del pasaporte y buscamos aquí Facebook. Ver, aquí obtenemos comando de
instalación, copia esto y simplemente
pégalo en nuestro terminal. Además, si quieres usar la
misma versión que estoy usando, entonces puedes agregar aquí a la
tasa 3.0 0.0 y presionar Enter. Ahora paso Número dos,
tenemos que agregar API y punto, lo que abrirá la página de inicio de sesión de
Facebook. Entonces, en la
documentación del pasaporte, desplácese hacia abajo. Y aquí obtenemos el código API. Ver, se ve muy
similar a la API de Google. Recuerda, y simplemente
copia esta primera API. Y en nuestro archivo th dot js, después de esta API de devolución de llamada, simplemente la
pegamos aquí Colgar este punto API
para cortar Facebook y también pasaporte punto
autenticar con Facebook,
y por alcance, tenemos que escribir aquí perfil de subrayado
público Paso número tres,
tenemos que agregar código de estrategia de
pasaporte para Facebook. Así que
vuelve a ir al sitio web del pasaporte y copia este código de
estrategia. Volver a viscodeopen
passport dot js file, y simplemente en la parte inferior, pegamos este código Ahora tenemos que hacer
alguna corrección. En primer lugar, hay que importar estrategia
de
Facebook del paquete. Así que duplica esta línea de
estrategia de Google y simplemente cambia este
nombre de variable a estrategia de Facebook. Igual que usan aquí, y también cambiamos
el nombre del paquete a pasaporte Facebook. Bueno. Ahora aquí, tenemos que
agregar estos rellenos Facebook ID y Facebook secret que es el paso número cuatro. Para generar el
ID de la aplicación y el secreto de la aplicación, tenemos que ir a la página de
desarrolladores de Facebook. Mencione todos los detalles en la documentación de la contraseña para cada plataforma. No
te preocupes por eso. La nueva pestaña, busca
aquí, Facebook, desarrollador, consola y
abre este primer enlace. Aquí, haga clic en Iniciar sesión. Estoy ingresando con mi cuenta. Bueno. Después de iniciar sesión, llegamos
aquí para comenzar la opción. Podrá solicitarle
el registro y verificar. Complete los pasos básicos, y luego redirigirá
a esta página de aplicaciones. Haga clic en Crear aplicación. Aquí, escribimos nuestro
nombre de aplicación, que es Cardvis. Estos son los mismos detalles que rellenamos en la Consola de Google. Ahora agregue casos de uso, por lo que queremos
autenticar y solicitar datos a los usuarios con inicio de sesión de
Facebook Se así y da click en siguiente. Aquí, seleccione, no quiero
conectar cartera de negocios. Puede que no obtengas esta
opción porque recientemente, Facebook se vuelve
estricto al respecto. Así que lo siento si no
tienes la opción aquí, pero no te preocupes, escribe
un código como yo estoy escribiendo. En el futuro,
solo tienes que agregar
solo el
ID de la aplicación de Facebook y el secreto de la aplicación. Aquí, da clic en siguiente y siguiente y listo vaya a
Deskboard ahora aquí, tenemos que completar estos pasos Entonces Clikon personaliza agregando
un botón de inicio de sesión de Facebook. Aquí, teníamos permiso. Agregar correo electrónico y el
perfil público ya está agregado. Ahora da click en este inicio rápido. Aquí, seleccionamos web
aquí mismo, nuestra URL de front-end. Por ahora, solo escribe aquí, STTP, Columna doble slash hacia adelante, Host
local, Columna En el mundo real, tienes que
escribir tu URL de front-end aquí y hacer clic en
Guardar y continuar. Haga clic en siguiente, haga clic en siguiente, haga clic en siguiente y listo. Ahora simplemente vaya a la configuración de la aplicación en la parte inferior y vaya
a la configuración básica. Aquí obtenemos APID y App Secret. Copia este APD y en
nuestro archivo punto ENV, agregamos otra variable
llamada Facebook, aplicación de
guión bajo, ID de guión bajo Pasado el ID de la aplicación. Después de eso, agregamos otra variable llamada
Facebook underscore app, underscore secret es
igual a volver al navegador, y aquí damos click en show puede pedir tu contraseña de
Facebook, escríbalo y mira aquí
podemos ver el código secreto Copia eso y simplemente
pegarlo en archivo ENV. Guarde el archivo y vuelva
al archivo de pasaporte punto JS. Aquí, nosotros en process.nw dot Facebook underscore
app, underscore ID Y aquí también procesamos dot nwt Facebook underscore
app underscore secret Ahora, después de eso, simplemente copiamos estas dos propiedades
del código anterior, callb URL y también
pasamos request to callback y las paginamos
aquí para Facebook Justo aquí, tenemos que cambiar
la URL de devolución de llamada para cortar
API Oath, cortar API Oath, cortar Además, tenemos que agregarle una propiedad más porque
Facebook no es como Google Facebook no envía muchos datos, así que tenemos que especificar la propiedad llamada campos de perfil a array, y en esta matriz, agregar todos los
rellenos nombre de Facebook. Agregamos ID, que es el ID único de
Facebook, y es único para
cada usuario de Facebook, igual que el ID de Google. Además, pasamos correos electrónicos para
correos electrónicos, nombre, nombre para mostrar. Comma imagen punto Tipo, y entre paréntesis, grande Esto es para obtener foto
de perfil. La mayor parte de la aplicación
utiliza estos datos. Ahora aquí para callback, queremos hacer lo
mismo que esta estrategia de Google Así que simplemente copiamos esta estrategia callback y la
basamos en la estrategia de Facebook Aquí, nuestro paso cuatro está completo. Guarde este archivo. Ahora
último paso número cinco, solo
tenemos que definir esta ruta de devolución de llamada
para el Facebook Bolígrafos punto gs archivo. Aquí simplemente podemos copiar esta devolución de llamada de Google y
pegarla en la parte inferior También en la parte superior, noto que tenemos que cambiar esta app dot GAD
a router dot gat Bueno. En primer lugar, cambiamos la API y apuntamos a cortar Facebook
slash callback y también en passport
dot Autenticar en el lugar de Google, Ahora en la devolución de llamada API, tenemos que cambiar este ID de
Google con ID de Facebook Entonces tenemos que agregar
otro campo en nuestro esquema de usuarios
igual que el ID de Google. Aquí, selecciona Google ID y
presiona Control plus T o Command plus y selecciona todos los ID de Google en
esta API de Facebook. En el lugar de eso,
agregamos Facebook ID, y no necesitamos
cambiar nada. Guarda los cambios
y no olvides
agregar el campo ID de Facebook
en el esquema de usuario. Abrir los usuarios punto gs archivo
y simplemente duplicar el campo ID de Google y cambiar
su nombre a Facebook ID, y estamos listos para ir. Guarde los cambios, menos es esto. Abra Browser y
vaya al host local, Columna 3,000 slash API
OT slash Facebook Mira aquí obtenemos app no activa. Esta aplicación no es
accesible en este momento. El motivo está en esta app, no
agregamos ni
verificamos el negocio. Recientemente, Facebook se vuelve
estricto al respecto, pero esto no importa
porque podemos ver cuando
hacemos esta Get API
con APIs Orth,
slash Facebook, estamos
obteniendo la página de Facebook, lo que significa que por nuestro fin
nuestra API está funcionando bien Nuestro principal objetivo es implementar el inicio de
sesión con característica. Si tu cliente requiere
iniciar sesión con Facebook, puedes usar su negocio
y verificar tu aplicación. Después de eso, esta
función funcionará, igual que nuestro inicio de sesión
con Google está funcionando. Entonces así es como implementamos Auth para nuestra aplicación backend Es realmente simple. Tenemos que seguir
estos cinco pasos.
107. Simplificar el código: Ahora como sabemos, en
este tanto callback, nuestro código es el mismo Simplemente cambiamos el
ID de Google con el ID de Facebook. Como una mejor práctica,
podemos definir una función reutilizable común que simplemente escribió
token al final. Cortemos esta lógica de et user hasta esta generación de
tokens. En la parte inferior, creamos
una nueva función, const,
handle, u oth callback es
igual a la función de flecha En los corchetes de Gly, pasamos este código, y al final,
simplemente devolvemos token Ahora, antes que nada,
para usar este Avid, necesitamos hacer esta
función asíncrona Ahora ¿qué queremos cambiar aquí? Aquí, necesitamos estos datos de perfil, y también necesitamos esta propiedad
que queremos cambiar, Google o ID de Facebook. Entonces podemos pasar aquí dos
parámetros de perfil, que son los datos completos del perfil, y después de eso, el ID del proveedor. No podemos agregar este ID de proveedor porque cuando llamamos a esta función de
identificador o devolución de llamada, pasamos el ID de Google o el ID de
Facebook como cadena, y no podemos agregar
aquí esa cadena No va a funcionar.
Simplemente, podemos usar aquí, corchete, ID de proveedor. Además, en el lugar de
usuario punto Google ID, podemos escribir
corchetes de usuario ID de proveedor. Esta es la segunda
forma de acceder
al valor del objeto A aquí y también en el blog
Else y hecho. Ahora en la API de devolución de llamada de Google, llamamos a esta función handle
orth callback Y pasar aquí perfil
en el primer parámetro, y para ID de proveedor, lo que pasaremos escribir, pasamos aquí, cadena, ID de Google. Asegúrese de escribir el mismo nombre de campo que
configuró en el esquema del usuario. Ahora, esta función
tardará algún tiempo en ejecutarse. Así que podemos usar aquí esperar y
esta función devuelve token. Así podemos almacenarlo
en token variable. Hagamos lo mismo con la devolución de llamada de
Facebook. Copia esta línea de token y en la devolución de llamada de Facebook
del usuario let hasta este token, eliminamos esto y simplemente
pasamos aquí esta llamada a la función Aquí, no olvides cambiar este ID de proveedor a ID de Facebook. Eso es lo que dijimos, ¿llenar nombre? Sí, es el ID de Facebook. Ver, ahora nuestro código se ve limpio. Ahora en la siguiente sección,
crearemos APIs para tarjetas de
productos y
pedidos de usuarios. Esto es muy divertido.
108. Problema con un solo token [ACTUALIZACIÓN]: Ahora veamos cómo las grandes empresas
como Google, Microsoft y Netflix implementan la autenticación segura
y fluida, y así es como otras aplicaciones de nivel de
producción también implementan la autenticación. Utilizan dos tipos de token JWT, token acceso y token de actualización No te preocupes por
estas grandes palabras. Déjame explicarte esto
con palabras muy sencillas. Actualmente, en nuestra aplicación, creamos API para registro, un nuevo usuario, y luego creamos
API para registrar a ese usuario. Ambas API, estamos enviando token
JWT al
front-end y nuestro front-end enviará ese token en el encabezado de la solicitud con prefijo de
portador y
usando ese encabezado, obtenemos información del usuario
en nuestro middleware oth Ahora hay dos problemas
con este enfoque. El primero es el problema de
caducidad del token. Establecimos el tiempo de vencimiento del token
para 2 horas después de las 2 horas, nuestro usuario necesita iniciar sesión
nuevamente para obtener un nuevo token. Esta es una mala experiencia de usuario
porque tienen que iniciar sesión de nuevo cada
vez que caduca el token. Ahora se podría decir que podemos
aumentar el tiempo de caducidad, y por eso, se solucionará nuestra
experiencia de usuario. Sí, esto es cierto,
pero de esta manera, hay otro problema
que es sobre el riesgo de seguridad. Imagínese para una buena experiencia de
usuario, aumentamos el
tiempo de caducidad a diez días. Ahora bien, si ese token JWT es
robado por otra persona, entonces el atacante o
hacker puede usar ese token como lo estamos usando
hasta que el token caduque En este caso,
no tenemos forma de cerrar sesión o
revocar el token Solo tenemos que esperar
a que caduque el token. Entonces como podemos ver, no podemos aumentar el tiempo
de caducidad. Tienen que hacer este tiempo de
caducidad a 5 minutos o 10 minutos. Ahora, para que la
experiencia del usuario sea genial, primero Google, idear
estos dos conceptos de tokens, que es token de acceso
y reprime token y veremos cómo
funciona este concepto en la siguiente lección
109. Acceso a token y actualización de la lógica del token [ACTUALIZACIÓN]: Ahora vamos a entender el concepto de exceso de token
y refrescar token. Entonces, en el lugar de
crear un token, creamos dos tokens en
nuestra API de registro o inicio de sesión. Primero token, lo llamamos como token de
exceso y segundo token, lo
llamamos como token de actualización. Estos dos son tokens JWT, igual que generamos token
al final de nuestra API Pero la única diferencia
es para el exceso de token, establecemos el tiempo de vencimiento como ordenar como 5 minutos
o 10 minutos o máximo en horas para token de
referencia, establecemos el tiempo de vencimiento
como largo por ejemplo, para cinco días o dos
semanas así, token
sobrante y token de
referencia, ambos son tokens JWT Podemos generarlos
usando el método de signo de punto JWT, pero solo su
tiempo de vencimiento es diferente Ahora podrías preguntar qué hará diferencia al crear
dos tokens por separado. Para que esto sea sencillo me explico tu flujo de trabajo completo para que
todas tus dudas se aclaren. Imagina que esto es front
end y este es backend. Usuario rellena el formulario de inicio de sesión como correo electrónico y contraseña
y envíalo. En el back-end, verificamos los detalles y
comparamos la contraseña. Si la información es correcta, entonces anteriormente, estamos
creando un token. En este enfoque,
creamos dos tokens. Uno es el token en exceso y el
segundo es el token de actualización. Damos tiempo de
vencimiento del token en exceso para digamos 5 minutos
y para el token de actualización, le
damos
tiempo de vencimiento a cinco días. Almacenamos este token de actualización en la colección del
usuario y luego enviamos estos dos
tokens al front-end. Nuestro front-end
establecemos el exceso de token en el encabezado global de la API con
mejor prefijo, igual que antes. Ahora, si el usuario tiene exceso de
API protegida, entonces en el back-end, obtenemos el exceso de token
del encabezado de la solicitud y podemos enviar los datos que nuestro usuario necesita. Ahora imagina después de 5 minutos, nuestro token de acceso caduca. Nuestro usuario vuelve a enviar la solicitud de
API. Aquí, nuestro backend comprueba, este token de acceso
es válido o no Aquí no es válido, desde el back-end
enviamos la respuesta con error 401 en token válido. Ahora en el front-end, desarrollador escribirá código. Cuando el front-end, obtenga el error 401, desarrollador llamará a otra API para obtener un nuevo token de acceso. Digamos que OT slash refresh. Ahora en esta API, podemos acceder al token de actualización. Pero aquí, tenemos que verificar si este token de actualización es válido
para este usuario o no. Recuerde, cuando generamos nuevo token de acceso
y un token de actualización, almacenamos el
token de actualización en la base de datos. Podemos comparar estos dos tokens de
actualización si
coinciden, lo que significa que el usuario es válido. En ese momento, nuevamente
generamos un nuevo token de acceso, un nuevo token de
actualización, actualizamos el token de actualización
en la colección del usuario, y igual que antes, enviamos estos dos tokens
al front-end. Por esto, el usuario no necesita
iniciar sesión una y otra vez. Cuando el usuario no
tiene token de actualización o cuando un token caduca, solo entonces necesita iniciar sesión
nuevamente. Tan simple como eso. Ahora la pregunta
que podrías hacer es, ¿y si este
token de acceso es robado? Con eso, el atacante
puede acceder fácilmente. Sí, eso es posible, y por eso hoy en día, los desarrolladores
front-end no están almacenando el exceso de token
en el almacenamiento local. Lo almacenan en el ábside como variable
JavaScript o tienda
RxTate o Redux E incluso si de alguna manera el atacante
sigue siendo el token en exceso, mantenemos el tiempo de
caducidad del token en exceso a muy corto. Ahora podrías preguntar a los atacantes también
pueden seguir siendo el
token de actualización. ¿Qué pasa con eso? Y además, tiene larga caducidad. Para resolver este problema
en el lugar de enviar refrestocan
al front-end, podemos configurar
refrestocen Ahora bien, ¿qué es la cookie SDTPoly? Una cookie SDDPoly es
un tipo especial de cookie al que no se puede acceder mediante JavaScript que se
ejecuta en el navegador Esta cookie solo SDDP no puede
acceder a través de nuestro navegador. Nuestro navegador solo puede enviar esta
cookie con la llamada API. Pero JavaScript en la página o ejecutándose en el
navegador no puede leer, modificar o eliminar una cookie, lo que hace que nuestro
token de actualización esté a salvo de los atacantes. Ahora podrías preguntar que
esta cookie SDDPoly se envía solo a nuestras llamadas API, o se enviará con
cualquier otra llamada a la API Esta es realmente una gran pregunta. SDDPoly Cookie tiene característica que llamamos como el
mismo sitio a la calle Establecimos propiedad, mismo sitio
a calle, y por eso, esta cookie solo SDDP solo se enviará a nuestras API de dominio de
backend, no a otra persona Es por eso que el
token refiere es alto en seguridad porque no puede
acceder por JavaScript. Ahora vamos a recapitular este
token de acceso y se refiere concepto de token Cuando el usuario se registra o ingresa
en el lugar de un token, creamos dos tokens. El primero es el token en exceso, cuyo tiempo de vencimiento se busca, y el segundo token
es el token de actualización, cuyo tiempo de vencimiento es largo. Almacenamos el token de actualización en la colección del usuario
para ese usuario, y luego enviamos
el token en exceso al
front-end configuramos el token de actualización
en el SDDPolyoki Ahora, lo mejor
de SDTPoly Cookie es que no puede acceder por el código JavaScript del
navegador. Amigo y navegador solo pueden enviar esa Cookie SDTP
con SDDPRquest Esto hace que nuestro token de actualización sea
más seguro y, como sabemos, nuestro token de acceso está disponible
en el estado de la aplicación, no en el almacenamiento local. Así que nuestras fichas de barco son seguras, y así es como
podemos darle a nuestro usuario una mejor experiencia
y una mejor seguridad. Tan simple como eso. Entonces
usamos token de acceso para acceder a los datos desde el back-end y por eso lo
llamamos token de acceso. También usamos token de actualización para reprimir nuestro token de acceso, y por eso
lo llamamos token de actualización Este flujo de trabajo es muy
importante para tu aplicación, y muchos desarrolladores no
conocen realmente este flujo de trabajo completo. Pero estoy seguro que ahora lo
sabes , lo cual es realmente genial. Ahora en la siguiente
lección, implementamos esta lógica en nuestro
código. Será divertido.
110. Implementar token de acceso y actualizar token [ACTUALIZACIÓN]: Ahora para implementar el enfoque de token en exceso
y actualizar token, necesitamos hacer muy poca
oferta en nuestro backend Primero, cuando nos registramos
o
iniciamos sesión de usuario, necesitamos generar
dos tokens y almacenar token de actualización en
la colección del usuario. Después de eso, tenemos que
devolver el exceso de token, igual que lo estamos enviando
previamente en la respuesta. Y luego tenemos que ct refresh token en el SGDP solo cookie, por lo que nuestro navegador JavaScript no
puede acceder ni actualizar token No te preocupes, es realmente
sencillo. Hagámoslo. Entonces aquí creamos una
función para generar token, y estamos
devolviendo directamente el token. Entonces, en lugar de generar
un solo token, aquí podemos generar dos tokens. Entonces primero, cambiamos el nombre de
esta función
para generar tokens. Y dentro de esto en el
lugar de este escrito, lo
almacenamos en una variable
llamada token de acceso. Y después de eso, duplicamos esta línea y queremos
generar token de actualización, como el
nombre de la variable para refrescar token, también, necesitamos cambiar la
caducidad del token en exceso a 5 minutos y
refrescar el vencimiento del token a siete D durante siete días. Además, en el token de actualización, no
queremos enviar
todos los datos del usuario que queremos en
el token sobrante. Así que aquí en el lugar de los datos, simplemente
agregamos objeto con ID, columna, y
datos passier punto subrayado Además, a muchos desarrolladores
les gusta usar diferentes claves secretas para
token de acceso y reprimir token
por razones de seguridad Aquí también, abrimos el archivo ANV punto, y aquí en el
lugar de la clave JWT, escribimos token de acceso, Después de eso, creamos una
variable para reformular, token, clave y te damos
cualquier clave que quieras agregar Guarda esto y en nuestra
ruta de usuarios, en nuestra función, cambiamos JWTK a token
sobrante, K,
y este JWTK para reformular
token, K. Genial Ahora, al final
de esta función, devolvemos objeto con dos
propiedades, token sobrante, token acceso o podemos eliminar este
token de acceso y después de eso, devolvemos refresh token
para refrescar token. Bueno. Ahora veamos qué tenemos que
hacer en el registro, una nueva API de usuario. En la parte inferior,
podemos ver que llamamos a esta
función generar token y pasamos aquí bajo la propiedad ID cuadrada
y nombre. Aquí, como sabemos, no devolvemos un solo token
de esta función. Estamos devolviendo objeto, por lo que podemos desestructurar
este objeto aquí y obtener token de acceso
y token de actualización Ahora en la respuesta,
igual que antes, devolvemos el exceso de token. Además, algunas empresas también envían token de actualización
en la respuesta, pero no vamos a hacer eso. Estamos implementando aquí código
de nivel de producción. Por lo que estableceremos este
token de actualización en el SDP solo Cookie. Para eso, escribimos
respuesta punto Cookie. Asegúrate de estar en el
punto de respuesta Cookie antes de escribir envío del punto de respuesta
o el punto de respuesta JSn porque no podemos configurar la cookie
después de que enviemos la respuesta Si lo escribes después respuesta dot json,
obtendrás error. Con el primer parámetro, escribimos nuestro nombre de propiedad. Digamos que se refiere token. Después de eso, pasamos token de
actualización. En el tercer parámetro, tenemos que pasar objeto con
algunas propiedades importantes. Primero, escribimos el
SGDP solo a verdad. Esto significa que JavaScript en el navegador no puede
leer esta cookie. Después de eso, agregamos seguro a verdadero para asegurar
el SDP como solicitud Ahora actualmente lo
estamos probando para solicitud STDP
local y
por eso lo hacemos aquí falso Pero para recordar escribimos
aquí comando cambiar este seguro a verdadero
para la producción. Después de eso, tenemos el
mismo sitio a la calle. Por eso, detenemos nuestra cookie para ir a
otra llamada API de dominio. Pero aquí, tienes que asegurarte tu frontend y backend
deben estar en el mismo dominio Por ejemplo, gobleu.com para front end y
cola.com Si tu backend y front end están alojados
en un dominio diferente, entonces podemos establecer esta
configuración en none, lo que significa que nuestra Cookie
puede ir a cualquier dominio Aquí queremos nuestro navegador, enviar Cookie solo para
nuestra plataforma backend Para eso, aquí escribimos propiedad de
dominio a nuestro dominio Bend como
api dotben.com Por esta propiedad, solo este
dominio obtendrá esta Cookie, no cualquier otro dominio. Actualmente, estamos
ejecutando nuestro back end en Local Host 3,000 y
en el campo de dominio, no
podemos agregar host local 3,000 porque aquí tenemos que
agregar solo dominio real. Comentamos esta
propiedad también y por fin, agregamos MaxH a nuestro tiempo de vencimiento del
token de reprensa Aquí pasamos siete días, igual que el tiempo de caducidad de nuestro
token de actualización. Siete en 24 horas en 60 minutos en 60 segundos
en 1,000 milisegundos. Esto simplemente significa que
después de siete días, esta Cookie solo STP también caducará y eliminará y finalizará Establecemos el token de actualización
para SDTPoly Cookie. Ahora tenemos que hacer lo
mismo para la API de inicio de sesión. Entonces copiamos este método de respuesta
punto Cooke, y antes de este
punto de respuesta Jason, lo pegamos Entonces aquí en el lugar
de este token, desestructuramos objeto y obtenemos aquí el exceso de token
y reprimimos También cambiamos el
nombre de la función para generar tokens, y aquí devolvemos el exceso de
token en la respuesta. Además, cuando creamos token de
actualización, tenemos que colocar ese token en nuestra colección de usuarios
porque usando eso solo, sabremos cómo el
token de actualización es válido o no. En primer lugar, en nuestro esquema de
usuarios, al final, agregamos refrescen dos
corchetes Carly, escriba dos cadenas Guarde esto y vuelva
a la ruta de los usuarios. Aquí en la ruta de inicio de sesión
antes de enviar el token en exceso, agregamos el token de actualización de punto de usuario
es igual a token de actualización. Y luego agregamos un peso usuario punto s. ahora
aquí hay una cosa. muchos desarrolladores
les gusta almacenar tiene o encriptado token de actualización en la base de datos para mayor seguridad, y también es una buena práctica. Entonces aquí también, podemos
hacer costo, nuevo hed, refresh token es igual a esperar, crypt punto a, aquí, pasamos token de actualización
y establecemos SALT en diez Igual que estamos
hezing la contraseña, estamos hezing el token de actualización Aquí en el lugar
del token de actualización, almacenamos el nuevo token de actualización
hesed Además, copia estas líneas
y en nuestra API de registro, pegamos aquí. También tenemos que cambiar esto a nuevo token de actualización de punto de usuario
y esperar Nwuser dot CV Eso es. Comprobemos que
esto está funcionando o no. Guarda los cambios, asegúrate de que
nuestro backend esté funcionando. Ahora, abre Cartero, abre la API de inicio de sesión
y envía la solicitud Mira, aquí tenemos el nuevo token, que es nuestro token de acceso. Y si vemos después de
esta ficha de cuerpo, obtenemos una Cookie. Si verificamos eso, vea, aquí obtenemos el nombre de la cookie
que es token de actualización. Entonces obtenemos valor, dominio, ruta expira, STP solo a true y secure a
false, lo cual es genial Así que establecemos con éxito el
token de actualización en el sddPolygogi. Ahora en la siguiente lección,
crearemos ruta en la que nuestro front-end
envíe este token de actualización, verificamos ese token y luego les
enviaremos un nuevo token de acceso.
111. Actualizar ruta para el nuevo token de acceso [ACTUALIZACIÓN]: Ahora, como sabemos, cuando nuestro token de
acceso caduque, front-end enviará el token de
actualización a nuestro back end para obtener un
nuevo token de acceso. Pero la pregunta es
en qué punto final, front-end enviará token de
actualización. Tenemos que definir ese punto final. Así que en la
ruta del autor, al final, agregamos punto exterior post, endpoint a slash refresh
y función callback con request y response Además, esto no es obligatorio. Tenemos que definir
ruta llamada refrescar. Es solo un uso común de los desarrolladores de
convenciones. Ahora en esta función,
necesitamos hacer pequeñas cosas. Primero, verificamos que el token de actualización esté disponible en
la cookie o no. Entonces para acceder a la cookie, utilizamos request dot Cookies
dot our Cookie name, que configuramos para reprimir token Déjame mostrarte. Verás,
este es nuestro nombre de cookie. Ahora tenemos que
almacenar este valor en la variable llamada
user repress token Y después de eso,
simplemente agregamos condición. Si el token de represión de usuario no
está disponible, entonces devolvemos la propiedad de mensaje JSON de estado de punto de
respuesta 2401 punto a ningún token de actualización proporcionado Ahora, ¿y si obtenemos
un token de actualización? Simplemente, tenemos
que comparar ese token de actualización con el token que guardamos
en la colección de nuestro usuario. Ahora la pregunta es cómo
sabemos qué usuario envía
este token de actualización. Para eso, recuerda cuando
creamos un token de actualización, en el momento en que pasamos
aquí ID en el token. Entonces, al usar este ID, podemos pasar el token de actualización
almacenado. Para eso, escribimos
JWT punto Verify. Primero, pasamos
token de actualización, después de eso, tenemos que pasar la clave
secreta que es process dotenv dot
refresh token Asegúrese de que agregamos aquí clave token de
actualización,
no el exceso de Tgenkey De lo contrario, un token no
verificará. Ahora bien, esta expresión devuelve la carga útil o
podemos decir los datos. Entonces lo almacenamos en la
variable llamada usuario decodificado. Supongamos que este token no es válido. Alguien cambió
algo en este token, por lo que esta expresión
puede devolver error. Así podemos adherirnos, tratar de atrapar blog
y simplemente agregar esta línea en dr blog
y en el blog de caché, obtenemos aquí error, y simplemente devolvemos respuesta, estado de
punto 403, punto Jason y propiedad de messet
a no válido, reprimir token Ahora supongamos que obtenemos el usuario decodificado del token y
ahora al usar eso, tenemos que encontrar el token de usuario
almacenado. Así costo usuario es
igual a un peso, usuario punto encontrar por ID, y pasar aquí descodificado
usuario punto subrayado ID Aquí también agregamos condición. Si el usuario no está disponible, entonces devolvemos el estado del punto de
respuesta, 404 dot Json y el mensaje
al usuario no encontrado. Además, aquí para usar esperar, tenemos que agregar asincrónico
para nuestra devolución de llamada Bueno. Ahora, si el usuario está disponible, entonces solo necesitamos
comparar el token. Ahora, como sabemos,
en nuestra colección, almacenamos como token, por lo que necesitamos compararlo la misma manera que estamos
comparando nuestra contraseña. Entonces para eso, escribimos
esperar, descifrar punto comparar. Primero pasamos token de
actualización de usuario, que obtenemos de la cookie, y luego queremos compararlo con el token de actualización de punto de usuario. Esta expresión
devolverá es válida o no. Así que lo almacenamos en variable. El costo es válido. Además, asegúrese de importar cripta
B en este archivo. Entonces en la parte superior, agregamos costo. B cripta es igual a
requerir aquí agregamos Wikip. Ahora de vuelta a nuestra ruta. Aquí, después de esto, tenemos
que pasar su condición. I es válido es falso, entonces devolvemos
respuesta punto status 403 punto JSn y mensaje para
refrescar token no es válido Y si el token es válido, entonces necesitamos repetir exactamente el mismo proceso que
estamos haciendo después de
iniciar sesión correctamente. Abrimos API de inicio de sesión aquí
después de comparar contraseña, C, generamos nuevo
token de acceso y nuevo token de actualización, como el nuevo token de
actualización, actualizar token de
actualización de punto de usuario con nuevo stoken luego configuramos el token de
actualización en la cookie, y al final,
devolvemos token de acceso Simplemente copiamos este código. Y pégalo en
nuestra ruta de reprensa. Ahora aquí, antes que nada, necesitamos esto generar
a la función Cs. Podemos ingresar nuestra función
desde el archivo de ruta del usuario, pero para eso, necesitamos cambiar entrada en el archivo JS del punto índice. No quiero
confundirte por hacer eso,
así que simplemente podemos copiar este
generar a la función C desde aquí y simplemente la pegamos en el
archivo outhoute, y eso
es Aquí, se realiza la
implementación de nuestra ruta de actualización. Vamos a esta API, guardemos los
cambios y echemos un vistazo. Open Postman, aquí creamos una nueva solicitud llamada refresh
token method to post, y aquí escribimos nuestra URL, STP,
Columna doble para
slash Local host, Columna 3,000 slash APIs OT
porque está Refresco de barras. Ahora simplemente envía la solicitud. Ver, aquí obtenemos error, no se pueden leer propiedades
de undefined. Creo que no nos estamos poniendo ooky en el token de actualización de usuario Déjame tratar de consolar dot log. El usuario repres token,
guarda los cambios y vuelve a enviar la solicitud Mira, aquí obtenemos el mismo error, y si abrimos nuestro código
vía, mira, no
estamos obteniendo el
token de actualización en el registro de la consola, lo que significa que no estamos obteniendo el
token de actualización del usuario en la cookie. La razón por la que no estamos recibiendo cookie es porque en Node js, no
podemos acceder directamente a Cookie, igual que no podemos
acceder directamente a los datos del cuerpo de la solicitud. Recuerde, para acceder a
los datos del cuerpo de la solicitud, agregar middleware Express dot
JN Para Cookie también, necesitamos agregar un middleware que
nos ayudará a obtener Cookie de solicitud Entonces para eso, instalamos
otro paquete Cookie parser, NPM instalamos Cookie, das
parser y pulsamos enter. Bueno. Ahora, en nuestro archivo índice punto Js, primero ingresamos costo analizador de
cookies es igual a
requerir analizador de cookies Y luego en la parte inferior, agregamos app dot ug, Cookie parser y llamamos a
esta función aquí Sin esta función de
analizador de cookies, no
podemos acceder a Cookie
in request dot cookies Además, en nuestra API de represe, noto que este
usuario decodificado está calificado. Es porque lo definimos con Cst en el blog seco
y por el costo, este usuario decodificado solo es
accesible en este blog seco Aquí queremos acceder al usuario
decodificado fuera
del blog dri Entonces para eso, antes de
este Tyblog definimos dejar que el usuario decodificado y
luego eliminemos este costo Ahora podemos acceder al usuario
decodificado aquí, guardar los cambios,
y echar un vistazo. Enviar la solicitud y ver
aquí obtenemos usuario no encontrado, lo que significa que no estamos obteniendo datos de
usuario. Déjame revisar. Aquí estamos pasando el ID de subrayado
de punto de usuario decodificado. Déjame comprobar que es propiedad de
identificación de subrayado o no. Sí, vea, en el token de actualización
generadora, pasamos propiedad ID
no subrayado ID Así que actualizamos esto para
subrayar ID y también con el mismo la ruta del usuario generar
tokens función Guarda los cambios
y echa un vistazo. Aquí, si obtienes token caducado, entonces puedes llamar a la
API de inicio de sesión que establecerá el
nuevo token en Koki Ahora volvamos a enviar la solicitud de
actualización. Ver ahora en respuesta, obtenemos nuestro nuevo token de exceso, y también se
establece un nuevo token de actualización en la cookie de solicitud. Si volvemos a enviar
la misma solicitud, entonces mira aquí
obtenemos ambos token nuevo. Esto es similar a nuestra página de
inicio para refrescarse. Si el exceso de token caduca,
entonces nuestro front-end, llama a esta API de actualización, y luego nuestro front-end obtiene el nuevo token de exceso
y el token de actualización.
112. OAuth con dos tokens [ACTUALIZACIÓN]: Ahora,
actualicemos rápidamente el código Oth también porque aquí
también estamos enviando solo un token. Entonces, como puede ver,
estamos generando token dentro de esta función de
devolución de llamada OT handle Ahora en el lugar de
generar el token aquí, podemos usar nuestra función generar
tokens y pasar aquí los
mismos datos que este. Y ahora llegamos aquí
const cli brackets, exceso de token y token de actualización Ahora no necesitamos esta
variable token, y después de eso, simplemente
devolvemos objeto con token en exceso
a token en exceso, o podemos eliminar esta y
actualizar token para refrescar token. Ahora aquí tenemos una cosa. Aquí, ya tenemos datos
de usuario. Es bueno. Guardamos el token de actualización
en los datos del usuario, por lo que no necesitamos enviar
otros datos por consulta. Entonces, desde la API de usuario de inicio de sesión, copiamos estos códigos de cifrado, y también guardamos token en
user dot Refresh Token Y pega este código en la función
handle o callback. Ahora en nuestra API de devolución de llamada de Google, aquí obtenemos objeto en
el lugar del token y desestructuramos el exceso de
token y reprimimos token Ahora, antes de redirigir
al usuario al front-end con token, necesitamos establecer el token de actualización
en la cookie de solo SDP Entonces volvemos a la
API de inicio de sesión y copiamos este método de cookie de punto de respuesta y lo pegamos en la API de devolución de llamada de
Google Por fin, simplemente pasamos el
exceso de token en el lugar de togan ahora hacemos lo mismo
para la API de devolución de llamada de Facebook Aquí, obtenemos objeto
con exceso de token y
reprimimos token y pegamos
aquí, el mismo Goki Entonces simplemente cambiamos este token con exceso de token,
y eso es todo. Ahora en la siguiente lección, vemos lo que tenemos que hacer
para logo el usuario.
113. Ruta para cerrar la sesión de un usuario [ACTUALIZACIÓN]: Ahora, ¿puedes decirme qué
pasó cuando el usuario se desconectó? Si caducamos el token en exceso
desde el front-end, entonces en la cookie solo SCTP, ya
tenemos
token de actualización que tiene una caducidad larga Nuestro front-end puede
volver a
ejecutar la API de actualización y obtener los nuevos tokens,
pero no queremos eso. Queremos cerrar la
sesión completa del usuario. Entonces para eso,
solo tenemos que eliminar el token
de actualización del SDDP solo Cookie y
de la colección del usuario Así que vamos a crear aquí nueva ruta, punto
exterior post slash Log hut y función de devolución de llamada ASN
con solicitud Ahora para eliminar Cookie, utilizamos response dot
clear Cookie method. Aquí pasamos nuestro nombre de cookie
que queremos eliminar. Pasamos aquí token de actualización, asegúrate de verificar tu nombre de cookie mientras
lo generas. Ahora, este método
eliminará la galleta refrestken, y funciona en
la Pero cuando queremos implementar
esto en producción, entonces tenemos que agregar también
objeto con propiedades. Esta expresión funciona
para la producción, pero a veces puede causar
problemas en la producción. Es mejor que pasemos propiedades. Asegúrate de que sean las
mismas propiedades que agregamos durante la creación de
Cookies. Copia este objeto y en nuestra cookie
clara, lo pasamos. Bueno. Ahora después de eso, simplemente devolvemos el punto de
respuesta Json Object con la propiedad del mensaje
desconectado correctamente. Ahora antes de retirar la
galleta, es mejor. También eliminamos el token
de actualización de la colección del usuario. Para eso, necesitamos actualizar
token de la cookie, decodificar el ID de usuario
del token,
recuperar el token de la base
de datos, y luego tenemos que eliminarlo Ya lo hemos hecho
en nuestra API de actualización. Recuerda, podemos simplemente
copiar este código desde obtener Cookie para decodificar usuario hasta que
estemos consiguiendo al usuario Copia esto y simplemente pegarlo antes del método Cookie
claro. Ahora aquí tenemos usuario. Solo tenemos que hacer el token de actualización de
punto de usuario es igual a nulo. Y luego esperamos al usuario
punto guardar y listo. Probemos esta API de cierre de sesión. Decir los cambios NINGÚN POSTERO, duplique esta solicitud de
token de actualización Bien, cambia el
nombre de la solicitud a logo de un usuario. Cambie la API y cierre de sesión
de punto a corte. Ahora, actualmente,
revisamos nuestra cookie. Ver está disponible aquí. Ahora, si enviamos esta solicitud de cierre de
sesión, vea, aquí conseguimos cerrar sesión con éxito, y si volvemos a
revisar la cookie, se ha ido de Entonces así es como funciona el registro a
nivel de producción, inicio de sesión, cierre de sesión y token Además, las últimas seis lecciones
son lecciones actualizadas. Entonces, si no ves este
código en las próximas lecciones, entonces no te preocupes por ello. Puedes seguir esas lecciones. Yo sólo quiero que
estas llagas estén al día. Por lo que actualmente estamos
probando este proyecto. Entonces, si ponemos el exceso a
una caducidad a 5 minutos, entonces es muy difícil de probar. Entonces, solo para la degustación, establecemos la caducidad en un día. Además, en el
archivo de ruta del usuario en la parte inferior, cambiamos el exceso a
una caducidad a un día. En producción, podemos
actualizarlo a 5 minutos.
114. Sección 10: creación del modelo de categoría: Bienvenido a la sección entonces del curso Node JS definitivo. En esta sección,
seguiremos trabajando en nuestro proyecto dos
aplicaciones de comercio electrónico backend Añadiremos algunas características
geniales como agregar
imágenes de productos en backend, autorización basada en
roles, consulta de búsqueda
simple y rápida, y mucho, mucho más Entonces comencemos
en esta sección. En primer lugar, en nuestra aplicación de
comercio electrónico, queremos agregar
productos por categoría. Si seleccionas auriculares de
categoría, solo
enviaremos productos
cuya categoría sea auricular Para ello, tenemos que
definir modelo de categoría. Así que en la carpeta de modelos, creamos un nuevo archivo
llamado categoría punto JS. Ahora, dentro de este
archivo, en primer lugar, Const Mangoose es igual
para requerir Después de eso, el esquema de categoría de costo es igual al esquema de puntos nu
mangos Dentro de este objeto,
agregaremos nuestro esquema. Ahora bien, ¿qué quieres agregar
en esta colección de categoría? Primero, necesitamos el
nombre de la categoría. Entonces podríamos necesitar el
icono de la categoría. Estas propiedades dependen de
la parte de interfaz de usuario del front-end. Queremos mostrar categorías
como esta con iconos, después tenemos que almacenar ese nombre de
archivo Cn en nuestra base de datos. Ahora, en nuestra aplicación,
queremos hacer una cosa. Solo Admin puede agregar
categorías en nuestra base de datos. El usuario simple no puede agregar
categoría ni eliminar categoría. A, si en nuestra aplicación, tenemos varios administradores, entonces podemos agregar aquí
llenados para Admin Es la identificación de ese admine. Pero aquí no queremos almacenar los datos
del administrador para que
podamos eliminar este relleno. Por lo que solo tenemos dos rellenos para esta categoría modelo
o colección. Así que agregamos aquí nombre
a objeto, tipo, a cadena requerido a true
y también único a true. A continuación, queremos icono
nombre de imagen para objeto, tipo, a cadena porque queremos
almacenar el nombre de la imagen aquí y requerido a
true, y eso es todo. Ahora muchos estudiantes se
confunden al almacenar la
imagen en el backend Déjame explicarte la lógica. En la base de datos, no podemos almacenar imágenes
directamente. Entonces hacemos algo así. Supongamos que el usuario sube esta
imagen desde el front-end. En el servidor backend, creamos una carpeta llamada uploads, y en esa almacenamos la imagen Ahora hemos subido archivo en nuestro servidor con el nombre que queramos darle a esa imagen. Después de eso, simplemente almacenamos el nombre de la imagen
en la base de datos. Además, a algunas personas les gusta
almacenar toda la ruta de la imagen, pero eso no es
necesario en este caso, porque estamos almacenando esta
imagen en nuestro propio servidor. Entonces solo necesitamos rellenar nombre de la categoría e imagen
que es el nombre de la imagen. Ahora, después de eso, podemos crear un modelo basado en este esquema. La segunda categoría es igual
al modelo de punto Mongos. Primero, pasamos el nombre
singular de nuestra colección categorías,
que es categoría. Y segundo, pasamos el
esquema, y al final,
el módulo de exportaciones de punto es
igual a esta categoría. Hecho. Ahora en la siguiente
lección, agregaremos API para crear nueva
categoría con carga de imágenes.
115. Crea una nueva API de categoría con carga de imágenes: Ahora vamos a crear una
nueva API para la categoría. Para ello, creamos
un nuevo archivo en la carpeta Rutas
llamado categoría punto js. En este archivo, ¿qué hacemos? Escribe, tenemos que crear
Router usando Express. Por lo que const Express es igual
a requerir Express. Y siguiente const Router es
igual a express dot Router. Y también al final, tenemos que exportar este router. Las exportaciones
de punto del módulo son iguales al enrutador. Bueno. Ahora antes de
que nos olvidemos de agregar esta nueva ruta en el archivo JS index
dot, hagámoslo. He cometido este error
e intenté probar mis APIs. Guarde este archivo, vaya a
index dot js file. Aquí, importamos
rutas de categoría es igual a requerir aquí vamos a la carpeta rutas y
en esa categoría. Ahora en la parte inferior,
usamos app dot g. aquí, definimos el prefijo, que es la categoría API slash Después de eso, en el
segundo parámetro, pasamos rutas de categoría. Guarde este archivo y vuelva al archivo de rutas de
categorías. Bueno. Ahora definamos API
para crear nueva categoría. Aquí definimos una nueva ruta
usando router punto post. 8.2 slash hacia adelante,
y aquí pasamos devolución de llamada con la función flecha de
solicitud y respuesta Aquí queremos almacenar la imagen del icono con
el nombre de categoría. Entonces, para almacenar la imagen, necesitamos un paquete
llamado Multer Este es un
paquete muy popular para almacenar todo tipo de archivos en
la aplicación Express. Muchos desarrolladores
confunden con Multer pero es realmente
sencillo. Déjame mostrarte. Abra el terminal y escriba
NPM instale Multer en el 1.4 0.5 dash ts
punto uno y presione Enter Bueno, minimizar esta terminal. Ahora, en nuestro archivo, primero agregamos Const ulter es igual
a requerir a Multer Y después de eso,
creamos una variable llamada st upload es igual a aquí, llamamos a este método Multer, y dentro del paréntesis, tenemos que pasar objeto
con la propiedad dest, que es el destino Aquí, tenemos que especificar
en qué carpeta o ruta, queremos almacenar nuestra imagen. Escribimos la categoría de subida. Por esto, nuestras imágenes de categoría permanecerán en carpeta separada. Ahora tenemos que añadir
este método de subida como middleware de nuestra post API Aquí agregamos subir punto. Aquí tenemos muchos
métodos como single. Esto aceptará
solo archivo único. Ninguno, esto no
aceptará ningún archivo. A aceptará múltiples archivos. N aceptará todos los
archivos y rellenos, lo que acepta
múltiples rellenos específicos. Si quieres adentrarte
más en estos, entonces puedes mirar
su documentación. Por ahora, no te preocupes por eso. Aquí, queremos aceptar
y guardar un solo archivo. Utilizamos aquí, método único. Ahora en este paréntesis, tenemos que pasar el nombre del campo Supongamos que pasamos por aquí, icono. Ahora desde el front-end, tenemos que usar input
tag, type to file, y en el
campo name tenemos que pasar el mismo nombre que es
C. Por este nombre relleno, Malta sabe qué archivo
tiene que guardar, y eso es todo. Multer guardará
nuestro ícono de archivo en la categoría de
carga de ruta de destino, y obtendremos la
información sobre ese archivo en el archivo punto de
solicitud, y obtendremos el resto
de los datos del formulario en el cuerpo del punto de solicitud,
igual que antes Ahora escribamos el resto
del código para esta API. Así que antes que nada, aquí
añadimos I condición, y esto comprobará solicitar el cuerpo del
punto el nombre del punto no está disponible o solicitar
archivo punto no está disponible. Entonces aquí devolvemos el estado del punto de
respuesta, 400 por mala solicitud dot JSON, y aquí pasamos Objeto con propiedad de
mensaje y
pasamos aquí mensaje de error, nombre e icono son requeridos ahora
¿y si tenemos esto ambos? Creamos una nueva categoría, const, nueva categoría
es igual a nueva Aquí, necesitamos modelo de categoría. Entonces en la parte superior, la
categoría de costo es igual a requerir aquí vamos una categoría de modelos
plegada Up. Bueno. Ahora en la parte inferior, nos adherimos nueva categoría, y aquí pasamos objeto con propiedades
de esta colección. Primero, agregamos nombre para
solicitar punto cuerpo punto Nombre. Tenemos un solo
relleno en el cuerpo, y por eso no
desestructuramos este
relleno igual que antes A continuación, pasamos imagen
para solicitar archivo punto. Y aquí queremos
guardar el nombre del archivo, así escribimos filename Si quieres almacenar la ruta
completa del relleno, entonces tienes que adherir, solicitar ruta de punto del archivo punto. Además, podemos adherir el registro de puntos de
consola, solicitar archivo punto para ver lo que nos metemos en
request dot file, para que no nos confundamos. Después de eso, agregamos esperar, nueva categoría punto c, y ya sabes lo que
tenemos que hacer ahora. Sí, tenemos que
hacer que esta función sea para usar esperar,
al final, enviamos respuesta con estadísticas
al 01 para nuevos datos dot Json. Aquí agregamos objeto con propiedad
messet, categoría
agregada con éxito A medida que pasamos categoría
a nueva categoría. Ahora vamos a probar esta API. Es un poco diferente porque aquí
tenemos que enviar archivo. No podemos enviar un archivo
en el formato JSON, así que tenemos que usar aquí formulario, y además no podemos
subir archivo usando Thunder Client
porque esa función solo
está disponible para usuario pago. muchos desarrolladores les gusta Postman y no les gusta Thunderclient
por esto Aquí usaremos Cartero. Si no conoces a Cartero, te
voy a dar mi tutorial
anterior para una guía rápida del Cartero Entonces para descargar el Cartero, vamos a postman.com Aquí, podemos descargar
esta aplicación. Simplemente instale esta aplicación. Es realmente simple. Así se ve cuando lo
abrimos por primera vez. Tenemos dos opciones, crear una nueva cuenta o
iniciar sesión con cuenta. Rápidamente me conecto con
mi cuenta aquí. Si te registras o inicias sesión, entonces puedes crear
aquí colección igual que cliente Thunder. Aquí, creamos una nueva colección
en blanco. Caris y en nuestro proyecto Cartws, agregamos una nueva carpeta
llamada categoría Si quieres acercar
el zoom, presiona Control y más
o Command Plus. En esta carpeta,
agregamos una nueva solicitud, creamos una nueva categoría. Ahora, antes que nada, seleccionamos método
post, URL a STP, columna doble
slash forward host local, columna 3,000 categoría ABI Ahora para enviar un archivo en el
cuerpo, vamos al cuerpo. Aquí seleccionamos los datos del formulario. Aquí, obtenemos la clave, que es el nombre de relleno, el
valor y la descripción. Para primero, agregamos nuestra clave, que es el nombre relleno
para digamos laptops. A continuación, ingresamos nuestro nombre de relleno
para archivo, y ¿qué fue eso? Recuerda, escribimos aquí icono. Entonces aquí también,
tenemos que escribir icono. Para subir el archivo en el lado
derecho de la clave, obtenemos texto y desplegable, que es el tipo de contenido. Aquí, seleccionamos Archivo, clic en Seleccionar Archivo y seleccionamos un nuevo archivo de
la máquina local. Ahora para los iconos de laptop, ve a la carpeta de recursos, que descargarás previamente, o también puedes descargarla
ahora mismo debajo de esta lección. Carpeta de recursos, agregué
carpeta para el Proyecto dos. En esa carpeta, vamos
a carpeta de categoría, y en eso, obtienes
todos los iconos para categoría. Seleccione el archivo
PNG de punto portátil y OpenI. Ahora vamos a enviar esta solicitud. Aquí me sale error. Lo siento, olvidé
iniciar esta aplicación. Así que nota en los puntos índice bueno. También, aquí noto que cometo
este error, estado de punto de
respuesta. Guarde los cambios y vuelva a Cartero y envíe la solicitud Ver, aquí obtenemos
la nueva categoría, laptops e imagen a
este nombre aleatorio. Además, comprobemos que nuestro archivo se guarda en la carpeta de
subida o no. Ver, aquí obtenemos el archivo
con ese nombre de archivo aleatorio. Entonces está funcionando
hay algunos temas. Este archivo, guarda sin su
extensión como dot png, o dot JPG, etcétera Sin extensión, nuestra imagen no
será visible en el navegador. Este es el número uno. siguiente número está aquí, podemos subir cualquier tipo de
archivo, no solo imágenes. Supongamos por error,
alguien sube aquí punto archivo PDF,
entonces qué vamos a hacer. Entonces aquí hay que agregar
filtro para eso también. Solo se pueden subir puntos png o
dot jpg o dot GIF
para este relleno de imagen, y resolveremos estos
problemas en la siguiente lección.
116. Establece el nombre de archivo y el filtro en multer: La lección anterior,
tenemos dos temas. No obtenemos extensión para nuestro archivo de imagen y
también en la base de datos. Segundo, no podemos
filtrar solo imágenes. Vamos a resolver esto. Esto
es realmente sencillo. Permítanme mover esta
categoría por encima
del multer para que podamos
ver esto con claridad Aquí, pasamos solo la propiedad dest
en la función multer. Pero en multer, tenemos pocas propiedades
más que escritorio. Quitar este destino y aquí podemos pasar propiedad de
almacenamiento,
que excepto la propiedad de almacenamiento en
disco multer Entonces, en lugar de
abarrotar el co aquí, podemos definirlo en variable
separada El costo de almacenamiento es igual al almacenamiento en disco
multer dot. Dentro de esto, podemos definir cómo y dónde deben
almacenarse los archivos en nuestro servidor. Pasamos Object y la
primera propiedad es destino donde
queremos almacenar nuestro archivo. Esto excepto la función de devolución de llamada, que tiene tres
propiedades, archivo de solicitud Este es el objeto de
archivo cargado, y CB es una función de devolución para especificar la ruta de destino Función de error aquí, simplemente
llamamos a esta función de devolución de llamada
en la primera posición, pasamos null, que
es por error Después de eso, pasaremos por
nuestra ruta de destino, que es la categoría de subida. Esta devolución de llamada establecerá el destino como categoría de
carga Si este directorio
no existe, entonces tenemos que
crearlo manualmente. Pero ya tenemos
esta carpeta aquí. Si no tienes, entonces
tienes que crear esta ruta,
subir, y en esa
carpeta carpeta categoría carpeta. De lo contrario, ulter nos
dará error. Ahora, después del destino, aquí también podemos especificar
la propiedad de nombre de archivo. Esto también acepta la función de
devolución con las mismas tres propiedades, archivo de
solicitud, CB para
devolución de llamada y función de flecha Ahora en esta función,
queremos definir el nombre de
archivo específico y único para nuestro archivo. Nombre de archivo único porque si
dos nombres de archivo son iguales, entonces el último
reemplazará a la primera imagen. En lugar de imagen femenina, el usuario obtendrá imagen masculina, y eso no es lo que queremos,
como práctica común, almacenamos la marca de tiempo en
el nombre del archivo así Primera marca de tiempo y luego nombre de
archivo con extensión. Esto son casi todos los archivos
obtendrán nombre único. SecCtttMP es igual
al punto de fecha ahora. Por esto, obtenemos
la hora actual. Después de eso,
también queremos hacer algo
en el nombre del archivo. nombre seconstoiginal es igual al archivo.
Nombre original del punto. Por esto, obtendremos
el nombre original
del archivo subido
como laptops dot PNG. Ahora en el nombre del archivo, tal vez
haya algo de espacio, así que es mejor
que reemplacemos ese espacio con el guión. Hará que nuestro
nombre de archivo sea amigable con la URL. Añadimos el método plex. Aquí, primero agregamos expresión
regular y su sintaxis es doble
barra hacia adelante entre estas, agregamos barra diagonal hacia atrás como para el
espacio y más para uno
o más espacios en blanco Al final de la expresión
regular, agregue G para la bandera global, lo que asegura que todas las coincidencias en la cadena sean reemplazadas,
no solo la primera. Aquí pasamos guión
en códigos únicos, esto significa que todo el espacio
será reemplazado por guión. Ahora bien, ¿y si en el nombre del archivo, también
obtenemos los caracteres
especiales? También tenemos que eliminarlos. Agregamos otro método de reemplazo. Primero, ¿qué pasamos? Expresión regular, y ¿cuál es la sintaxis, doble barra diagonal
hacia adelante Entre estos, estamos obteniendo expresión
regular para conseguir
los caracteres especiales. Aquí agregamos A a Z, Alt A a Z cero a nueve, también ahora queremos obtener otros personajes
que no forman parte de esto, y esos serán nuestros caracteres
especiales. T inversa esto, lo envolvemos entre corchetes y después
del primer corchete, agregaremos Garret al final, también
agregamos G para bandera global Ahora queremos sustituir estos
caracteres especiales por nada. Sólo queremos quitarlo. Entonces agregamos aquí solo
códigos sin nada. No te preocupes si no sabes mucho expresiones regulares, está bien. Ahora por estos dos métodos, si nuestro nombre de archivo es este, entonces hará así. Ahora al final, mezclaremos esta marca de tiempo y el nombre del archivo
original CB primero pasamos null por error,
y segundo, escribimos etiquetas de vuelta, aquí agregamos dólar
Cully Brackets,
timestamp, dollar
Cully brackets, original Definimos destino y también nombre de archivo para
nuestro archivo subido. Ahora podemos simplemente pasar esta variable de almacenamiento aquí
en la función Multi. Nuestro primer problema está resuelto. Ahora pasamos al número dos para aplicar el
filtro para archivo. En la función multer, tenemos otra propiedad
llamada file filter Aquí también, tenemos que pasar la función de
devolución de llamada para que
podamos definirla en variable
separada Costo, filtro de archivo es igual a la función de devolución de llamada con
tres parámetros, solicitud ,
archivo y función de error CB, y en esta función, decidimos si el archivo debe ser aceptado o rechazado Aquí, primero definimos una
variable, tipos permitidos, que es la matriz, y aquí agregamos todos los tipos
que aceptamos. En primer lugar, las imágenes GPG, que es
dot JPG y dot JPG ambos. Después imagen png, para punto png, y imagen GIF para punto GIF. Aquí, podemos simplemente
poner condición. Si Mientras que el tipo de mimo es de esto, entonces lo permitimos, de lo contrario lo
rechazaremos Si permiten tipos, punto incluye
y entre paréntesis, pasamos archivo punto tipo Mme. Ahora podrías preguntar
¿qué es el tipo Mme? Mime type significa tipo de extensiones de
correo de Internet
multipropósito, que es una etiqueta utilizada para identificar el formato
del archivo o datos Las aplicaciones o navegadores
saben manejarlo. Si subimos el archivo PNG, tipo
Mme será
imagen barra diagonal PNG, o si subimos archivo PDF, entonces el tipo Mme será
aplicación barra diagonal Si el tipo Mme está disponible
en el tipo permitido, entonces llamamos a la
función CB, y primero, pasamos null por error y pasamos
por excepto el archivo Ahora bien, si el tipo M es
otra cosa, entonces estos tipos, entonces nos adherimos como condición
y llamamos a la función Cb, y al error,
pasamos nuevo error, y aquí pasamos mensaje de error, tipo de archivo
no válido, solo se permiten JPEG ,
PNG y GIF. Y para rechazar este archivo, agregamos aquí falso. D. Ahora tenemos que agregar aquí, archivo a filtro de archivo. Aquí, resolvemos ambos problemas. Déjame mostrarte una propiedad más
útil de ulter. Aquí en la función múltiple, tenemos límites que
nos ayudan a limitar el tamaño del archivo. Imagínese a alguien cargue
bumstakally aquí No necesitamos 10
megabytes para el icono pequeño. Podemos limitar su tamaño de archivo. Aquí pasamos el tamaño del archivo objeto. Aquí, tenemos que pasar el tamaño del
archivo en bytes. Para nuestro ícono de categoría, podemos establecer límite de dos MB, eso es más que suficiente, y para convertirlo en bytes, agregamos en 10 a cuatro. Por esto, obtendremos kilobytes
o KB y nuevamente en 104. Por esto, convertiremos
ese KB en bytes. Y hecho. Ahora vamos a probar esta API. Así que ve a Cartero y
aquí ya tenemos nuestros datos para laptops.
Enviar esta solicitud. Mira aquí no obtenemos respuesta. Pero si revisamos nuestra carpeta de categorías
subidas, obtenemos un nuevo archivo con
nuestro nombre único Extensión, nuestra imagen está almacenando. Ahora vamos a comprobar el error y
si revisamos nuestro terminal, entonces aquí podemos ver que obtenemos error de clave
duplicado
para las computadoras portátiles de nombre. Recuerda, en la lección
anterior, almacenamos la
categoría laptops con ese nombre de archivo aleatorio y
también en el esquema de categoría, establecemos name property en unique. Tenemos que eliminar esa categoría
anterior de Mongo Di B Compass Aquí, simplemente retire
este documento. Además, eliminamos ambas
imágenes de nuestro servidor. No lo necesitamos. Ahora
volvemos a enviar la solicitud. Ver, aquí obtenemos mensaje de
éxito. Obtenemos buen nombre de imagen y también imagen guardada
correctamente en nuestro servidor. Genial. Ahora agreguemos
algunas categorías más. Entonces el
nombre de la segunda categoría son los teléfonos inteligentes. Y para eso, subimos icono
de mobilephone punto png. Asegúrate de
eliminar la primera imagen. De lo contrario, enviará a
imágenes. Enviar la solicitud. A continuación, tenemos categoría, relojes
inteligentes, e icono que
seleccionamos aquí ver punto png. Y envíalo. A continuación,
tenemos auriculares e icono a auricular punto PNG
y enviar la solicitud. Por último, tenemos
consolas de juegos y para videojuego
icono punto PNG
y enviarlo y listo Ahora en la siguiente lección,
crearás API para obtener todas las categorías
de nuestra colección.
117. Obtén la API de todas las categorías: Vamos a crear API para
obtener todas las categorías. Es realmente simple. Después de la API post, creamos una nueva API, router dot Gate forward
slash for endpoint, callback function with request
response, arrow Y dentro de esta función, primero, obtenemos todas las
categorías del modelo. Entonces C categorías es igual a
un peso, categoría punto encontrar. Y si quieres enviar categoría
corta por nombre de categoría, entonces agregamos aquí método de tiro, y aquí pasamos nombre de relleno
por el cual queremos disparar, que es nombre y simplemente enviar respuesta punto
JCN categorías También, aquí tenemos que
hacer esta función acing. Guarda los cambios y
probemos esta API. Así que acude al Cartero
o cliente tierno. Añadimos aquí nueva solicitud. Sin embargo, todas las categorías,
en el punto final, escribimos Host local
3,000 categoría API. Seleccione el método Get y
simplemente envíe la solicitud. Ver, aquí conseguimos categorías acortadas por
sus nombres. Bastante genial. Ahora bien, si necesitas agregar más APIs como actualizar
o eliminar la categoría, entonces también puedes hacerlo. Realmente depende de ti por
ahora no lo necesitamos aquí, así que no los creo.
118. Compartir imágenes estáticas desde el servidor: Actualmente para los datos de categorías, almacenamos la imagen en nuestra carpeta de categoría
upload slush Pero, ¿cómo puede nuestro navegador
acceder a estas imágenes? Están disponibles
solo en nuestro servidor. Para acceder a las imágenes
desde el navegador, tenemos que compartir los archivos de
imagen estáticos desde nuestro servidor. Ya lo han hecho en la
Sección cinco, Lección cuatro. Es realmente simple. Entonces index dot js file aquí después de express
dot J y middleware, agregamos app dot U. Aquí teníamos el prefijo
de la ruta del archivo estático, así que lo configuramos para subir categoría Ahora para compartir los
archivos estáticos desde el servidor, tenemos que usar otro
middleware integrado llamado
express dot Y dentro de esta función, tenemos que pasar el
nombre de la carpeta que queremos compartir. Subir menos categoría. Solo recuerda que este es
el prefijo para URL, y esta es la
ruta de la carpeta de nuestros archivos estáticos. Guarde los cambios, e
intentemos acceder a esta imagen de laptop. Copia esta imagen
nombre completo. Ahora ve al navegador. Aquí en la URL, escribimos nuestro backend, Host
local, Columna 3,000 Aquí tenemos que agregar el
prefijo para archivo estático, que es la categoría upload slash Pasamos aquí categoría de imágenes, entonces tenemos que escribir también categoría
Imágenes en la URL del navegador. Por ahora, nos apegamos a
la categoría Subir, y aquí también, pasamos Subir categoría, y aquí pegamos el nombre
completo de la imagen. Ver, aquí obtenemos la imagen. Así es como al usar esta URL, front-end
mostrará estos iconos. Ahora en la siguiente
lección, crearemos un nuevo modelo para productos.
Esto va a ser divertido.
119. Ejercicio: definición de modelo de productos: Ahora es el momento de
poco ejercicio. Hay que definir el modelo de
un producto. En este modelo,
tenemos los rellenos, y estos son los
datos de muestra de un solo producto. Tienes que diseñar el esquema por
tu cuenta para estos rellenos, tomarte tu tiempo,
resolver este ejercicio, y luego cuál es la solución. Espero que resuelvas este
ejercicio o intentes resolverlo. Date crédito por eso. Ahora vamos a resolver este ejercicio. Para el modelo de producto,
creamos un nuevo archivo en la carpeta models
llamado products dot js. Bueno. En primer lugar, el costo de los mangos es igual
a requerir mangos Después de eso, definimos esquema de producto de
costo es igual
al esquema de punto Nu Mongoose Dentro de esto, pasamos objeto
en el que definimos esquema. La primera propiedad es title, que configuramos para escribir a string, requerido a true, y también adherimos
longitud máxima a cien. Ahora siguiente descripción
que queremos establecer para escribir string required to true, y es de longitud mínima
a 50 caracteres. Después de eso, necesitamos vendedor
que enumere este producto. Aquí, almacenamos el ID del vendedor, por lo que tipo de objeto a Mongoose punto esquema punto Tipos
punto ID de objeto, ref al usuario requerido a true Ahora aquí podría preguntarse ¿por qué no
utilizamos aquí el enfoque
híbrido? ¿Por qué no incorporamos
datos para el vendedor? Por qué almacenamos ID de vendedor. Aquí en la parte frontal, nuestra tarjeta de productos
se verá así. En la lista de productos, no
queremos mostrar
los detalles del vendedor. Si queremos mostrar la información del
vendedor, aquí, entonces también podemos agregar
aquí, nombre del vendedor, y algunos detalles requeridos, pero ese no es el caso aquí. Tienes que pensar
así cuando
queremos múltiples datos
en una sola llamada API, múltiples datos significa t datos de productos
en una sola llamada API. En esos datos, necesitamos
mostrar los
datos de referencia o no. Si en esos datos queremos
mostrar datos de referencia, entonces es mejor incrustar
esos datos en la colección. Por eso, nuestra API no necesita
ejecutar la consulta de relleno para
cada dato incrustado En ese momento, podemos
utilizar el enfoque híbrido. Después de eso, necesitamos categoría. Ahora dime qué
enfoque utilizamos aquí, incrustado o de referencia. Bien, usamos tu referencia porque no queremos mostrar categoría con múltiples datos. Solo necesitamos categoría
para filtrar productos. Así que de nuevo, usamos su tipo de
referencia para Mongos esquema de punto
tipos de punto punto ObjectID de punto Ref a categoría y
requerido a true. A continuación, tenemos precio. Aquí, establecemos type a number, required to true
y mean to zero. Obvio. A continuación, duplicamos esta línea y cambiamos
este precio a stock, que es el número de productos
disponibles en el stock. A continuación, tenemos imágenes, que es la matriz, y en esto también, almacenamos el nombre de la
imagen como cadena. La razón por la que agregamos matriz porque los productos pueden
tener múltiples imágenes Como requeríamos imágenes para verdades. Esto asegurará que nuestro producto
tenga al menos una imagen. Después de eso, tenemos las
últimas revisiones de propiedad, que es la matriz
de objeto de revisión. Ahora esto es interesante. En la matriz de reseñas, queremos múltiples objetos de reseñas. Tenemos que definir el
esquema para ese objeto. Aquí simplemente pasamos
objeto, y en esto, podemos definir esquema
para ese objeto, igual que lo estamos haciendo anteriormente. En este objeto, queremos tres datos de usuario
que envíen esta opinión. Entonces objeto, pasamos tipo, esquema de punto de
Mongos
tipos de punto punto ID de objeto, f al usuario y requerido a True A continuación, para la revisión,
necesitamos calificación, por lo que es tipo a número, y también requerimos a true
y valor medio a cero. Por fin, necesitamos comando,
que puede ser string, pero no agregamos
aquí requerido a true porque no todos
los usuarios agregarán comando. Simplemente les gusta agregar estrellas. Ahora podrías tener
dudas cuando
añadimos un nuevo producto, ¿
es obligatorio? Necesitamos agregar estas reseñas? Porque aquí
pasamos requerimos dos. Entonces la respuesta es no. No necesitamos agregar
revisiones obligatorias. Esto se requiere para
este único objeto. Si intentamos ingresar
nuevo objeto de revisión, entonces debería tener ID de
usuario y su calificación. De lo contrario, no lo necesitará. Básicamente, estamos agregando
esquema para ese único objeto. Además, podrías preguntar, podemos incrustar datos de los usuarios aquí? Sí, podemos incrustar datos aquí, pero imagina que los usuarios
cambian el nombre de usuario, entonces será muy difícil
mantener la coherencia con esos datos y no te preocupes
demasiado por diseñar la base de datos. Casi todas las empresas tienen equipo para diseñar la base de datos, o algún desarrollador senior
diseñará la base de datos. Solo
te estoy explicando por qué usamos referencia y por qué no
usamos el enfoque embebido. Creo que
aclarará tus dudas. Aquí, nuestro esquema está completo. Ahora podemos crear
modelo a partir de esto. El costo del producto es igual
al modelo de punto Mangosta. Aquí pasamos el nombre
singular de nuestra colección,
que es producto, y después de eso,
pasamos esquema de producto, y por fin,
exportamos este modelo. Por lo tanto, las exportaciones de módulos
son iguales a producto.
120. Autorización basada en roles: Ahora vamos a construir API para
crear un nuevo producto. En la carpeta Rutas, creamos un nuevo archivo llamado
products dot js. Ahora tenemos que crear un
nuevo router usando Express. SecStePress es igual
a requerir Express. A continuación, costo, Router es igual
a express dot Router. También por fin, tenemos
que exportar este router. Las exportaciones
de punto del módulo son iguales al enrutador. Ahora, agreguemos este nuevo router
en el archivo index dot js. Guarde este archivo, vaya a
index dot js file. Aquí, importamos costo
rutas de productos es igual a requerir. Vamos a la carpeta Rutas
y en esos productos. Ahora en la parte inferior,
agregamos app dot g. aquí, definimos el prefijo, que es API slash Products Y en el segundo parámetro, pasamos productos,
guardamos los cambios y volvemos
a nuestro archivo de rutas de productos. Aquí queremos crear una
API para agregar nuevo producto. Así router punto post, API y punto de deslizamiento hacia adelante. Aquí, nos aseguramos de que solo el usuario
de inicio de sesión pueda acceder a esta API. Entonces podemos agregar aquí Osmalware. Ver aquí me sale sugerencia de auto, y también va a auto entrada
Omdalware en la parte superior Ahora agregamos la respuesta de solicitud,
y la función de flecha. Bueno. Ahora antes de manejar la imagen de
cómo almacenar productos, tenemos que verificar solo
los vendedores pueden agregar producto, no simples usuarios, solo vendedores,
y ¿cómo podemos hacer eso? Usaremos middleware. En la carpeta middleware, creamos un nuevo archivo
llamado cheseller Ahora, como sabemos, el
middleware es una función. Definimos const, cheque vendedor es igual
a la solicitud de respuesta, y siguiente y la función de flecha En esta función,
tenemos que comprobar si la regla de usuario
es vendedor o no. Si no es vendedor, entonces devolvemos error. Solicito punto usuario no
está disponible, o solicitar punto usuario punto rol no
es igual al vendedor, entonces devolvemos
respuesta punto estado, 403 para prohibido Xs punto JSON. Y aquí pasamos objeto con mesetpperty exceso Si sobrepasas esta condición, sólo entonces podremos pasarlas al siguiente middleware
o Ahora vamos a exportar esta
función desde aquí. Entonces módulo dot export es
igual a verificar vendedor. Entonces los cambios. este middleware después
del middleware orth en nuestra API de productos Vamos a configurar
este middleware después
del middleware orth en nuestra API de productos
. Ver, nuevamente, la entrada automática funciona. Genial. Ahora, aquí hay
dos cosas para ti. El primero está en nuestro esquema de usuario, solo
establecemos dos valores
opción para rol. Déjame mostrarte
usuarios abiertos dot js file. Aquí podemos ver que
solo tenemos usuario y admin. También necesitamos agregar aquí, vendedor, y guardar este archivo. Ahora lo segundo
es, ¿cómo podemos obtener usuario en el rol de
punto de usuario de solicitud punto? Porque en el punto de solicitud de usuario, obtenemos solo aquellos datos que pasamos mientras
generamos el token. Recuerda, pasamos
solo dos propiedades subrayado ID y nombre.
Veamos esto también. W usuarios punto js ruta aquí
en el sinnup al final,
C, solo pasamos
subrayado ID y nombre Aquí tenemos que pasar también papel. Roll a nuevo rol de usuario. Bueno. También en el login al final, también
agregamos aquí rol
y aquí tenemos que usar user dot role porque
ya tenemos usuario aquí. Ver los cambios. Ahora, ¿qué pasa autenticación
basada en
Google y Facebook Allí también pasamos solo
subrayado ID y nombre. También tenemos que pasar la regla. De lo contrario, nuestro medidor
de bodega les dará error. Así pothjs archivo donde
tenemos que cambiar aquí, creamos esta función común
. Eso es lindo. Ver, en la parte superior,
estamos encontrando al usuario, así que eso es fácil para nosotros. Aquí en la parte inferior, estamos generando el token, así que agregamos aquí rol
al rol de punto de usuario. Y hecho. Aquí hicimos
todos los cambios. Guarda los cambios
y déjame cerrar otros archivos en la API de productos, simplemente devolvemos aquí respuesta
punto SN vendedor está aquí. Probemos esta API. En primer lugar,
agreguemos la API de inicio de sesión en Postman porque no
creo que para los productos también, usaremos el cliente Tundar En nuestra colección Cardwih, agregamos una nueva carpeta
llamada users Y agregamos aquí solicitud
llamada login a user. Primero, seleccionamos y
apuntamos al inicio de sesión de usuario de API. Asegúrese de que este método
esté configurado para publicar. Ahora para los datos, simplemente
lo copio del
cliente Thunder de nuevo a Postman, selecciono aquí cuerpo, crudo y simplemente los datos aquí
y envío la solicitud Ver, aquí consigo token fresco, copiarlo y para probar
los productos API, crearás una nueva carpeta
en cartwdg llamada Creo que tenemos que
cambiar permanentemente al Cartero. Cuando comencé a investigar las puntuaciones
en ese momento, la función
File Upload está disponible en la
versión gratuita de Tender client. Pero ahora lo que podemos hacer, cambiamos a Cartero.
Perdón por esto. Aquí teníamos solicitud llamada
crear un nuevo producto. Seleccione el punto final a
API slash products, request is post and
send the request Ver, aquí obtenemos error, se requiere token de
autorización. Lo sentimos, no pasamos token
en el encabezado, vamos a encabezados. Aquí agregamos autorización,
y en el valor, lo que tenemos que
pasar primero agregamos espacio de
error y pegamos
nuestro token JWT aquí Ahora vamos a enviar esta solicitud. Ver, ahora nos llega
otro mensaje de error, acceso denegado solo a los vendedores. Entonces, para recapitular rápido,
agregamos un middleware para vendedor después del Othmdalware
porque por orthomdalware, obtenemos Si se verifica el token y la regla del
usuario es vendedor, entonces solo la función de vendedor
Moware nos
permitirá ingresar
en la API del producto Así es como podemos realizar la autorización basada en
reglas. Para ingresar a esta API, tenemos que hacer nuestra
cuenta corriente a la cuenta del vendedor. Entonces, cuando Mongo Di se convierta pase aquí en la colección del
usuario, encuentra tu cuenta
por la que estás
ingresando y cambia
su regla a vendedor Asegúrate de vendedor, no vendedores. Ahora tenemos que
generar un
token API de prensa porque
cambiamos nuestros datos. Enviar la solicitud de inicio de sesión copia este token de nuevo a la API de productos. Aquí en el encabezado, reemplazamos el token antiguo
con el token nuevo del espacio Barrer Ahora vamos a enviar la solicitud. Ver, aquí conseguimos vendedor
está aquí. Encantadora.
121. Autorización personalizada basada en roles: Ahora anteriormente,
añadimos categorías API. Aquí, no
verificamos el rol
del usuario para agregar
nueva categoría. Aquí también queremos. Solo Admin puede agregar categorías. Entonces hay dos opciones para nosotros. Podemos crear un nuevo middleware, igual que este middleware de
vendedor de cheques,
o podemos crear
un nuevo middleware
que verifique o podemos crear
un nuevo middleware cheques,
o podemos crear
un nuevo middleware
que Si en ese middleware, pasamos admin entonces solo
debería permitir Pasamos vendedor, entonces solo
debe permitir vendedores. Ambas opciones son buenas. Realmente depende de ti
cuál quieras elegir. Déjeme mostrarles a ambos. Para Admin, simplemente
copiamos todo el código
del archivo check seller, y en la carpeta middleware, creamos un nuevo archivo
llamado check admin dot gs, y simplemente pegamos este código Ahora aquí tenemos que
hacer pequeños cambios. Primero, cambiamos el nombre de
esta función. Seleccione esto y presione F
dos y escriba check admin. Después de eso, tenemos que cambiar esta condición, rol a admin, y también en el
mensaje de error admin only, y estamos listos con
nuestro middleware admin Podemos agregar este
middleware en nuestra API después del Osmalware
igual que agregamos cheque vendedor Ahora déjame mostrarte cómo podemos crear
verificación de reglas generales o middleware Es realmente simple. En
la carpeta middleware, creamos un nuevo archivo
llamado check role dot js Aquí también, podemos simplemente pegar el mismo código y cambiar nombre de
esta función
para verificar la regla. Ahora podría preguntarse, ¿cómo podemos
pasar regla en esta función? Porque como sabemos, en
el lugar del middleware, solo
tenemos que
agregar esta función
y que llamaremos a esta función callback Aquí podemos hacer simplemente una cosa. Podemos agregar aquí una función de flecha
más. Entonces después de signo igual, agregue el parámetro de rol y
luego la función de flecha. Entonces antes de agregar
esta función de flecha, para acceder a esta solicitud de devolución de llamada de
respuesta, tenemos que llamar a la función de regla
Jack Ahora, después de agregar
esta función de flecha para acceder a esta solicitud de devolución de llamada de
respuesta, tenemos que llamar a la función de regla
Jack Aquí, pasamos la regla
del usuario, digamos admin. Y después de eso, simplemente lo
llamamos una vez más. Y por eso, podemos acceder a esta solicitud de
respuesta callback. Esto se llama función de
orden superior. Una función de orden superior es
una función que devuelve otra función o toma
otra función como argumento. Aquí, estamos devolviendo esta función de devolución de llamada en
esta función de regla de verificación En sintaxis simple, se ve
algo así. Aquí está la función de regla de verificación, y simplemente devuelve
esta función de devolución Es por eso que llamamos a la regla de
verificación por primera vez, y luego tenemos que llamarla nuevo para acceder a esta función de
retorno. Espero que aclare sus dudas. Aquí, podemos reemplazar esta cadena de vendedor
con el parámetro rule. Y aquí, para mensaje de
error personalizado, convertimos estos
códigos en retroexcavaciones, y en el lugar del vendedor, agregamos rol de dólar
y eso es todo Ahora podemos usar este middleware de verificador de
reglas personalizado con cualquier tipo de rol Entonces realmente
depende de ti si te gusta usar check seller y
check y mid middleware, o te gusta usar
check rule Me gusta usar este middleware de regla de
comprobación. En la API de productos en el
lugar de venta de cheques, tenemos que llamar a check
Rule middleware Y aquí pasamos vendedor de reglas. Este vendedor de reglas de verificación es lo mismo que el middleware de vendedor de cheques, ambos llaman a esta solicitud de devolución de llamada de
respuesta Ahora para las categorías también
queremos comprobar rol como admin. En la ruta de categoría, queremos agregar middleware para esto crear nueva ruta de
categoría Ahora aquí hay una
pregunta. ¿Por qué deberíamos agregar middleware check role ¿Antes de esta
subida multer o después de ella? Derecha, lo agregamos antes este método multer upload porque primero verificamos la regla Si es admin, entonces almacenaremos la imagen del
icono en nuestro servidor. Agregamos el middleware Jack Roll
después del método ulter, luego primero
almacenará la imagen en nuestro servidor y
luego verificará Entonces agregamos check roll
middleware antes de esto y pasamos aquí rol admin Además, antes de verificar
Roll middleware, tenemos que agregar middleware Auth
porque sin eso, ¿cómo podemos obtener la información del usuario
en el
usuario punto en Guarda los cambios y
probemos nuestra API de productos. Enviar esta solicitud,
y aquí me sale error. Déjame comprobarlo. Es un error
en la comprobación Archivo de rol. Oh, lo siento, se me olvidó
eliminar esta llamada de función. Ver los cambios, y
enviemos nuevamente la solicitud. Ver, aquí conseguimos vendedor está aquí. Eso significa que nuestro
middleware está funcionando. Entonces así es como podemos usar este middleware de regla de verificación para cualquier tipo de autorización
basada en reglas
122. Manejo de varias imágenes de productos: Antes de guardar los datos reales de los
productos en la base de datos, vamos a crear un método de carga múltiple para almacenar múltiples imágenes de
productos. Entonces aquí, el vendedor puede subir mínimo una imagen o máximo
ocho o diez imágenes. Entonces a partir de la ruta de categorías, simplemente copio este filtro
de archivo de almacenamiento,
y subo variables y lo
pego y subo variables y antes de
nuestra API de productos. Bueno. Ahora, antes que nada, necesitamos importar paquete
Multar Entonces costo ulter es igual
a requerir multer. Además, podemos eliminar
esta importación de middleware
vendedor jag. No lo necesitamos. Ahora aquí, tenemos que hacer
pequeños cambios. Primero, cambiamos el destino para subir productos de slash Por eso, podemos asegurarnos las imágenes de los
productos estén separadas
del ícono de categoría. Y como sabemos, multer no
crea directorio por sí mismo, así que necesitamos crearlo. En la carpeta de subida, creamos una nueva carpeta
llamada products. Aquí almacenaremos la imagen de
nuestros productos. Estos son pequeños detalles
que debemos tener en mente mientras
trabajamos con nod Jas, medida que trabajas más en nod Jaz, sabrás todas No te preocupes por
eso. Ahora, después de eso, el nombre del archivo está bien. El filtro de archivos también está bien. Si
también quieres almacenar videos, entonces tenemos que
agregar estos tipos MM en la matriz de tipos permitidos. Por ahora, no lo queremos, y además el límite de tamaño es de dos MB, lo cual también está bien. Aquí podrías preguntar
este límite de dos MB es para todas las imágenes de tamaño combinado. No, es para cada tamaño de imagen, no para tamaño combinado. Ahora agreguemos este
método de carga en esta API. Después de jackrll middleware,
agregue upload dot, queremos almacenar
múltiples imágenes, así que podemos usar aquí array dot
single es para un solo archivo, y dot array es Ahora aquí, tenemos que pasar nombre
fil para estas imágenes. Aquí, lo configuramos a imágenes. Entonces desde el front-end,
tienen que enviar todas las imágenes de los productos en
las imágenes individuales rellenadas. Veremos que cuando
probemos esta API, ahora después de pasar
el nombre del campo, podemos pasar el
límite de los archivos. ¿Cuál es el número máximo
de archivos que queremos almacenar? Para la aplicación de comercio electrónico,
ocho es más que suficiente, pero también puedes ajustar
este conteo según tus necesidades. Además, si no quieres
establecer el límite máximo, entonces no necesitamos pasar
el segundo parámetro. Pero aquí queremos ocho imagen. Ahora, como hemos
visto, anteriormente, obtenemos la información del archivo en el archivo punto de solicitud porque
hay archivo único. Pero aquí estamos tratando
con múltiples archivos, por lo que vamos a obtener
estos archivos de datos en
los archivos de punto de solicitud plural. Por eso, vamos a buscar cada nombre de
archivo en la base de datos. También, podemos crear aquí una función ultter
común, pero eso creará confusión
innecesaria Por eso lo dejamos como está. Ahora en la siguiente
lección, almacenaremos datos de
los productos
en la base de datos.
123. Crear nuevos productos: Almacenemos los
detalles del producto en la base de datos. Entonces antes que nada,
en esta devolución de llamada, obtenemos todos los campos que
vamos a pasar en el cuerpo del punto de
solicitud Por lo tanto, el costo de paquetes CLI es
igual a solicitar el cuerpo del punto. Ahora, antes que nada, en
este cuerpo, obtenemos título, descripción, categoría, que es el ID de categoría,
precio y stock. Ahora después de eso, tenemos que
crear una matriz de imágenes, que es la matriz de nombres de imagen, y ¿cómo
podemos conseguirlo? Entonces obtenemos todos los detalles de las imágenes en la matriz de archivos de punto de solicitud, y cada dato de imagen está disponible
en el objeto así. Y aquí obtenemos un nombre de archivo. Entonces podemos hacer esto. Las imágenes de costo es igual a
solicitar archivos de puntos dot MAP. Aquí obtenemos cada función de flecha de
objeto de imagen y simplemente devolvemos el nombre del archivo de punto de
imagen. Este nombre de archivo es lo que
generamos en la parte superior. Ahora por este método de mapa, obtenemos la matriz de nombres de imagen. Además, a veces los vendedores
olvidaron agregar imágenes. Podemos poner aquí condición si las imágenes de longitud de punto
es igual a cero. Si es cierto, entonces simplemente
devolvemos estado del punto de
respuesta, JSON de
400 puntos. Y aquí pasamos error en
objeto con propiedad ensuciada. Se requiere al menos una imagen. Ahora aquí tenemos
toda la información. Almacenemos rápidamente
esta información en la colección de productos. Costo, nuevo producto es
igual a nuevo producto. Ver, aquí obtenemos autorización, productos de modelo, bueno, y aquí pasamos
nuevo objeto de producto. En este objeto, título a
título, y como sabemos, si la propiedad del objeto y
el nombre del valor ambos son iguales, entonces simplemente podemos eliminar esto. Ambos funcionan igual. Siguiente,
descripción a descripción, categoría, precio, stock, imágenes. Y ahora por fin, tenemos que almacenar al vendedor. ¿Cómo podemos conseguir ese vendedor? Bien, podemos usar request
dot user dot underscore ID porque nuestro Osmitalware está configurando los detalles de uso
en el Vamos a contar los rellenos para ver si te
faltan rellenos o no. Uno, dos, tres, cuatro, cinco, seis y siete. El esquema del producto, también, tenemos reseñas de uno, dos,
tres, cuatro, cinco, seis ,
siete y 80, que no agregaremos ahora, así que vamos por
el buen camino. Ahora, vamos a guardar estos datos. Esperar nuevo producto punto
c para usar esperar, tenemos que hacer que esta función
esté ahora en la parte inferior, vamos a devolver el
estado del punto de respuesta a 01 punto GSN, y aquí enviamos
nuevos datos de productos Guarda los cambios,
menos es esta API. Esto es realmente emocionante. En la carpeta de recursos, agregué proyecto a carpeta, y en eso,
obtendrás la carpeta Productos, y dentro de eso, agregué imágenes de
productos por categoría, y además obtendrás
el archivo GSN de punto de datos En el que agregué título, descripción, y
todos los demás detalles. Abrir estos datos punto
JSNFle en el código VS. Ver aquí agregué el
nombre de la categoría en la parte superior, y en la matriz de productos, agregué todos los datos de los productos
con título, descripción ,
precio, stock, imagen es nombre, para que puedas buscar imagen por eso. La razón por la que no agrego
aquí ID de categoría porque para cada categoría ID puede ser
diferente porque anteriormente, agregamos categoría manualmente. Aquí está mi
categoría de smartphone y aquí está ID. Puedes compararlo con tu ID de categoría.
No puede ser lo mismo. Copia esta identificación, ve a Cartero,
aquí, primero ve a los datos del formulario Aquí, simplemente
agregamos categoría clave, y en valor más allá del ID de
categoría de teléfonos inteligentes. A continuación, tenemos que agregar título, luego descripción,
precio y stock. Copio todos estos detalles uno por
uno del archivo JSON
y los pego aquí. Primero, selecciona título,
pegarlo aquí, descripción. El precio es de 1299 y el
stock es de ocho. Así pas la descripción, precio 1299, que es
USD y stock a ocho Ahora necesitamos agregar solo
imágenes para este producto. En la parte inferior, agregamos
otras imágenes clave. Aquí, seleccionamos tipo a archivo, y ahora seleccionamos nuestras imágenes de
iPhone 14. Así que ve a la carpeta Productos, smartphones, y vamos
a la carpeta iPhone 14 Pro. Aquí, seleccione todas las imágenes 1-4. Ahora vamos a enviar estos datos. Ver, aquí obtenemos estos
nuevos datos de productos. Aquí tenemos categoría de vendedor, nombres de
imagen en matriz, y también en nuestro back end en
la carpeta subir productos, obtenemos estas imágenes. Hicimos un gran trabajo. Estoy agregando todos estos
detalles de productos en mi base de datos. Cuando ejecutamos la
consulta de producto GD con paginación, entonces obtenemos más También puedes agregar todos los productos en tu base de datos si lo deseas. De lo contrario,
simplemente puede saltarse esta parte. Ahora copio el siguiente
título del producto, lo pego aquí. No toques el ID de categoría porque seguimos
en la misma categoría. Descripción. Pégalo aquí y precio es 399 y stock al 50. Ahora vamos a seleccionar imágenes
para Samsung a 54. Enviar esta solicitud.
Bueno. Así, puedes agregar todos los productos
o al menos diez productos. Simplemente cambie el ID de categoría cuando cambie la
categoría del producto. Sé que esto es aburrido, pero podemos usar estos datos para
probar nuestra API get products. Así que pon un poco de música escalofriante
y crea estos productos. Yo también estoy haciendo esto, nos
vemos en la siguiente lección.
124. Obtención de todos los datos de productos: Entonces en la lección anterior, agregamos productos
en la base de datos. Ver, agregué los 24
productos en la base de datos. Ahora vamos a obtener estos
productos a través API porque así es como front
ten obtendrá estos datos. Entonces después de la API post, agregamos router dot Get y
apuntamos a reenviar slash Ahora aquí no
agregamos ningún middleware porque queremos que cualquier usuario
pueda ver todos los productos, no solo los usuarios conectados Entonces agregamos directamente aquí devolución de llamada
final con
solicitud y respuesta Bueno. Ahora aquí, primero
obtenemos todos los productos, así que los productos const es igual
a los productos dot find No pasamos aquí ninguna condición porque queremos todos los productos. Y aquí tenemos que agregar
esperar para la consulta. Y para esperar, agregamos aquí
asincrónico y al final, simplemente devolvemos respuesta
punto jcnpducts S los cambios vamos a probar
esta implementación. En el cartero, creamos una nueva solicitud en
colección de productos, productos G Aquí, ingresamos al
punto final a Productos API, seleccionamos Método a G y
simplemente enviamos la solicitud. Vea aquí obtenemos todos los datos
de los productos en matriz. Y en esa matriz, obtenemos objeto para cada producto
con todos los campos. Ahora mi pregunta es, ¿
necesitamos todos los detalles aquí? ¿Podemos reducir el tamaño de los datos que estamos enviando
desde el back-end? Si pasamos el cursor sobre este tamaño, obtenemos el tamaño de respuesta con
encabezado y cuerpo separados Observe el tamaño actual
de los datos 14.39 KB. Ahora déjame mostrarte cómo debería
quedar
nuestra página de productos en front end. Ver, aquí tenemos la
lista de todos los productos, y es casi similar a Amazon o cualquier aplicación de
comercio electrónico. Si prestas atención
a la tarjeta de productos, realmente no
necesitamos todos los detalles. Escribamos los rellenos que
queremos mostrar en
la tarjeta de productos. El primero es ID para identificar
título del precio del producto, stock si los productos están en stock, solo entonces mostramos botón de
cabeza a tarjeta. A continuación, por supuesto, mostrar imagen, que será la primera
imagen de la matriz de imágenes. A continuación necesitamos detalles sobre las
reseñas, y eso es todo. En nuestra consulta, agregamos método
select para
seleccionar los rellenos. Ahora, en lugar de agregar
todos los rellenos nombre, podemos escribir qué
rellenos no queremos. Para eso, solo agregamos o
menos antes de ese nombre de campo. No necesitamos descripción. Además, no queremos
mostrar vendedor. Tampoco categoría, y
no queremos subrayado subrayado
V. No es necesario. Aquí están los cambios
y échale un vistazo. Volvamos a enviar la misma solicitud y comprobemos la talla. Ver, se reduce en un tercio porque la descripción tiene más
datos que cualquier otro campo, y es por eso que eliminamos rellenos
innecesarios. Ahora vamos a hacer más estrechos estos
datos. Aquí tampoco
queremos todas las imágenes. Solo queremos que se muestre
la primera imagen en la portada. Ahora hay dos
soluciones para eso. La primera es que podemos
crear un relleno separado en nuestro modelo de productos como imagen de
visualización o imagen de portada. Cuando estemos almacenando el nuevo
producto, entonces en ese campo, almacenaremos el nombre de la
primera imagen. Esa es una solución. Otra solución es que podemos
extraer el nombre de la primera imagen de cada producto y agregarlo en el mismo objeto de producto que estamos enviando
desde el back-end. De esta manera, no tenemos problema de duplicación de
datos. Ver ambas soluciones son geniales. Aquí, no podemos aplicar la primera solución porque
agregamos todos los productos. Te voy a mostrar la segunda
solución, que también es genial. En primer lugar, aquí
escribimos productos punto Mapa. Ahora aquí estamos obteniendo un solo objeto de producto,
y la función de flecha. Ahora como sabemos, lo que sea que
devolvamos de esta función, será el ítem
de la nueva matriz. La lógica es que devolveremos todos los datos que tenemos
en un solo producto, y luego no queremos
enviar la matriz de imágenes, por lo que reemplazaremos esa
propiedad images con el primer elemento
images. Queremos array de imágenes, cuando no agregamos una nueva
propiedad con el mismo nombre, podemos hacer que muestre
imagen o algo más, pero aquí no queremos
enviar array de imágenes. Por eso estamos
dando el mismo nombre. Déjame mostrarte. Aquí
devolvemos objeto. Dentro de esto, antes que nada, agregaremos todas las propiedades
del operador de amplio spread de un solo producto. Agregamos todas las propiedades de
un solo producto tal como es. Después de eso, para reemplazar
la propiedad images, agregamos aquí imágenes
y aquí como valor, establecemos product dot Images, primer elemento, que
es índice cero. Hecho. Ahora, este
método de mapa devolverá una nueva matriz con todo el objeto de producto
único actualizado. Lo almacenamos en variables
llamadas productos actualizados. En el lugar de los productos, simplemente devolvemos
productos actualizados en respuesta punto JSO Guarda los cambios, y
veamos que estamos obteniendo
esto correctamente o no. Mira, aquí estamos obteniendo algún objeto extraño y
al final de cada objeto, estamos obteniendo esta propiedad de
imágenes, lo que significa que nuestro
método de mapa está funcionando. Pero por qué estamos consiguiendo
este extraño objeto. Simplemente const
dot log este
array de productos y Al en la
respuesta dot json, volvemos a enviar productos objeto Guarde los cambios y
enviemos la solicitud. Vea, aquí obtenemos la matriz de productos regulares
y volvemos al código VS, terminal
abierta, y vea aquí estamos obteniendo la
misma matriz de productos. Ahora intentemos mover esta línea de
consola en el método map. Y en el lugar de los productos
, consola dot log
el único producto. Guarde los cambios y
enviemos la solicitud. A terminal, S, aquí
obtenemos de nuevo el objeto de producto
único regular. Creo que cuando estamos
agregando operador spread, que cuando estamos obteniendo
ese objeto propiedades, en lugar de un solo producto, lo
envolvemos en el objeto y
agregamos aquí operador spread. S los cambios y enviar la
solicitud. Volver a VSCode Mira, aquí estamos consiguiendo
este extraño objeto. Lo que está pasando aquí. Entonces esto sucede cuando estamos
obteniendo datos con mangos, no
obtenemos un simple objeto
Javascript. Obtenemos objeto de documento Mongoose, que incluye tanto los datos del
documento en bruto en el perro como propiedades
y métodos
adicionales como el
subrayado del dólar, dólar es nuevo proporcionado por mangosta para Ahora el problema es que no queremos esas propiedades
y métodos. Quiere un
objeto JavaScript simple de la base de datos, no un objeto de documento de mangos Para resolver esto, simplemente agregamos una propiedad al
final de esta consulta. Esto elimina todas las propiedades específicas de los
mangos adicionales. Ahora podemos devolver aquí
productos actualizados en la respuesta. Guarda los cambios
y echa un vistazo. Enviar esta solicitud y ver, aquí reemplazamos la matriz de imágenes
con el nombre de la primera imagen, y si verificamos nuestro tamaño de
datos, reducimos más. Encantadora. Así
depuramos y encontramos el error. Ahora aquí está la única cosa también. Aquí estamos enviando una matriz
completa de reseñas en que tenemos objeto
que tiene detalles de uso, la calificación, y también comentario. Actualmente, para todos los productos, no
tenemos ninguna reseña. Por eso no podemos
ver esos datos de gran tamaño. También en front end, solo
queremos
mostrar el promedio de calificación y el número total de calificación. También podemos reemplazar la
matriz reviews con solo dos propiedades. Déjame mostrarte. Retiramos esta consola. No lo necesitamos. En primer lugar, crear un nuevo costo
variable el número de reseñas es igual al
producto dot rev dot LNT Aquí, Jack, tienes
reseñas o reseña. Tengo reseña, así que me quedo
con la revisión de punto del producto. Ahora bien, ¿cómo podemos encontrar el promedio? El promedio es básicamente,
tenemos que sumar todos los números de calificación y dividirlo con el
número total de reseñas. Definimos una nueva
variable Cast suma de calificaciones es igual a
ahora para sumar las calificaciones, usamos reduce, que
es el método array. Revisión de puntos Badu, que
es array dot reduce. Ahora aquí obtenemos dos parámetros. El primero es total, o podemos decir suma, y el segundo es el valor actual,
que es una sola revisión. Y ¿qué quieres
hacer en esta devolución de llamada? Simplemente suma más
revisión punto lectura. Después de eso, en el
segundo parámetro, se
puede establecer el
valor por defecto de esta suma, que establecemos en cero. Este método reducido
tomará dos argumentos. La primera es la función callback, que utilizamos para hacer algunas operaciones
matemáticas, y la segunda es el
valor predeterminado del parámetro sum Ahora tenemos suma de calificaciones, costo promedio de calificación es
igual a suma de calificación, dividido por número de reseñas. Ahora, aquí hay una cosa. Si el número de reseñas
es cero, ¿entonces qué? 0/0 nos dará undefined. Si el número de revisiones es cero, ASir u operador uno Esto evitará ese error. Ahora vamos a reemplazar la matriz de revisión
por estas dos propiedades. Después de las imágenes, volvemos revisión a objeto, número de reseñas, a número de reseñas,
o para simplificar, eliminamos la segunda propiedad, calificación
promedio a calificación
promedio. Guarda los cambios
y echa un vistazo. Enviar la solicitud de nuevo y ver ahora podemos revisar como objeto. Entonces a partir de la consulta, solo
enviamos lo que el
front end necesita. Entonces así es como tenemos que pensar cuando estamos enviando
datos desde el back-end.
125. Paginación o consulta infinita: Ahora actualmente estamos enviando los 24 productos
de la base de datos. Imagínese si en nuestra base de datos, tenemos 100 o
mil productos, entonces enviar todos los productos en una sola respuesta
hará que nuestra API sea lenta. Dime ¿qué debemos
hacer ante esta situación? Bien, podemos enviar
datos página por página, para que nuestro front-end pueda implementar funciones paginación o
desplazamiento infinito Esto ya lo hemos visto en la Sección Siete. Vamos a implementar la paginación
o consulta de desplazamiento infinito. Backend es lo mismo
para ambas características. En primer lugar, obtendremos el número de página actual
del parámetro de consulta, y ¿cómo podemos acceder a él? Derecha, por consulta de punto de solicitud. La página de costo es igual a la página de punto de consulta de
solicitud. Ahora bien, esta petición punto
query dot page es string porque
lo que sea que obtengamos
del parámetro query,
será string. Tenemos que convertir esta
página en entero, envolvemos con paréntesis
y paralizar entero A continuación, tenemos que definir
cuántos datos de número de productos queremos
enviar en una página. Entonces const por página
es igual a ocho. Ahora tenemos que simplemente agregar
dos métodos en nuestra consulta. El primero es punto Skip
y aquí pasamos página
paréntesis
menos uno por página Si page es uno, entonces uno menos uno,
cero en ocho, que también es cero. Nuestra consulta salta cero productos. Si la página es dos, entonces dos menos uno, que es uno en
ocho, que es ocho. Así que nuestra consulta Omita los
primeros ocho productos. Ahora, después de Skip, tenemos que
agregar la propiedad Limit, y en eso, pasamos por página. Entonces límite es cuántos datos queremos obtener de la base
de datos Tan simple como eso. Probemos esta implementación,
envíemos la solicitud. Verás, solo conseguimos ocho productos. Ahora podrías preguntar, no
pasamos página en el parámetro de
consulta. Aún así estamos obteniendo
ocho productos. Sí, estamos obteniendo
ocho productos porque esta solicitud punto query
dot page no está definida. Entonces el método skip
omitirá cero elementos, y luego establecemos el límite en ocho. Entonces por eso estamos
consiguiendo ocho productos. ¿Y si queremos que
esta consulta sea más
personalizada para front end? Imagina que nuestro front-end quiere ascender por página productos
en parámetro de consulta Supongamos diez productos
en una sola página. Podemos hacer algo así. En lugar de este Ed codificado duro, obtenemos request query dot
perpge query parameter Nuevamente, lo convertimos en
entero usando parse integer. Incluso si el front-end no
quiere pasar por parámetro de página, pase aquí el valor predeterminado, por
lo que el operador ocho. Y podemos manejar
esta página agregando operador y el
valor predeterminado será uno. Ver los cambios, y vamos a
obtener datos de la página dos. Entonces nos interrogamos
al final de la URL para
pasar el parámetro de consulta. La página es igual a dos. Y además, pasamos por página
a diez y enviamos la solicitud. Consulte, nuestra consulta, omita primeros diez registros y
luego envíe la página dos, que es de 11 a 20 productos. Ahora aquí hay una cosa. En el front end,
muchas veces necesitan más detalles como
número total de productos. Por eso, decidirán
cuántas páginas tienen que
mostrar o cuántas veces pueden obtener los datos
del back-end. Entonces quieren el
número de página actual y algunos otros detalles. Consigamos rápidamente estos detalles y pasémoslos en la respuesta. En primer lugar, después de
estos productos de actualización, podemos hacer algo como esto. Costo, el total de productos es igual a esperar documentos de vaca
punto producto. Esto contará todos los productos. Ahora después de eso, también podemos contar un número total
de página, costo, páginas
totales es igual
al total de productos, dividir por página. Supongamos que tenemos 50 productos
y por página es ocho, entonces obtenemos 6.25, lo que significa seis páginas completas, y necesitamos una página más
para mostrar dos productos Entonces es mejor,
siempre sellaremos este número. Para eso, tenemos que simplemente envolver esta ecuación con la función
matemática punto SL. Esto convertirá
este 6.25 en siete. Ahora en el lugar de enviar
esta matriz de productos actualizados, pasamos aquí objeto. Primero propiedades productos
a productos actualizados, productos
totales, a productos
totales, o también podemos eliminar esto. Además, pasamos páginas totales. Además, podemos enviar página, que es actual página a página
y publicar por página por página por página. He añadido aquí toda la información, pero puedes agregarla de
acuerdo a tus necesidades. Guarde los cambios y
enviemos la misma solicitud. Mira, obtenemos
una matriz de productos y con eso
obtenemos estos detalles. Eso es todo lo que tenemos que hacer para paginación o la consulta infinita
126. Envía productos por categoría: De obtener productos, es posible que
queramos
obtener solo productos por categoría. Para eso, no necesitamos
crear una nueva API. Simplemente podemos implementar
eso en esta consulta también. Primero, obtenemos el
nombre de categoría en el parámetro de consulta, la consulta de
costo es igual
a la categoría de punto de consulta de solicitud. Si no pasamos categoría, entonces pasamos aquí o nulo. Ahora, después de eso, para la consulta, agregamos la variable let query. Lo configuramos en objeto vacío. Aquí, pasamos este
objeto de consulta en este método fino. Ahora podemos llenar esta consulta de
acuerdo a nuestras necesidades. Esta consulta es el objeto de
comparación. Pasamos aquí si la categoría de
consulta de condición está disponible, entonces primero tenemos que agregar la propiedad de categoría al
ID de categoría en este objeto de consulta. Ahora, si desde el front-end, obtenemos directamente el ID de categoría, entonces podemos pasar directamente
ese ID en el objeto de consulta. Pero la mayoría de las veces obtenemos nombre de
la
categoría de la parte delantera. Tenemos que encontrar
ID de categoría en nuestra base de datos. La categoría de costo es igual a una categoría de
peso punto Fine Vn. Aquí pasamos el
nombre del objeto de comparación a la categoría de consulta. Asegúrate de importar este modelo de
categoría en la parte superior. Por lo que la categoría de costo es
igual a requerir. Aquí vamos una carpeta
arriba modelos categoría. Ahora bien, ¿y si no
financiamos la categoría? Aquí comprobamos si la categoría no
está disponible. Simplemente devolvemos respuesta
con código de estado 404, no se encuentra en el método Jason, pasar objeto con
propiedad de mensaje, categoría, no encontrado. Al final, simplemente establecemos categoría de
consulta es igual a
la categoría punto subrayado ID Ahora nuestro objeto de consulta
se ve así. Si pasamos eso en
nuestro método fino, entonces actuará como objeto de
comparación. Ahora, vamos a probar esto
de Mongoi convertido pase, ir a la categoría colección,
copiar cualquier Supongamos que copio la categoría de
smartwatches. Ahora volvemos a Cartero en la URL, agregamos otro parámetro de consulta y la categoría es igual
a los relojes inteligentes Asegúrate de escribir el
mismo nombre que tenemos en la colección de categorías
y envía esta solicitud. Y aquí obtenemos matriz vacía. Oh, aquí pasamos página
es igual a dos, y en esta categoría, no
tenemos tantos datos que podamos mostrar
en la página también. Por lo que cambiamos esta página a
una y enviamos la solicitud. Ver, aquí conseguimos
todos los productos de relojes.
127. Envía el producto por búsqueda: En nuestra aplicación,
el usuario también puede buscar los productos y querer ver todos los productos de acuerdo
a su búsqueda. También podemos implementar eso
en esta única consulta. No es obligatorio agregar
todas las características en esta consulta, pero te estoy mostrando la práctica del mundo
real. Después de esta categoría, la búsqueda de
consulta de costo es igual a solicitar consulta punto SRG
o la configuramos en Nulo Después de esta condición de categoría, agregamos otra condición if, query search está disponible entonces establecemos otra propiedad
en el objeto query. El título del punto de consulta es
igual al objeto. Aquí agregamos dólar jx, para consultar surge y para hacer
esta consulta insensible a mayúsculas y minúsculas, pasamos otra propiedad, opciones de
dólar a cadena I. Además, en la parte inferior, en este tutor productos, tenemos que pasar el objeto de consulta en el método count document Olvidé pasarlo en la lección anterior,
y eso es todo. Guarda los cambios
y echa un vistazo. Agrega aquí otro parámetro de
consulta, y surge es igual a aquí agregamos app y
enviamos la solicitud. Verás, solo obtenemos un dato porque en su
título, tiene Apple. Así es como podemos personalizar esta Gtquery para
obtener todos los productos Además, me doy cuenta de una cosa. Almacenamos con éxito las imágenes de
nuestros productos en nuestra carpeta del servidor, pero no podemos acceder a ella. Necesitamos establecer
esos archivos estáticos como hicimos para
las imágenes de categorías. En el archivo index dot js, después de esta categoría estática, agregamos app dot ug. Aquí, agregamos el prefijo
para la ruta del archivo estático. Pasamos subidas de productos. Ahora, después de eso, usamos
Express dot static Middleware para compartir los archivos
estáticos desde el serfer y dentro de
esta función, tenemos que pasar el
nombre de la carpeta que queremos Así sube productos. Recuerde, esto es
prefijo para URL, y esta es la ruta
de la carpeta de nuestros archivos estáticos y hecho.
128. Ejercicio: obtén datos de un producto único: Ahora, cuando en el front-end, alguien hace clic en
la tarjeta de productos, deberíamos mostrarle todos los detalles sobre ese solo producto. Aquí está el ejercicio para ti. Tienes que definir una nueva API para obtener detalles de un solo
producto. Entonces nuestra API debería
verse así. Productos API de Slash, ID de producto de
slash. Esta identificación, tienes que
encontrar el producto. Además, intenta obtener datos
reales del vendedor como ID del vendedor, nombre del
vendedor e ID de correo electrónico, no simple ID de vendedor. Intenta resolverlo y si te
olvidaste de poblar, entonces puedes ver seis
y siete poblar lección y luego tratar de resolverlo Entonces espero que resuelvas este
ejercicio o intentes resolverlo. No te preocupes si te dan error
o te quedas atascado en algún momento. Es la parte del aprendizaje. También solía pegarme mucho donde aprendí
nodo primera vez. No te preocupes por eso. Ahora
veamos la solución. Así escribimos router punto Gt. ¿Qué pasamos en la URL? ¿Cómo podemos saber qué detalles
del producto queremos? Derecha. Aquí agregamos
ID de columna como parámetro raíz, y este es el
ID único de un solo producto. Ahora, de nuevo, no
agregamos aquí middleware porque cualquier usuario puede ver los detalles de
un solo producto Pasamos directamente la función de
devolución con solicitud y respuesta En primer lugar, necesitamos este ID, por lo que Const ID es igual a
solicitar dot VMs dot Ahora por esta identificación, podemos
encontrar este producto. Entonces C producto es igual a
esperar producto punto encontrar por ID. Aquí pasamos ID de producto. También hacemos esta
función asíncrona. Después de eso, podemos poner condición I producto no está disponible, entonces devolvemos respuesta con código de
estado 404 punto JSObject con propiedad de mensaje,
producto, Ahora bien, si obtenemos el producto
de la base de datos, entonces simplemente respondemos
dot Json este producto. Di los cambios, y
vamos a probar esta API. Copia este primer
ID de producto porque lo necesitamos. En el cartero, creamos una nueva solicitud llamada
Get single product Bien, seleccione el producto API
URL. Y aquí pegamos
nuestro ID de producto. Asegúrate de que la solicitud es
G y envía la solicitud. Ver, aquí obtenemos los datos completos de
un solo producto. Ahora si pasamos aquí algún
ID aleatorio y enviamos la solicitud, entonces no obtenemos los datos. Y si revisamos nuestra terminal, vea que nuestra aplicación se estrelló Ocurre porque no
manejamos errores en nuestra API. No te preocupes,
lo haremos en la siguiente sección. Actualmente, tenemos que reiniciar esta aplicación con node mod. Volvamos a pasar el
DNI original y enviar la solicitud. Bonito. Ahora aquí
tenemos poco problema. En la página de productos individuales, queremos mostrar la información del
vendedor como el nombre y el correo electrónico. Pero aquí obtenemos ID de vendedor, así que tenemos
que poblar esos datos de la colección del
usuario Además, no queremos que
esta categoría se llene. Otras cosas están bien. En primer lugar, después del método fino, pasamos punto poblar. Al primer parámetro,
pasamos qué campo
queremos poblar. Derecha, es vendedor, en qué datos
queremos poblar
subrayado ID, nombre Ahora, también, queremos
poblar al usuario, que estará disponible
en el array reviews Aquí tenemos que
poblar los datos NASD. También es realmente simple. Pasamos otro método de poblar. En primer parámetro,
añadimos review, que es el array
para acceder al usuario, tenemos que escribir punto user. Ahora en el segundo parámetro, nuevamente
queremos los mismos rellenos. Subrazo ID, nombre y correo electrónico. Bueno. Guarda los cambios y
echa un vistazo. Enviar la solicitud. Ver, ahora obtenemos el
Objeto del Vendedor con ID, nombre y correo electrónico rellenados. Actualmente, no
tenemos reseñas. Por eso no lo podemos ver. Además, se nos olvidó eliminar
este relleno de categoría. Al final, pasamos
punto seleccionar Método y aquí menos categoría y menos
subrayado subrayado ID Entonces los cambios y echar un vistazo. Enviar esta solicitud, C, eliminamos categoría y subrayamos
subrayado propiedad V. Así de sencillo es el nodo js. Al principio,
sientes que es duro. Pero si haces implementación paso
a paso, entonces puedes dominarla correctamente. Y por eso
te explico código línea por línea. Ahora en la siguiente
lección, crearemos API para eliminar
el producto único.
129. Ejercicio. - Eliminar el producto: Ahora vamos a crear API para
eliminar el único producto. Así que aquí escribimos
router dot delete. Aquí, nuevamente obtenemos ID
como parámetro de ruta. Ahora aquí necesitamos
middleware o no. Correcto, necesitamos
middleware porque solo el usuario conectado puede
eliminar el producto, y además queremos obtener
detalles sobre ese En primer lugar, pasamos middleware
juramento. Luego pasamos la función de
devolución de llamada API con solicitud y respuesta Ahora, antes que nada, obtenemos ID
del producto del parámetro
route. Costo, ID del producto es igual a
solicitar punto params dot ID. Ahora tenemos que encontrar el
producto a partir de esta identificación. El producto fundido es igual a esperar punto
del producto encontrar por ID en
que pasamos el ID del producto. Ahora a partir de esta consulta
solo necesitamos el ID del vendedor. Agregar método selecto, y aquí
pasamos vendedores llenos
y también en la parte superior, hacemos esta función acing. Ahora ponemos aquí condición
para que el producto se encuentre o no. Así que simplemente copiamos
esta condición de la API anterior
y la pegamos aquí. Bueno. Ahora si encontramos producto, entonces comprobamos que el usuario es admin o el usuario es el
vendedor de ese producto. Escribimos
solicito usuario punto regla punto es igual a admin o
solicitar usuario punto, punto subrayado ID es igual
al producto, punto vendedor Si alguna de esta
condición es cierta, entonces podemos eliminar este producto. Ahora la pregunta es, ¿cómo
podemos eliminar este producto? En este objeto producto, que obtenemos de la base de datos, Mongoose también pasa
un método con él, que es dot delete one Y eso es todo. Por esto, el producto se eliminará
de la base de datos. Además, usamos aquí
eliminar un método porque previamente obtenemos el
producto de la base de datos. Si tenemos que
eliminar directamente ese producto, entonces usamos el método find by
ID y delete. También, tenemos que agregar aquí una espera porque esta es una operación
asíncrona Ahora, después de eso,
simplemente devolvemos respuesta punto Json con propiedad de
mensaje, producto
eliminado con éxito. Ahora actualmente, comentamos esta lógica de eliminación para verificar
esta implementación. Lo habilitaremos
después de algún tiempo. Ahora bien, si esta condición no
es cierta, entonces volvemos aquí respuesta
con código de estado 403, 44 Biden dot Json con
propiedad mesa, exceso denegado Solo el administrador o vendedor puede
eliminar este producto. Ahora probemos esta
implementación, copie cualquier ID
de producto de nuestra lista de productos. Copo este último ID,
ahora en el post win, creo una nueva solicitud llamada tilt, un producto en este
método para eliminar, aquí escribimos URL, productos
API, y aquí pasamos
nuestro ID de producto y nos
aseguramos nuestro ID de producto y nos
aseguramos de que el método sea eliminar
y enviar la solicitud. Oh lo siento, también necesitamos
enviar token JWT en encabezado, ir a API de inicio de sesión, iniciar sesión con tus datos de usuario, quien es el vendedor
de ese producto Ver, aquí consigo
clave JWT, copia eso, y en eliminar API, vamos a encabezados y agregamos
aquí autorización en clave Como valor, pasamos el error, el espacio y pegamos la clave JWT aquí Ahora, envía la solicitud. Mira, aquí tenemos acceso denegado, así que no nos metemos en
esta condición de I. Por eso nos sale este error. El problema está en
esta condición, simplemente consol dot
log esta condición de cabina Copia esta primera condición
y péguela aquí, coma, copia la segunda
condición y péguela aquí Di los cambios, y
nuevamente, envía la solicitud. Ahora volvemos al código VS, abrimos un terminal aquí
para la primera condición, obtenemos false, lo cual es cierto
porque no somos admin. Después de eso, por una
segunda condición, también
nos hacemos falsos. Por qué esta cuenta es
vendedor de este producto. Seleccione por separado consultar dot
log, estas dos propiedades. Quitar esta primera condición, y en el lugar de
iguales, agregamos coma Ver los cambios,
y volvamos enviar la misma solicitud de
vuelta al código VS, y en el terminal, ver, primero obtenemos el
ID de objeto en cadena, y luego obtenemos el nuevo ID de objeto,
que es el ID de objeto Mongoose Es por eso que la cadena y el ID de
objeto no coinciden. Entonces o tenemos que
convertir esto tanto en ID de
objeto o podemos convertir
esto ambos en cadena. Ambos funcionarán. Entonces convertimos
estos dos en cadena. En JavaScript, tenemos el método dot two string para
convertir los datos en cadena. Pase ese punto dos cadenas para ambos ID y retire
esta consola. Guarde los cambios y volvamos
a enviar la solicitud. Ver, ahora conseguimos que el producto
se elimine correctamente. Ahora, si quieres, puedes
habilitar este método delete one. Ahora, después de eliminar el
producto de la base de datos, es mejor eliminar también esas imágenes
de productos del servidor. Para eliminar el archivo
del servidor, podemos usar el módulo FS. Entonces en la parte superior, Fs es igual
a exigir promesas de Fs. Y también necesitamos módulo path. Entonces const path es igual
a requerir el módulo Path. Ahora en la parte inferior, después de
este método delete one, agregamos fs unlin Ahora en este método,
tenemos que pasar la ruta completa del archivo
que queremos eliminar. Pero en la matriz de imágenes, solo
tenemos nombre de archivo, pero necesitamos aquí ruta completa. Para eso, necesitamos
usar el módulo Path, que es otro módulo incorporado
de node jazz. Déjame mostrarte que el camino completo de
Const es igual a path dot join Primero, pasamos y disco
y Discord su nombre, que es toda la
ruta del directorio de nuestro proyecto A continuación, escribimos nuestra carpeta en la
que almacenamos las imágenes. Aquí vamos una carpeta arriba porque actualmente
estamos en la carpeta rutas, subir productos de slash, y
luego en el tercer argumento, agregamos nuestro nombre de imagen Ahora aquí no tenemos una
sola imagen. Tenemos matrices de imagen, así que tenemos que ejecutar loop para esto. Antes de esto, agregamos
producto dot Images. Entonces para acceder a las imágenes, aquí en el método select, tenemos que pasar imágenes. Bueno. Ahora producto dot
images dot para cada uno. Aquí, obtenemos cada nombre de imagen, función de
flecha, y en eso, moveremos estas dos líneas. Ahora, aquí en el desenlace de punto fs, pasamos esta ruta completa, y esto como desenlace punto es
una operación asíncrona Entonces tenemos que adherir un
peso, y para eso, tenemos que hacer esta
función de color asíncrona. Bueno. Ahora antes de ejecutar esta página, es mejor verificar que
tenemos array de imágenes o no. I producto dot
Images está disponible y producto imágenes de punto
longitud de punto, mayor a cero. Sólo entonces ejecutamos este bucle. Mueve este código aquí. En esta operación de desvinculación, podría ocurrir
un error. Antes de este desenlace de fs punto, agregamos try and cache blog Mueve este
método de desenlace en el tr Blog, y en el blog de caché,
obtenemos esta excepción Simplemente consultamos error de punto
en metics, error, borrado,
archivo, corchetes de dólar C, ruta
completa, coma,
agregar objeto de error Ver los cambios y echar un vistazo. Probemos esta implementación, copiemos el ID del último producto. También vea el nombre de su imagen. Estas imágenes deben ser eliminadas. Reemplace este ID de producto este ID y envíe
esta solicitud de eliminación. Ver, aquí conseguimos que el producto
se elimine correctamente, y si revisamos nuestra carpeta de
productos, vea en esta carpeta, no
obtenemos esas imágenes. Así es como eliminamos el
producto y sus imágenes. Ahora agreguemos también ese
producto que acabamos de eliminar. Entonces y crear una nueva API de
producto y aquí cambio este título
a nuevo nombre de producto. Seleccione aquí imágenes. Y simplemente envía esta solicitud. Aquí, obtengo
token válido porque este
anterior está caducado. Vamos a la API de inicio de sesión, copiamos el token, y
en los encabezados, pegamos este token. Ahora, enviemos esta solicitud. Ver, aquí obtenemos nuevos datos. Encantadora. Nos vemos en
la siguiente lección.
130. Búsqueda de productos por título [OPCIONAL]: Ahora en todas las
aplicaciones de comercio electrónico, tenemos la función de búsqueda donde en la parte inferior
de la barra de búsqueda, podemos mostrar sugerencias. Entonces tenemos que definir
API para eso. Además, esta API llamará cuando cada carácter
entre en la barra de búsqueda. Así punto exterior cat, punto final dos sugerencias de barra diagonal, función de devolución de llamada
asíncrona
con solicitud En esto, antes que nada, obtenemos lo que el usuario está buscando. Así que la búsqueda de costos es igual a solicitar
punto consulta punto Sarge aquí, tenemos que usar
expresión regular para comparar y encontrar
la cadena en el título Entonces Const productos es
igual a esperar producto punto encontrar pasier condición
Objeto, título a Aquí, usamos expresiones regulares de dólar, que es la última forma de escribir expresión
regular en Mongo Aquí pasamos nuestro texto de búsqueda y para desactivar las mayúsculas y minúsculas, pasamos aquí
las opciones de dólar a la cadena I. Aquí, comparamos nuestra
cadena de búsqueda con nuestro título. Esto nos dará productos que tengan esa palabra o cadena. Además, en la sucesión, no
queremos
mostrar todos los detalles como descripción y todo Entonces podemos agregar aquí el método
Selec y solo
obtenemos underscore
ID y propiedad de título También podemos limitar estos datos
a diez en el front-end, solo
sugerimos diez productos en la parte inferior de la barra de búsqueda. Al final, simplemente respondemos
dot Json estos productos. Guarda los cambios y
probemos esta API. Abra Cartero, cree una nueva solicitud llamada
Obtener sugerencias URL a productos API, sugerencias de
barra diagonal, interrogación para
pasar parámetro de consulta, búsqueda es igual a IP Asegúrese de seleccionar el
método Get y enviar la solicitud. Ver, aquí no conseguimos productos. Veamos qué
obtenemos en la terminal. Ver, aquí estamos obteniendo
algunos problemas con el ID de objeto. Pero en nuestra API de sugerencia, no
tenemos ningún ID de objeto. Entonces, ¿por qué estamos llegando
aquí, error de ID de objeto. En realidad, esta llamada a la API no
está llegando a
la API de sugerencias. Se está moviendo dentro de esta API de
obtener un solo producto. Déjame explicarte esto. Aquí está la primera URL API
para el producto único. Tenemos productos API
slash product ID. Agregamos otros
productos API API, sugerencias de barra diagonal. Ahora Express se está confundiendo. Esta cadena de sugerencia
es ID de objeto o qué. Debido a eso, nuestra API de
producto único se está ejecutando. ¿Cuál es la solución aquí? Nada, solo tenemos que
mover nuestra API de sugerencias antes que esta
API de producto
único. Por eso, Express compara nuestra
API con la cadena de sugerencias, y si eso no coincide, solo entonces Express se moverá
a la API de un solo producto. Cambios de fase y asegúrese de que el
servidor esté funcionando correctamente. En el cartero,
enviemos la misma solicitud. Ver, ahora obtenemos sugerencias de
productos. Intencionalmente creé
este error para
mostrarte lo que puede suceder cuando
creas proyecto por tu cuenta. Ahora en la siguiente
sección,
aprenderemos a manejar errores
como profesionales. C en la siguiente sección.
131. Sección 11: ¿por qué manejamos los errores?: Actualmente estamos ejecutando nuestra aplicación en
el mundo ideal. Todo está funcionando a la perfección. Pero en el mundo real,
cualquier cosa puede salir mal. Cualquier error puede ocurrir. Por ejemplo, no
se encuentra algún archivo o nuestra conexión
con el servidor Mongo Deb no tiene éxito
o el usuario no pasa la información válida o
cualquier cosa puede salir mal En esos casos,
tenemos que manejar errores, y aquí hay algunas razones
para manejar el error. En primer lugar, cuando
manejamos errores, podemos enviar
mensaje de error amigable y podemos mostrar ese error amigable en la página web como
servidor tiene algunos problemas, por favor inténtalo de nuevo
más tarde, así. Segundo motivo para
manejar errores, podemos iniciar sesión o en palabras simples, podemos almacenar los errores
en el archivo separado, y luego mirar esos errores, qué errores están
ocurriendo muy a menudo, y por eso, podemos resolver esos
errores en nuestra aplicación. Por lo que manejar errores también puede
mejorar nuestra aplicación. Ahora déjame mostrarte un error. Ejecutemos nuestra aplicación
usando nodemon index dot js. Ahora en el cartero,
también estamos recibiendo
sugerencias del sargento Ahora supongamos que el
servidor Mongoib se estrelló. Entonces, para demostrarlo,
podemos comentar el código de conexión desde
el archivo index dot js. Guarde los cambios, y
volvamos al cartero. Enviar de nuevo la misma solicitud. Mira aquí obtenemos cargando,
cargando y cargando. Y después de 10 segundos,
obtenemos error. Y si revisamos nuestro terminal de
aplicación, vea aquí obtenemos productos de
operación de error de mangosta punto
Find Buffering Tiempo salida después de 10,000 milisegundos Y después de eso, nuestra
aplicación podría quedar estrellada. Supongamos que en el mundo real, nuestro servidor Mongo Deb se baja incluso
por dos o 3 minutos, entonces nuestra aplicación puede
fallar en producción Después de algún tiempo, el servidor Mongo Di
B vuelve a entrar en vivo. Incluso si es en vivo, nuestra app
permanecerá fallada y no podremos
enviar datos al cliente, es importante manejar
este tipo de errores Además, manejar errores no
significa que el error no suceda. Manejar errores
significa que por ese error, nuestro servidor no se estrellará Actualmente, esta
aplicación se está ejecutando, pero antes de esta versión
del nodo Jaz anteriormente, las aplicaciones de
nodo
se están estrellando Durante esta sección,
veremos cómo manejar
los errores y registrarlos.
132. Manejo de las promesas rechazadas: En primer lugar,
manejemos los errores que ocurren cuando estamos
tratando con promesas de API. En esta API de sugerencias, llamamos aquí a esta colección de
productos. Y como sabemos, esta es una operación
asíncrona, por
eso usamos esperar
para la respuesta Entonces tenemos aquí promesa y
esa promesa es rechazada. Pero aquí no
manejamos errores en el bloque
dry and catch, que aprendemos en la sección seis. Recuerda, así que aquí en
try and catch block, aquí en el blog de caché, obtenemos objeto de error. Ahora bien, ¿qué queremos
hacer en este blog de caché? En el blog de caché en el mundo real, primero
registramos el error o excepción en algún lugar del
archivo o en la base de datos, y después de eso, devolveremos respuesta con
código de estado relevante y mensaje de error. Actualmente, solo estamos registrando
el error en la consola. En el futuro, guardaremos ese error o excepción
en un archivo separado. Ahora, después de registrar el error, devolvemos la respuesta
con el código de estado 500, que es error del servidor. Después de eso, también
devolvemos el objeto JSON con la propiedad de mensaje llamada error
interno del servidor. O puedes escribir algo que
salió mal en el servidor. Podemos escribir cualquier
mensaje de error que queramos. Bueno. Ahora podemos mover
todo nuestro código en este blog seco. Veamos qué pasa, veamos los cambios, y aquí nuestra
aplicación se reinicia. Pero aún así, nuestra base de
datos Mongoib no está conectada. Ahora vamos a enviar la solicitud de sugerencias. Déjalo cargar. Después de 10 segundos, vea, aquí obtenemos la respuesta con código de estado
500 y
con nuestro mensaje de error. Además, veamos qué
obtenemos en la consola. Ver, aquí obtenemos este
error de mangosta, igual que antes, y también nuestra aplicación no se bloquee por este
error Aún así, nuestra aplicación
se está ejecutando, manejamos con éxito nuestro error de promesa
rechazada. Aquí no consultamos
ni registramos este error, entonces en nuestro terminal, ni
siquiera sabemos que obtuvimos error. Ahora bien, si tratamos de
acceder a nuestras otras API, por ejemplo, enviamos esta solicitud de
todos los productos. Después de 10 segundos,
obtenemos aquí error, y en la terminal, nuestra
aplicación no se bloquea. Entonces como podemos ver
cómo podemos manejar error de rechazo de
promesa
usando try and catch block. De esta manera, nuestra aplicación
no se bloquea, y por eso es importante manejar
errores Para todas las rutas, tenemos que envolver todo
nuestro código con
try y cache block. Pero aquí en nuestra aplicación, tenemos casi de diez
a 15 rutas API. Tenemos que envolver todo
nuestro código de ruta API en try and catch Blog,
que se está repitiendo. Además, si algún día
queremos cambiar el mensaje de error o
cambiar la lógica de registro, entonces tenemos que
actualizarlo en todas nuestras rutas. Ahora podrías preguntar, ¿hay
algún atajo para eso? Sí, hay atajo y lo veremos
en la siguiente lección.
133. Crear un middleware con errores: En la lección anterior,
vimos que tenemos que repetir este error de registro y devolver la respuesta de error
en cada ruta API. En esta lección, vamos a crear un middleware común en el que
vamos a escribir código para este error de registro y
devolver la respuesta de error No te preocupes,
es realmente sencillo. primer lugar, en nuestro archivo index dot gs en la parte inferior,
después de todas las rutas, agregamos app dot g aquí pasamos función, y como sabemos, aquí
obtenemos tres parámetros, request response,
y next function. Ahora en esta función, escribiremos toda la lógica
para el manejo de errores. En primer lugar, agregamos
aquí consola dot log. Error, el middleware se está ejecutando para asegurarse de que
esto esté Ahora de vuelta a nuestra ruta, corta este código dentro
del bloque de caché y simplemente pégalo en nuestra
nueva función de middleware Ahora bien, si queremos cambiar
el mensaje de error o cualquier lógica
relacionada con el manejo de errores, entonces tenemos que hacer
cambios aquí en un solo lugar. Ahora
aquí hay una cosa. ¿Cómo podemos obtener este
objeto de error en esta función? Obtenemos este objeto de error como primer parámetro en esta función de
devolución Asegúrese de que obtenemos el
objeto error como primer parámetro. Ahora veamos ¿cómo podemos
llamar a este middleware? Así vector hacia fuera y aquí en el bloque de caché para llamar
al siguiente middleware,
lo que tenemos que hacer Bien, podemos usar la siguiente función. Aquí, obtenemos siguiente función como parámetro y simplemente llamamos a la siguiente función
en el bloque de caché, y pasamos objeto de error
en esta siguiente función. Si estás un poco confundido, entonces déjame
mostrarte el flujo de código de este middleware de error Como sabemos en nuestro back end, solo
estamos ejecutando un solo archivo, que es este index dot js. Entonces nodo, empieza a
ejecutar este código. Primero, se ejecutará este middleware
y código estático. Después de eso, tenemos todas las rutas y después de eso
agregamos error middleware Ahora cuando ejecutemos la siguiente función
en cualquiera de estas rutas, esa siguiente función
ejecutará este middleware de error En todas las rutas,
llamaremos a siguiente función, y como primer argumento, pasamos objeto
de error del bloque de caché. Si en nuestro triplog
algo sale mal, este método case
se ejecutará y ese método caché llamó a
esta siguiente función,
y que ejecutará esta función de middleware de
error Tan simple como eso. Ver los cambios, y vamos a comprobar que esto
está funcionando o no. Actualmente, nuestra
aplicación está funcionando, buena, cartero abierto, y enviar
la solicitud de sugerencias Y después de 10 segundos, obtenemos error, y
en nuestro terminal, obtenemos ramiddalware se está ejecutando,
lo que significa que nuestro
ramiddleware está funcionando lo que significa que nuestro
ramiddleware Y después de eso, obtenemos error de
Mangosta, genial. Entonces, si queremos cambiar algo en el manejo de
errores de rutas, entonces tenemos que hacer cambios
en un solo lugar.
134. Eliminar los bloqueos de prueba: Ahora nuestra
implementación actual es buena. Si estás de acuerdo con esto, entonces
puedes usar este enfoque. Pero a muchos desarrolladores
no les gusta este enfoque. Puedes ver que tenemos aquí
try y cache block, y tenemos que repetir
este try cache block en cada manejador de ruta
o función de callback, que se ve un poco desordenado En el mundo ideal, debemos
escribir sólo esta lógica. Entonces, ¿cómo podemos hacer esto?
Es realmente simple. Acabo de revisar esta actualización de
Express fi. En esta versión Express five, express maneja automáticamente el error de rechazo de
promesa o estos errores que ocurren
durante la operación asíncrona Express llama automáticamente a este siguiente middleware
con objeto de error, que ejecutará nuestro middleware de error
global Déjame mostrarte eso.
Entonces ahora aquí no necesitamos este
blog seco y caché. Podemos quitarlo. Así que aquí estamos de vuelta a nuestra sintaxis de ruta
original. Guarde este archivo, y
vamos a comprobarlo. Abrir cartero y enviar
la misma solicitud de cugion. Después de 10 segundos,
obtenemos este error. Y si comprobamos nuestro terminal de
código VS, vea, aquí primero obtenemos el error
middleware se está ejecutando,
y luego obtenemos nuestro error, lo
que significa que nuestro middleware de error global Esto es genial, ¿verdad? En la versión anterior,
como Express four, este
manejo automático de errores no está funcionando. En eso, tenemos que envolver cada lógica de ruta en bloque
seco y caché, pero ahora no
necesitamos hacer eso. Express hace esto automáticamente, tenemos que definir middleware de error
global en el archivo index dot js
. Tan simple como eso.
135. Registro de errores en el archivo: Entonces, en esta lección, registraremos nuestros mensajes de error en
un archivo de registro separado como este. Es realmente interesante.
Hagámoslo. Por lo que actualmente, solo estamos registrando el
mensaje de error en la consola. Ahora es el momento de almacenar esos mensajes de error
en un archivo separado. Así que en el futuro, podemos ver los errores que
ocurren frecuentemente, podemos encontrarlos y
mejorar nuestra aplicación. Entonces, para registrar los
errores en un archivo, use otro paquete NPM,
que es Winst Esta es una de las bibliotecas
más populares para registrar los errores, y también la hace muy
simple. Entonces abre terminal
y escribe NPM, instala WinSTERNF usando exactamente
la misma versión, escribimos en directo 3.17
0.0 y
golpeamos Ahora configurar el Winston
es realmente sencillo. En primer lugar,
importamos Winston, const, Winston es igual a requerir y pasamos nuestro nombre de
paquete Ahora bien, este Winston por defecto, danos un registrador Este registrador es suficiente para pequeños y medianos
tipos de aplicación. Así podemos personalizar
este registrador como
queramos para grandes y complejos
tipos de aplicaciones. Ahora este Winston o
maderero tiene transporte. Este transporte es como un vehículo
de reparto para tus registros. Decide a dónde debe ir
el tronco. Un transporte toma los mensajes del
registrador creados por Winston y los envía
a un destino específico Ahora el destino
podría ser Consola que imprime el registro en la
terminal o línea de comandos. A continuación, tenemos archivo para guardar los logs en un
archivo de nuestro sistema, SDTP para enviar el
registro a una API y a continuación, tenemos base de datos para almacenar los logs en una
base de datos como Mongo DB Por fin tenemos
servicios en la nube para enviar logs a servicios como AWS,
Datadog, etcétera. Estos son todos los transportes
proporcionados por Winston. Déjame mostrarte algunas de ellas. Este paquete Winston por defecto, usa Consultar transporte para
imprimir los registros en el terminal, pero aquí queremos guardar también
los logs en el archivo separado, y para eso, tenemos que
configurarlo Entonces aquí escribimos Winston
dot Create Logger. Ahora en esta función, tenemos que pasar objeto de
configuración, o podemos decir lo
que queremos personalizar. Ahora la primera
configuración es de nivel. Esta propiedad de nivel define qué tipos de mensajes
queremos almacenar o registrar. Por ejemplo, solo
queremos almacenar errores, o queremos registrar
advertencias y errores, ambos, o queremos registrar
todo tipo de mensajes. Entonces en Minston tenemos
muchos niveles de registros. El primero es el error, que es el nivel más alto
de registro para problemas graves. Ejemplo, falla en la
conexión a la base de datos. A continuación, tenemos guerra por advertencias, información para
mensajes informativos como
servidor que se ejecuta en puerto o un
GTB conectado, etcétera. A continuación, tenemos los
verbos SDDP debug, Ci. Este es el nivel máximo a
mínimo de registros. error es el nivel más alto y CLI es el nivel más bajo de registros Ahora bien, si en la etiqueta, pasamos info obtenemos mensajes de
log de info nivel
superior de ese, que es warning y además
obtenemos log de errores. Si en etiqueta, pasamos tontos, entonces obtenemos todos los mensajes
de niveles superiores. Para una mejor práctica,
pasamos aquí info porque no queremos almacenar mensajes
tontos en nuestro archivo de registro. Ahora después de la etiqueta,
tenemos transportes, y aquí tenemos que pasar todos los transportes que
queremos agregar en array En palabras simples, donde
queremos enviar nuestros registros. Queremos mostrarlo en la consola o queremos
almacenarlo en cualquier archivo. Entonces, antes que nada, para la advertencia de
información y los errores, queremos mostrar los registros
en la consola. Entonces agregamos aquí nuevos transportes
Winstn dot. Asegúrese de que sea transportes, no transporte y punto Consola Por ahora, sólo vamos a consolarlo. Yo solo un minuto, vamos a almacenar estos registros
en archivo separado. Ahora para usar este registrador, lo
almacenamos en una
variable llamada logger. Y ahora podemos usar
este registrador en nuestra aplicación. Pero
aquí hay una cosa. ¿Cómo puede este registrador saber qué nivel de mensaje
estamos enviando? ¿Es una información o advertencia
o error? ¿Cuál? Supongamos aquí en la parte inferior, tenemos este sencillo mensaje de consola de servidor de registro de
punto en ejecución. Esta es una información. Así que en el lugar de usar registro de puntos de
consola,
podemos usar logger, que acabamos de crear, y este logger tiene todos los
métodos según los niveles. Entonces, si queremos enviar
mensaje como info, entonces usamos aquí
logger dot info. Si tenemos advertencia, entonces usamos logger punto uno. Ahora queremos logger dot info, y veamos que estamos
obteniendo este registro en Consola o no. Ver
dónde cambian los cambios. Y si revisamos nuestro terminal, vea aquí obtenemos este nivel de
objeto a Info y servidor de mensajes
escuchando en el puerto 3,000. Genial. Ahora bien, este no es un
buen formato para el registro. En el mundo real, no
necesitamos solamente etiqueta y mensaje. Necesitamos mucha más
información sobre el registro como
marcas de tiempo, etcétera. Entonces en la configuración, tenemos una
propiedad más llamada format. Aquí definimos cómo aparecen los mensajes de
registro. Aquí escribimos winston formato
punto, punto Combinar. Y en esto, podemos pasar
algún formato de Winston. Al igual que agregamos Winston formato punto, punto T Stem, y después de eso, winston dot format dot JSON No te preocupes. Tenemos que instalar
a Winston una sola vez Después de eso, solo usamos este registrador para imprimir
y enviar registros. Comparte los cambios
y echa un vistazo. Ver, ahora también obtenemos marca de tiempo. Ahora en nuestro
middleware de error, aquí,
vea, usamos el
registro de puntos de consola para este objeto de error Así que podemos usar aquí ahora,
logger dot message. Tenemos que pasar
el mensaje de error, que es mensaje de punto de error, y también enviamos
todo el objeto de error. Veamos qué obtenemos. Guarde los cambios, y devolvamos a
probar esto a Postman. Y enviamos aquí obtener solicitud de
sugerencia. Ahora después de diez segundos, vuelta al código Vas, abre terminal. Mira, aquí obtenemos nivel a mensaje de
error
al mensaje de error, y en la propiedad stack, obtenemos todo el objeto error, que pasamos en el método
logger dot error, y al final,
obtenemos time stem. Ahora vamos a hacer este
registro más avanzado. Aquí solo estamos recibiendo el mensaje de
registro y la pila de registros, pero aquí no obtenemos
qué ruta causó este error o qué método
creó este error. Queremos añadir eso en nuestro registro. Eso nos dará información
específica. Es realmente simple. Entonces en el error de punto logger, en el lugar de este
segundo argumento, podemos pasar objeto. En este objeto, podemos definir cuáles son las otras
propiedades que queremos mostrar. Entonces primero, agregamos stack
a error dot stack. A continuación, queremos que el método API, así método para solicitar método punto. A continuación, queremos ruta para
solicitar la URL original del punto. Asegúrate aquí de escribir
el nombre correcto de la propiedad. También, podemos ordenar
estas propiedades. Supongamos que queremos mostrar
el ciervo al final, y primero, queremos
método y luego camino Entonces en este objeto,
también podemos establecer el orden
de las propiedades. Pero para eso, en nuestro formato, tenemos que agregar este formato JSN De lo contrario, no va a funcionar. Guarda los ins y echa un vistazo. Vuelva a enviar
la solicitud de las sugerencias después de 10 segundos al código VS en el terminal. Ver, aquí obtenemos el método de mensaje de
error para obtener ruta a nuestra API, lo que provocó este error, pila
completa de este error y
marca de tiempo de este Encantadora. Así que terminamos con
el formateo de nuestro registro. Ahora, vamos a almacenar el registro
en el archivo separado, no sólo en Consola. Entonces aquí en el transporte, agregamos otro transporte nuevo Winston dot
transporta archivo Aquí pasamos el objeto
dentro de la propiedad, nombre de
archivo, logs, smlogs dot log Asegúrate de usar tu extensión de
archivo dot log, lo que nos ayudará a
entender lo que hay en el archivo. Ahora di los cambios
y échale un vistazo. En la terminal,
obtenemos esta información de registro, y si verificamos nuestra aplicación,
nuestro archivo de registro se crea
en logs slamlogs dot Y si abrimos este archivo, vea, obtenemos información
agregada en el archivo. Si enviamos de nuevo,
obtenemos solicitud
del cartero y
después de 10 segundos, obtenemos aquí error y si
volvemos a nuestro VSCode, entonces obtenemos nuevo
nivel de registro Ahora a algunos desarrolladores les gusta
registrar solo errores en el archivo, no informaciones y advertencias. Creo que eso es mucho mejor.
También podemos hacer eso. Volver a Winston. Aquí
después del nombre del archivo, también
podemos especificar
el nivel a error. Esto significa que solo almacenamos
errores en este archivo, y también podemos cambiar el nombre del
archivo a errores dot log Entonces, si en alguno de
estos transportes, no
especificamos el nivel de registro, entonces ese transporte
utilizará este nivel de registro global Y si especificamos el
nivel de registro en los transportes, entonces anulará
este nivel de registro global Supongamos que para el transporte de consola, agregamos nivel de objeto para depurar. Así que ahora para todos los niveles
que están a punto de depuración, mostraremos log in Console y solo los errores se almacenarán en
el archivo de registro de errores punto. Entonces así es como almacenamos
los registros en un archivo separado, y luego podemos mejorar nuestra aplicación de
acuerdo a eso. Entonces, para resumir, el registro de
puntos de consola no está mal. Pero al usar Winston, podemos almacenar nuestros registros en un archivo separado, lo que hace que nuestra aplicación sea
más profesional
136. Registro de errores en mongoDB: Ahora en esta lección,
almacenaremos nuestros registros en nuestra base de datos Mongo
DB así Es realmente sencillo,
hagámoslo. Para almacenar los
registros en Mongo DB, necesitamos otro
paquete Winston, abrir terminal, y aquí escribir NPM
instalar Winston Mongo DB, a la velocidad 6.0 Minimizar esta terminal, genial. Ahora para agregar este
paquete en la parte superior, requerimos Winston des Mongo DB Ahora en la
configuración de Winston, necesitamos agregar otro
transporte para Mongo DB Entonces después de este transporte de archivos, agregamos nuevos Winston dot
transporta punto MongoDB Y en este transporte, tenemos que establecer algunas opciones. El primero es DB. Aquí, tenemos que
agregar URL de base de datos. Simplemente copiamos esta
URL de conexión de Mongo DB y la pegamos aquí Además, podemos pasar
el registro nivel por
nivel de propiedad a
error, y eso es todo. Ver los cambios, y vamos a comprobar
simplemente esta
implementación. Ejecutemos nuestro
servidor si no se está ejecutando y enviemos la misma solicitud de
sugerencias. Después de 10 segundos
volviendo al código Vas, aquí obtenemos el error en la consola y si
revisamos nuestra base de datos, aquí obtenemos nueva colección de registros, y en eso obtenemos
nuestro último error. Aquí obtenemos
timestamp, log level, que es error, mensaje de error, y por último, obtenemos metadatos Este es el mismo objeto
que pasamos al segundo parámetro de error de punto del
registrador. Ver, aquí tenemos método, ruta, y
pila completa del error. Así de sencillo registrar
errores en la base de datos. Si quieres almacenar
registros en la base de datos, entonces puedes quedarte
con este transporte. Y si quieres almacenar los
registros en un archivo separado, entonces podemos quedarnos con
este transporte de archivos. Mostrarte las dos
vías, puedes usar cualquiera de ellas de acuerdo
a tu elección. Realmente depende de ti.
137. Excepciones sin capturar: Así que hasta ahora en este proyecto, hemos manejado errores que ocurren
en el manejador de rutas y el manejador de ruta
pasará error o excepción al middleware de error
global Ahora bien, ¿y si obtenemos error en el resto de la aplicación de
nodo? Nosotros no lo manejamos, ¿verdad? Entonces para demostrarlo, elimino el comentario de la conexión de Mongo DB y simplemente lanzo un nuevo
error desde aquí Así que lanza nuevo error, y aquí pasamos mensaje de error, algo falla en
la aplicación del nodo. Entonces los cambios, y
en nuestro terminal, detienen nuestra aplicación, y ejecutamos nuestra aplicación usando
node index dot js. Ver, aquí obtenemos error, algo falla en
la aplicación de nodo, y además nuestra
aplicación se bloquea. Esto se llama excepción
no capturada. Una excepción no capturada es como un
invitado sorpresa en una fiesta No estás preparado
para ello y causa caos porque
no hay plan para manejarlo. En palabras simples, cada vez que la aplicación de
nodo se un problema o una excepción que no
sabe manejar, se llama una excepción no codificada Estos son errores en nuestro código, esos no son agarrados por un intento y captura adecuado
o no se manejan correctamente, y como resultado, Node
simplemente no sabe qué hacer y nuestra
aplicación se estrelló A medida que nuestra aplicación se bloquea, nuestro front-end no obtendrá
los datos de nuestro back end Nuestra API no funcionará. Por lo que es importante manejar
esas excepciones de descodificación. Ahora la pregunta es, ¿cómo podemos manejar excepciones de descodificación
en nuestra aplicación de nodo Porque estas excepciones o
errores pueden ocurrir en cualquier lugar. ¿Cómo podemos
manejarlo? Entonces para eso, tenemos que agregar oyente para nuestra aplicación de nodo.
Déjame mostrarte. Entonces aquí después del Winston, escribimos proceso punto en Esto nos ayudará a agregar
oyente para un evento específico. Ahora, en qué evento,
queremos escuchar. Escribir, es excepción sin codificar. Asegúrate de escribir
el mismo nombre del evento. De lo contrario, no va a funcionar. Ahora ¿qué queremos hacer cuando ocurra una excepción
no codificada
en nuestra aplicación Que añadimos la función de devolución y tiene error o excepción En la
función callback, por ahora, simplemente
consultamos un
log de este objeto de error Este proceso dot on es
como una persona de vigilancia. Está
vigilando nuestra aplicación, y si en nuestra aplicación ocurre
alguna excepción uncod, ocurre
alguna excepción uncod, process dot on ejecutará
esta función de devolución de llamada Entonces en el lugar de
usar el registro de puntos de la consola, podemos usar el error de punto del registrador. Y en eso, tenemos que
pasar primero la excepción de cadena no capturada, y luego pasamos
todo el ciervo de error Comprobaremos que esto
está funcionando o no. Guarda los cambios,
y en el terminal, vamos a tamizar el terminal
con el comando CLS, y luego ejecutamos nuestra aplicación
usando node index dot js Ver, aquí obtenemos nuestro error en la consola y nuestra aplicación no
está grasada por sí misma Pero como podemos ver, tampoco
obtenemos la información del servidor que se ejecuta
en el puerto 3,000, lo que significa que el servidor no
se está ejecutando. Entonces nuestra aplicación está
colgando en el medio. El servidor no se está ejecutando y la aplicación no está grassing. Por lo que nuestra aplicación
no está en el estado estable. Entonces, lo que queremos hacer ahora tiene
que salir de este estado
inestable. Entonces después del error del punto del registrador, simplemente escribimos
process dot exit, y aquí pasamos
uno como código de salida. Uno significa error. Además, tenemos el código de salida cero, que significa que todo está bien, pero aún así queremos salir. Y si pasamos el código de salida uno, lo que significa que se produce algún error, y por eso salimos. Entonces los cambios, y vamos a ejecutar nuestra aplicación
una vez más. Nodo, punto índice Js y C, ahora salimos con éxito
de nuestra aplicación. Hermoso. Ahora bien, podrías hacer esta pregunta si después de
manejar la excepción, aún estamos
cerrando nuestra aplicación, entonces ¿cuál es el punto de manejar
la excepción no capturada Por lo que manejar la excepción no capturada no
se trata de
evitar el set down. Se trata de asegurar que el set
down ocurra de manera ordenada, segura e informativa Cuando ocurre una
excepción no capturada, estado de
nuestra aplicación es impredecible Después de un bloqueo no aceptado, posible que
partes de nuestra aplicación
no funcionen como queremos Por ejemplo, obtuvimos conexiones de
base de datos rotas , memoria
corrupta,
solicitud incompleta, etcétera Reiniciar la aplicación garantiza que comienza de nuevo sin
problemas sobrantes Además, en producción,
herramientas como PM two, Docker o Kubernets
monitorean nuestra app Cuando nuestra aplicación se apaga, estas herramientas
reinician automáticamente nuestra aplicación. Manejar el error
asegura la salida de la aplicación claramente mediante el uso de
process dot exit V, y también facilita que la herramienta de monitoreo reinicie nuestra aplicación sin problemas
pendientes. Además, una cosa que encuentro aquí es cuando estamos haciendo
proceso de salida de punto, nuestros registros no se están
almacenando en el archivo
ni en la base de datos, pero se puede ver el registro en la consola. ¿Qué pasa aquí? Entonces, cuando procesamos la salida de punto, nuestra aplicación de nodo se
termina de inmediato. No está esperando que se complete una tarea
asíncrona como iniciar sesión en un archivo o
una base de datos En palabras simples,
proceso punto salida uno no espera a que estas
operaciones terminen, por lo que la parte del registro se puede omitir parcial
o completamente Ahora bien, ¿cómo podemos resolver este
problema? Es realmente simple. Tiene que salir del proceso después de nuestro registrador complete
su proceso de registro. Entonces después de este error de punto logger, escribimos logger dot on, y lo adivinaste correctamente, esto también es
oyente de Winston Aquí, pasamos nuestro nombre de evento, que es finish, y en
el segundo argumento, pasamos la
función Callback, y en eso, podemos simplemente mover este
proceso punto exit one Para una mejor práctica, también
registramos punto. Guarda los cambios, y
veamos que está funcionando o no. Ejecuta esta aplicación, y si
revisamos nuestro archivo logger, vea, aquí obtenemos nuevo
registro, por lo que está funcionando.
138. Rechazos de promesas no atendidas: Supongamos que en nuestra aplicación de
nodo, tenemos alguna promesa
que es rechazada y olvidamos
manejar ese error usando try and cache Blog
o método cache. Esa promesa rechazada
necesita ser manejada. Entonces para demostrarlo,
eliminamos esto por error y creamos
aquí una nueva promesa. Digamos que la promesa rechazada de costo
es igual a la nueva promesa. Como sabemos, aquí, tenemos que pasar la función
callback con dos parámetros,
disolver y rechazar Ahora para rechazar la promesa, simplemente
llamamos aquí método de
rechazo, y aquí creamos un nuevo mensaje de
error y pasamos error. ¿Qué escribimos por error? Digamos error en la promesa. Perdón por este mensaje de error. Ahora vamos a consumir esta promesa. Rechazar un punto de promesa entonces y en esa función de error
y simplemente
consultamos dot log,
promise está funcionando. Incluso se puede usar aquí OD, pero para eso, tenemos que
envolverlo con una función de pecado. Por eso utilizo entonces método, y aquí no manejamos el
error usando el método de caché. Ahora veamos qué va a pasar. Guarda los ings y ejecutemos nuestra aplicación con
node index dot js. Aquí obtenemos log para este error, y como podemos ver no capturados nuevamente se llama a
excepción En las versiones del nodo 15 y
superiores a 15, rechazo de promesa
no manejado se trata más como una excepción
descarada. Si no manejamos el rechazo de la
promesa, entonces puede fluir hacia el manejador de excepciones
sin cortar Para almacenar por separado el rechazo
UnhandlepMise, podemos duplicar
este código y simplemente cambiar el evento También en el registrador, pasamos aquí mensaje de error como rechazo de promesa no manejado Vea los cambios y
ejecutemos esta aplicación
una vez más. Ver, ahora llegamos aquí mensaje de
error, rechazo de
promesa inmanejable Así es como podemos
manejar excepciones no capturadas
y rechazo UnhandlepMise y rechazo UnhandlepMise Ahora, en nuestra aplicación, cambiemos este registro de puntos de
consola para la conexión Mongo Di B. ¿Qué escribimos aquí?
Logger dot info. Y en el método cache, reemplazamos este
registro de puntos de consola con error de punto logger. Y además, tras la
falla de conexión, podemos salir de nuestra
aplicación porque toda
nuestra aplicación
depende de esta conexión. Entonces envolvemos este código
con llaves. Simplemente de los oyentes
globales, copie este punto de registrador
y punto de registrador,
y péguelo aquí Dejará que nuestra
aplicación almacene el registro en el
archivo y la base de datos. Ahora, también, no necesitamos esta promesa de error y
también este método entonces. Así es como manejamos
los errores y los registramos para mejorar y mantener el
seguimiento de nuestra aplicación.
139. Resumen del manejo y registro de errores: Recapitulemos rápidamente
esta sección. Entonces, antes de esta sección
en nuestra aplicación, no
manejamos errores. Entonces primero, manejamos errores
para los manejadores de rutas API. Cualquier error ocurre en
el manejador de rutas, ese error se enviará al siguiente middleware
por último Express,
y después de todas las rutas en
el archivo js de punto de índice, y después de todas las rutas en
el archivo js de punto de índice, agregará middleware de error que maneja todos los Ahora, después de manejar errores, podemos almacenar esos errores en
los archivos o en la base de datos. Entonces, para registrar los errores, utilizamos el paquete Winston y Winston
Des Mongo DB Aquí, configuramos el
registrador Winston en el que especificamos el formato de etiqueta de registro global de nuestro registro y algunos transportes
para enviar nuestro registro a consola,
archivo, e incluso en Mango Di Por estos, podemos almacenar
errores de los manejadores de ruta. Pero, ¿y si algo sale
mal fuera del expreso? Así que definimos dos oyentes
globales, uno para excepciones no capturadas, y otro para rechazo
no Recuerde, si no agregamos oyente para rechazo
no manejado,
por defecto, node tratará el rechazo por defecto, node tratará promesa como excepción no
capturada Además, en estos oyentes globales, registramos los errores y luego
establecemos con gracia Al final, este punto de registro
dejará de escribir nuevos registros,
terminará cualquier registro pendiente
y cerrará flujos de transporte como
flujos de archivos,
SDDPRquest o
conexiones de base de datos para el registrador terminará cualquier registro pendiente
y cerrará flujos de transporte como
flujos de archivos, y cerrará flujos de transporte como
flujos de archivos, SDDPRquest o
conexiones de base Eso es todo acerca de manejar
y registrar errores. Ahora en la siguiente
sección, agregaremos más funciones en nuestra aplicación de
comercio electrónico.
140. Sección 12: creación de un modelo de carrito: Bienvenido a otra sección
importante del curso definitivo No Jz En esta sección,
avanzaremos en nuestro proyecto de
comercio electrónico. Primero, agregaremos
algunas funciones de la tarjeta, y luego integraremos pasarela de
pago en
nuestra aplicación, lo cual es realmente importante
y divertido de crear. Estoy muy emocionada
y espero que tú también. Entonces comencemos esta sección. Hasta ahora en nuestro proyecto, hemos agregado
categorías de usuarios y productos API. Ahora, cuando el usuario quiera
comprar algún producto, agregará su
producto en la tarjeta. Así que la tarjeta funciona como canasta
o carro en supermercado. Agregar todos los productos que
queremos comprar, y luego pagamos por
esos productos. Esto ya lo sabemos, ¿verdad? Por lo que crearemos un nuevo
modelo para los datos CAT. Así que en la carpeta de modelos, creamos un nuevo archivo
llamado cart dot js. Ahora para definir el esquema, primero Cost Mangoose es
igual a requerir mangosta Y después de eso, definimos st esquema CAT es igual al
nuevo esquema de punto mangosta Aquí agregamos nuestro esquema de tarjeta. En este modelo de tarjeta, almacenaremos todos los datos de la tarjeta de
los usuarios. Así que antes que nada, necesitamos
almacenar usuario a tipo
de objeto a esquema de punto Mangoose tipos de
punto punto punto ID de objeto, ref a usuario y simplemente
hacemos que sea necesario para true Ahora después de usuario, queremos qué productos el usuario agregó en su tarjeta. Entonces agregamos productos llenos, y como sabemos en CAT, el usuario puede agregar múltiples productos. Por lo que será la
matriz de productos. Ahora para cada producto, almacenamos productos objeto, y en ese objeto, almacenamos el primer ID del producto. Esto vuelve a ser referencia, así que simplemente copio este objeto de
esquema para el usuario. Pégalo aquí para obtener el ID del producto y asegúrese de cambiar este usuario de
referencia a producto. Ahora, después de la identificación del producto, necesitamos
la cantidad de ese producto. Entonces agregamos cantidad
al objeto, tipo, al número requerido a true
porque eso es necesario. Hombre a, también podemos agregar
default a uno por seguridad. Ahora bien, si imaginamos
nuestro front-end, queremos mostrar datos como este. Primero, queremos mostrar el nombre o título
del producto, luego el precio, luego la
cantidad y el total. Si solo almacenamos el
ID del producto en los datos de la tarjeta, entonces tenemos que ejecutar poblar para obtener detalles del producto como título, precio, imagen, etcétera, pero tomará más tiempo obtener los datos
de la tarjeta Podemos utilizar aquí enfoque híbrido. Si tus
necesidades de aplicación son diferentes, entonces tienes que apegarte
al único enfoque de referencia. Entonces, si quieres rendimiento, entonces usas híbrido, y si quieres consistencia de los datos donde se titulan tus
productos, imágenes de
precios están
cambiando más a menudo, entonces tienes que usar el enfoque de
referencia. Entonces después de la cantidad,
agregamos title, type to string, y
required to true. Después de eso, necesitamos precio, tipo a número,
requerido a true. Después del precio, es posible que necesitemos una
imagen que será la imagen de
portada del producto, tipo a cadena y
requerida para true. Por fin, necesitamos precio total, que es el precio total
de este producto actual, tipo a número y
requerido a true. Este precio total, contaremos por precio en cantidad, ¿verdad? Esto es todo lo que necesitamos en
el objeto productos. Ahora bien, ¿qué necesitamos
más en el carrito? Volvamos a ver la página de GRT. En primer lugar, en cualquier sitio web de
comercio electrónico, obtenemos la cantidad de productos
en el Nepar o en algún lugar Y también para la página CRT, necesitamos mostrar el precio
final del producto Entonces necesitamos dos campos más
en nuestro esquema de tarjetas. Primero, el total de productos a
escribir el número predeterminado es cero. Si en nuestra tarjeta, tenemos dos iPhones y
tres relojes inteligentes, entonces nuestros
productos totales serán cinco Y después de los productos totales, necesitamos el precio total de la tarjeta. Podemos asociar como precio final,
pero el precio total de la tarjeta
se ve más cool. Así que el precio total de la tarjeta, tipo a número, y
también por defecto a cero. Ahora aquí podría preguntarse ¿por qué necesitamos almacenar
el precio total de la tarjeta? ¿Por qué no podemos calcular los
valores cuando enviamos datos de tarjetas? La razón por la que almacenamos el precio
total de la tarjeta es porque, número uno, una visualización más rápida. Entonces, cuando el usuario ve su tarjeta, el sitio web puede mostrar el precio total al instante sin
volver a calcularlo cada vez Esto ahorra tiempo, sobre todo si hay muchos
productos en la tarjeta. Segundo, reducir el trabajo
para el servidor. Esto se debe a que
no necesitamos calcular el precio final
varias veces en lugar Así que imagina que nuestro usuario tiene diez
productos diferentes en su tarjeta. Sin el precio total de la tarjeta, nuestro servidor tiene que mirar a través los diez productos y sumar sus precios cada vez
que abres la página de la tarjeta. Ahora con el precio total de la tarjeta, nuestro servidor solo obtiene el precio total
ya en tienda Esto ahorrará tiempo y esfuerzos, y por eso almacenamos aquí precio
total de la tarjeta
en la base de datos. Ahora tenemos nuestro esquema
de tarjetas listo. Si en el futuro, queremos agregar más campos o queremos
eliminar algo, entonces también podemos hacer eso. No hay nada de
malo en eso. Además, no te apegues
a un enfoque. Como desarrollador, tenemos que pensar siempre qué
hace que nuestra aplicación o producto sea más útil y rápido para los
usuarios finales. Tan simple como eso. Ahora vamos a crear el modelo Cart, seconst card es igual
al modelo de punto de mangos Primero, agregamos nombre singular, que es carrito y
en segundo argumento, pasamos esquema de carrito. Por último, al final, vamos a hacer módulo dot
exportaciones es igual a CAT.
141. Definición de la lista de API para el carrito: Ahora antes de comenzar a
construir las APIs para tarjeta, veamos cuáles y cuántas
APIs necesitamos crear. Esto nos dará claridad. Entonces aquí está mi proceso para
definir la lista de API. Empecé a imaginar el front-end desde la perspectiva del
usuario. En palabras sencillas, me pongo
en el zapato de usuario normal, lo que el usuario
quiere hacer con tarjeta. Primero, simplemente quieren
agregar producto en la tarjeta. Entonces esta es nuestra primera API. Después de agregar el
producto a la tarjeta, quieren ver su propio carrito, qué productos agregaron y cuánto dinero
necesitan para comprar. Entonces necesitamos API para obtener
el carrito de usuario actual. Además, en la barra Nuevo, les gusta ver la cantidad de productos disponibles en el carrito. Así podemos crear
API separadas para solo números de tarjeta. Después de eso, en la página del carrito, pueden aumentar
la cantidad de productos o disminuir la
cantidad de los productos, y también pueden eliminar todos
los productos
de la tarjeta. Aquí necesitamos tres APIs más, una para aumento,
segunda para disminución y última para el producto delete. Entonces aquí tenemos la lista
de APIs para el carrito. Por supuesto, podemos agregar o
eliminar APIs de esta lista. Realmente depende de nosotros.
142. Cómo agregar productos al carrito: Comencemos con nuestra
primera API para CAT, que es agregar un solo
producto en la tarjeta. Así que en la carpeta rutas, creamos un nuevo archivo
llamado card dot js. Bueno. Ahora dentro de este archivo, creamos Router para API. Entonces Const Express es igual
a requerir Express, y después de eso, costo Router es igual a express dot Router Y como sabemos, al final,
el módulo de puertos punto
es igual a Router. Ahora antes de definir la API, vamos a configurar este router en
nuestro archivo index dot js. De lo contrario, nuestras
API de carrito no funcionarán. Guarde este archivo, muévase al archivo js punto
índice y
simplemente aquí const rutas
CAT es igual a
requerir periodos rutas CART Asegúrate de escribir aquí,
requieres no requerido. Hace poco, cometo este error. Ahora en la parte inferior,
agregamos app dot g. aquí agregamos prefijo
API slash CAT Aquí agregamos rutas de tarjetas. Encantadora. Ahora, comencemos
con la API de cabeza a carrito. Entonces aquí agregamos Router. Y ¿me puede decir qué
método vamos a utilizar? Correcto, usaremos el método post. Así router punto post endpoint es forward slas aquí después de eso, agregamos route callback con
request and response Ahora bien, ¿qué queremos
de la parte delantera? Principalmente necesitamos dos cosas. Primero, necesitamos el ID del producto que el usuario quiera
agregar en la tarjeta. Y segundo, queremos saber la cantidad de su producto. A la vez, el usuario solo puede agregar un producto
con su cantidad, y si quiere
agregar otro producto, entonces tiene que llamar nuevamente a
esta API. Tan simple como eso. Entonces primero, obtenemos detalles en el cuerpo del punto de
solicitud. Podemos reestructurarlo aquí y obtener la identificación del producto y la cantidad También para más conveniente, obtenemos el ID del producto
en el parámetro de consulta. Así que eliminamos estos de aquí
y en el punto final, agregamos dos puntos ID de producto. Y para obtener este ID de producto, agregamos aquí costo ID de producto es igual a solicitar punto
PRAM punto ID de producto Bueno. Ahora, después de
eso, ¿qué queremos? Sí, también necesitamos ID de usuario. Y como podemos conseguir que si, podemos agregar orthomidalware aquí,
y para obtener el usuario, podemos escribir const user id es igual
a solicitar punto
usuario punto subrayado ID a solicitar punto
usuario punto Ahora, aquí viene una parte
lógica lo que realmente queremos hacer en
la API head to cart. En primer lugar, verificaremos identificación del producto
frontal y centavo y la cantidad o no. Siempre comience con la validación. Agregamos si la
identificación del producto de condición no está disponible, o la cantidad no está disponible, entonces devolvemos el error. Por lo tanto, devuelva la respuesta, el estado del punto, 400 para los campos faltantes y el objeto JSON de punto con propiedad
Menset,
faltando los rellenos requeridos Bueno. Ahora, después de eso, verificamos, front end pasar el ID de producto
válido o no. ¿Hay algún producto con
ese ID en nuestra base de datos? Para eso, escribimos costo, producto es igual a un peso
producto punto encontrar Por ID, y aquí pasamos ID de producto. Además, si la entrada automática
no funciona, entonces tenemos que
ingresar manualmente este modelo de producto. Entonces para usar esperar, tenemos que hacer esta
función asíncrona Ahora en la parte inferior, podemos
poner aquí si condición, si el producto no está disponible, devolvemos respuesta que
estado 404 punto Json. Y en la propiedad messet, pasamos producto no encontrado Ahora de nuevo, estoy preguntando qué queremos hacer en la API
Agregar al carrito. Vayamos paso a paso. No te confundas. Nosotros
queremos simplemente hacer una cosa. Creamos una nueva tarjeta
para el usuario y simplemente agregamos el producto actual en la matriz de productos
con los rellenos requeridos. Pero existe la posibilidad de que esa tarjeta de usuario
ya esté disponible. Aquí, no queremos
crear tarjetas duplicadas, así que comprobamos que la tarjeta const
es igual a esperar tarjeta Ver trabajos de entrada automática, tarjeta punto Fine One. Y aquí en el objeto
condición, pasamos usuario a ID de usuario. Ahora, como sabemos a la vez,
un usuario solo tiene
una tarjeta porque si el usuario
revisa los productos
después del pago con éxito, eliminaremos la
tarjeta de usuario de la base de datos. Si este usuario tiene su tarjeta, entonces la obtenemos en
la variable de tarjeta. ¿Y si el usuario no tiene carrito? Puede primero producto para tarjeta. Entonces verificamos estado. Si el carrito no está disponible,
entonces ¿qué queremos hacer? Bien,
crearemos una nueva tarjeta. Así que nueva tarjeta. Y aquí pasamos Object. Primero, agregamos usuario a ID de usuario, producto a matriz vacía por ahora. Total de productos a cero y precio
total de la tarjeta a cero. Ahora, esto devolverá el carrito. Aquí podemos simplemente usar
esta variable de tarjeta y reemplazar su valor porque
si la tarjeta no está disponible, solo entonces
crearemos un nuevo CAT. De lo contrario, obtenemos objeto de tarjeta
en esta variable de tarjeta. Utilizamos aquí la tarjeta es
igual a la nueva cesta. Entonces para reemplazar
esta variable de tarjeta, tenemos
que definirla usando let. De lo contrario, obtendremos error. ¿Tienes claro hasta este punto? Y además, si estás un poco
confundido, entonces no te preocupes. Cuando completemos esta API, recapitularemos esta
API desde cero. Por eso, toda tu
confusión desaparecería. Entonces tenemos carrito y solo
tenemos que empujar producto
en la
matriz de productos con cantidad y otros campos que
definimos en el esquema. Así podemos hacer carrito punto
productos dot push. Y aquí pasamos
objeto producto, que queremos empujar. Entonces objeto, que son los
campos, realmente me olvido. Déjame revisar el modelo CAT. Bien. Entonces primero, ID de producto a ID de
producto, cantidad
a cantidad. Después de eso, tenemos título. Ahora aquí, ¿cómo podemos
obtener el título del producto? Porque el front-end
solo pasará el ID del producto. Piénsalo. Por lo que obtenemos los detalles
del producto de
esta variable de producto. Consulta aquí también comprobamos que el
producto es válido o no. Si el producto es válido, entonces obtenemos su detalle
en la variable producto. Entonces ahora esto tiene sentido
por qué encontramos producto. Validará el ID del producto, y también obtendremos
otros detalles también. Así título al título del punto del producto. Precio a producto precio punto, que es el precio actual
del producto, imagen, que es la imagen de portada, por lo que producto punto Imagen, que es matriz, y
simplemente establecemos la primera imagen. Ahora podrías preguntar por qué no
obtenemos estos detalles
del front end. Imagina que obtenemos este
detalle de precio desde el front end. Si sobrepasas el cero
para cualquier producto, el precio se almacenará
como cero para su auto Por lo que claramente no podemos confiar
en los datos de front-end. Es mejor que obtengamos
datos reales de la base de datos. Ahora, después de esa imagen, tenemos el precio total
de ese producto, que es el
precio actual en cantidad. Así que el precio del punto del producto
en cantidad. Y eso es todo lo que necesitamos
en la matriz de productos. Ahora tenemos que hacer
sólo dos cosas. Tenemos que contar los productos
totales de la tarjeta y luego el precio
total de la tarjeta. Estos dos son muy sencillos. Y ¿sabes qué método usaremos para
contar la suma? Bien, usaremos método
reducido. Escribimos cart dot total products es igual a cart dot products, que es array dot reduce, como sabemos, tenemos que pasar dos argumentos en
el método reducido. La primera es la función de devolución de llamada
en la que calcularemos la cantidad de productos y luego valor
predeterminado de la
cantidad que es cero Ahora en la devolución de llamada,
obtenemos dos parámetros, total y producto, que es
un solo objeto de producto A partir de la devolución de llamada, simplemente
devolvemos total más la cantidad de puntos del producto En definitiva, este
método reducido ejecuta el bucle para cada producto y nos da la
suma de la cantidad del producto. Genial. Ahora tenemos que simplemente
calcular el precio total de la tarjeta y
volveremos a utilizar el
método reduce para eso. precio total de la tarjeta del punto de la tarjeta es igual al carrito de productos dot,
dot reduce. Aquí nuevamente pasamos
dos argumentos. primera es la función
callbeck con función flecha de
objeto
total y producto Y después de eso, simplemente en valor
por defecto de este
total, que es cero. Lo que devolvemos de
esta función de devolución de llamada. Simplemente devolvemos el total
más el precio del punto del producto en la cantidad del producto. O por simplicidad, podemos
devolver el total más el precio total, que calculamos aquí. Además, creo que no necesitamos
este campo de precio total. En realidad no está haciendo
impacto. ¿Qué opinas? Sí, así que vamos a
eliminarlo del método push, y también tenemos
que eliminar eso del esquema. Pasar al esquema del auto y eliminar este precio total llenado
del objeto products. Tan simple como eso. Ahora tenemos todos los rellenos de tarjetas
llenos de detalles, así que simplemente podemos guardar la tarjeta. Esperar tarjeta punto C.
Después de guardar la tarjeta, simplemente devolvemos respuesta, estado de
punto, 201 y 200 porque aquí podríamos crear una nueva tarjeta o simplemente
agregar los productos. Además, punto Json
objeto con mensaje, producto agregado a la
tarjeta con éxito. Y después de eso, simplemente devolvemos carrito completo
en la respuesta. Si no necesitas enviar, entonces puedes eliminar
esto también. Ahora probemos esta implementación de
API porque las pruebas son
realmente importantes. Ver los cambios, y
volvamos al cartero. Aquí en nuestro proyecto, creamos una nueva
colección llamada CAT. Y en la colección CAT, creamos una nueva solicitud
llamada productos ED a CAT. Primero, cambiamos el método
para publicar APIURL al host local, Columna 3,000 API slash CART SLS y aquí
tenemos que pasar el ID del producto, que queremos agregar en Por ahora, solo paso uno
y envío la solicitud. Ver, aquí obtenemos token de
autorización es obligatorio porque en nuestra API, agregamos orth middleware Vamos a generar token fresco, enviar la solicitud de inicio de sesión, y aquí obtenemos el
token. Copia esto. Ahora en la API de la tarjeta, vamos a encabezados y agregamos aquí
autorización en el valor, agregamos espacio de cerveza y pegamos nuestro token sin
ningún código doble. Ahora envía la solicitud. Ver, aquí obtenemos error
interno del servidor. Y si comprobamos nuestro terminal de código
VS, aquí no podemos
desestructurar propiedad, cantidad de solicitud cuerpo punto Esto sucede porque no
pasamos cantidad en el cuerpo del punto de
solicitud. Así que dirígete a
Mongoi B Compass. En la colección de productos, simplemente copia este ID de iPhone 14 nuevo a Cartero aquí en
el lugar de este, pegamos el ID del objeto Y en el cuerpo, déjame
quitar estas dos propiedades. Ahora vemos crudo y simplemente pasamos tu objeto
con una propiedad, que es cantidad a dos. Y enviemos esta solicitud. Ver, aquí obtenemos producto
agregado a la tarjeta con éxito. Y aquí podemos ver tarjeta
también. Permítanme aumentar esto. Ver, aquí conseguimos usuario, productos
totales a dos porque
pasamos cantidad a dos, precio
total de la tarjeta a 2598,
lo cual también es correcto También obtenemos aquí
matriz de productos con todos los objetos de producto. Aquí podemos ver que
obtenemos la cantidad actual, título, el precio y la imagen también. Ahora probemos algo más. Cambiemos la cantidad a uno y simplemente almacenemos
el mismo producto. Ver, aquí conseguimos producto
muerto con éxito, productos
totales y
precio total del carrito, ambos también son correctos. Pero si revisamos nuestra matriz de
productos, vea, aquí obtenemos otro objeto de
producto, incluso ese mismo producto
ya está disponible en
la matriz de productos. En nuestra API, tenemos un problema. Como podemos ver aquí, colocamos directamente el producto
en la matriz de productos. ¿Y si este producto
ya está disponible en
la matriz de productos? En ese caso, solo tenemos que aumentar la cantidad
de su producto. Entonces aquí, antes de que
los productos de tarjeta dot push, tenemos que verificar los
productos que estamos agregando ya están disponibles
en la matriz de productos o no. Es realmente simple. Entonces para encontrar el producto, agregamos productos CRT dot,
dot Find index Aquí, obtenemos un solo objeto de
producto, función de
flecha, y aquí
pasamos la condición,
producto, ID de producto punto, punto dos cadena es igual a ID de
producto punto toString Ahora como sabemos, este método de
índice fino devolverá el valor de índice de ese producto que
pasó esta condición. Así que almacenamos eso en la variable llamada índice de producto existente. Y si el producto no se encuentra
en la matriz de productos, entonces devuelve
menos uno como índice. Entonces podemos usar eso
en si condición. Así que el índice de producto existente no
es igual a menos uno, lo que significa que el producto ya está disponible en la matriz de productos. En ese caso, solo
aumentaremos la cantidad
de ese producto, y ¿cómo podemos encontrar
ese objeto de producto? Correcto, al usar este índice de productos
existente, así que los productos
de punto de carrito entre corchetes, agregamos el índice de productos existente. Por esto, obtenemos la cantidad de punto del
objeto del producto. Más es igual a la
cantidad actual. Eso es. Y si el producto no se encuentra
en la matriz de productos, solo entonces empujamos todo el objeto de
producto en la matriz. Entonces nos adherimos y movemos este método
push en el blog s, y eso es todo. Ver los cambios. Y ahora, antes de la prueba final, eliminemos la tarjeta completa
de la base y creemos una tarjeta nueva. Volver a Cartero,
enviar la solicitud. Bonito, conseguimos un producto. Ahora cambiemos la cantidad a dos y simplemente enviemos la solicitud. Ver, ahora nuestra cantidad
solo obtiene aumento, y además los productos totales y el precio
total de la tarjeta es correcto. Ahora hay un pequeño tema
en esta implementación. El producto podría tener
suficiente stock o no. Tenemos que verificarlo antes de
agregar producto a GAT. Entonces aquí, después de que
conseguimos producto, pasamos condición como esta. I producto, punto stock
menor que cantidad, luego simplemente devolvemos el estado del punto de
respuesta, objeto Json de
400 puntos
con propiedad de mensaje. El stock no es suficiente. Ahora aquí hay un caso más. Supongamos que nuestro
stock de producto es cuatro y queremos agregar el producto en el carrito con la cantidad tres. Esto pasará
esto si condición. Ahora bien, y si este producto, que es solo cuatro en stock, ya
agregamos dos
cantidad de producto anteriormente y ahora queremos agregar
tres cantidades más para el mismo producto. En ese caso, tenemos que evitar que nuestra cantidad de producto
aumente. Entonces dime donde
escribimos nuestra condición. Escribir, en la condición de
índice existente. Yo carro productos punto en
corchete, productos existentes, índice de cantidad de punto más
cantidad que queremos
agregar es mayor o igual
a producto punto stock. Si es cierto, entonces
devolvemos la misma respuesta con el código de estado 400
y en el método Jasen, objeto con propiedad de mensaje, stock no es suficiente Y finalmente, hemos completado
nuestra API cabeza a carrito. Así que recapitulemos rápidamente esta API. En primer lugar,
comprobamos si el ID
del producto es la cantidad se pasa
por front end o no, cual podemos decirlo
como validar entradas. Después de eso, verifique que el producto esté disponible en nuestra
base de datos o no. Si no está disponible, entonces devolvemos error en la
respuesta, producto no encontrado. Después de eso, verifique que el producto
tenga stock o no. Si no tiene stock o menos
stock que nuestra cantidad, entonces devolvemos
respuesta con mensaje, stock no es suficiente. Después de eso, verifique que
el usuario tenga tarjeta o no. Si no tiene carrito, solo entonces
crearemos nuevo carrito. Después de eso, verificamos el
producto que
queremos agregar ya está disponible
en el carrito o no. Si está disponible, entonces nuevamente verificamos
el stock inal. Si también está disponible, entonces solo aumentamos
la cantidad. Además, si el producto no
está disponible, sólo entonces ponemos el
objeto del producto con los detalles del producto. Y finalmente, contamos
el total de productos y precio
total del carrito utilizando método
reducido y guardamos
el carrito simple como eso. Así es como creamos API
head to cart.
143. Cómo llegar al carrito del usuario: Ahora es tiempo de ejercicio. Quiero que crees
una nueva API para obtener los datos actuales de la tarjeta
del usuario de inicio de sesión.
Es realmente simple. Sé que puedes hacer esto. Ahora, veamos la solución. Así router punto gt y
punto hacia adelante slash. Después de eso, agregamos función de devolución de llamada
asíncrona
con solicitud y respuesta Ahora en la función de devolución de llamada, tarjeta
const es igual a
esperar tarjeta punto encontrar uno Aquí pasamos Object con usuario para solicitar punto usuario
punto subrayado ID, y al final, simplemente
respuesta dot json, esta tarjeta Además, para conseguir al
usuario en la respuesta, tenemos que agregar middleware Orth Y eso es todo. Vamos a
probar esta API, abrir cartero en la tarjeta, crear una nueva solicitud llamada
Obtener la tarjeta de usuario URL a SDP, Columna
doble diagonal hacia adelante, Host
local, Columna 3,000
slash API slash CAT slash Y ahora aquí
tenemos que pasar token. Así que ve a encabezados y aquí
agregamos autorización. En el valor,
pasamos espacio portador. Ahora ve a la
API de inicio de sesión, envía la solicitud, consigue aquí el nuevo token, copia esto y simplemente en nuestra API, pegamos este token. Ahora vamos a enviar la solicitud. Ver, aquí obtenemos los
datos de la tarjeta. Suena sencillo. Además, es posible que
el usuario actual no tenga la tarjeta porque nunca
tuvo ningún producto en la tarjeta. Si ese es el caso, entonces tenemos que devolver
diferente respuesta. Escribimos si la tarjeta no
está disponible, luego devolvemos el estado del
punto de respuesta 404 no
se encontraron el
objeto dot Json con la propiedad del mensaje, tarjeta de
usuario está vacía. Al final, si
encontramos la tarjeta, entonces enviamos esa tarjeta tal como está.
144. Aumenta la cantidad de productos: Ahora, como sabemos,
en la página de la tarjeta, podríamos necesitar aumentar y disminuir la
cantidad del producto en uno. Así que definamos API
para esta característica. Entonces Router dot, qué
método usaremos. Entonces, como sabemos, en los datos de nuestra tarjeta, solo
necesitamos actualizar una pequeña parte de
los datos que son la cantidad, productos
totales y el precio
total de la tarjeta. Entonces para actualizar pocos datos, qué método usaremos, correcto, usaremos el
método patch 0.2 aumentar y aquí necesitamos el producto que el usuario quiere aumentar
la cantidad en el carrito. También agregaremos aquí ID de producto como parámetro de ruta,
igual que antes. Además, necesitamos artículos
ortomidales porque solo el usuario de inicio de sesión puede aumentar
la cantidad en la tarjeta Después de eso, agregamos la función de devolución de llamada
ACN
con la función de flecha de solicitud y
respuesta En primer lugar, obtenemos
el ID del producto de la solicitud punto
PRMs, ID del producto Ahora, vamos a llegar a la
parte lógica de la consulta. Muchos alumnos me preguntan, ¿cómo puedo entender la lógica de la
consulta o alguna característica? Déjame darte mi truco. Siempre que se quiera
aplicar alguna lógica, entonces antes que nada, describa esa lógica en un lenguaje
humano sencillo. Por ejemplo, aquí
queremos encontrar la lógica de aumentar la cantidad en uno
para este ID de producto dado. Simplemente significa que primero
necesitamos encontrar la tarjeta de usuario actual
porque queremos actualizar. Después de eso, encontraremos ese producto en la matriz
de productos de tarjeta. Y luego después de que
encontremos el producto, simplemente
aumentamos el campo de
cantidad del producto. También podemos incrementar los productos
totales uno y aumentar el
precio total de la tarjeta por el precio actual del producto. Por fin, simplemente guardamos
esa tarjeta actualizada. Vea lo sencillo que
se vuelve esto después de escribir
los pasos lógicos. Primero, encontramos la tarjeta de usuario
actual. Const cart es igual a un
peso carrito punto Fino uno. En el objeto de comparación, agregamos usuario para solicitar punto
usuario punto subrayado ID Ahora es posible que
no encontremos la tarjeta, así que es mejor devolver
respuesta con error. I carrito no está disponible, entonces devolvemos respuesta
punto estado 404 punto JSON, Objeto con
tarjeta de mensaje no encontrado. Bueno. Ahora
pasemos al siguiente paso, que es encontrar el producto
en la matriz de productos CAT. Ya lo hicimos en
la API cabeza a carrito. Recuerda, sí, aquí
usamos el método de índice fino. Escribimos
productos de punto CAT punto índice fino. Aquí obtenemos un solo
objeto de producto, función de flecha, y aquí devolvemos
el estado, product dot product ID. Este es un ID de objeto, por lo que tenemos que convertirlo en cadena es igual al ID del producto, que obtenemos
del parámetro de consulta. Esta expresión devolverá el índice del producto
que queremos actualizar. Así que almacenamos eso en la
variable llamada index. Ahora obtenemos el índice. A continuación, necesitamos incrementar la cantidad de
ese producto índice. Así carrito de productos
punto entre corchetes, pasamos índice punto cantidad
plus es igual a uno. Esto significa aumentar uno
en la cantidad actual. Después de eso, también
aumentaremos el carrito dot total de productos, plus es igual a uno, y también card dot
total card price, plus is equal to cart dot products in square
bracket, index dot Price. Y al final, vamos a
esperar tarjeta punto CV. Y por último, respuesta punto Json pasar Objeto con propiedad de
mensaje, producto, cantidad
incrementada con éxito. Además, enviamos la tarjeta solo
para pruebas, y eso es todo. Vea lo simple y
limpia que se ve nuestra API. Ahora probemos esta API, veamos los cambios,
y abramos post Van. Aquí creamos un duplicado
de este método de postal y rem su nombre para aumentar la cantidad de
producto en uno. Ahora podemos agregarHecrt aumentar, reducir el ID del producto, que
desea actualizar Además, aquí tenemos autorización de
encabezado, y también cambiamos
el método para parchear. Ahora simplemente
enviemos la solicitud. Ver, aquí obtengo
token no válido porque mi
token se ha caducado. Así que ve a iniciar sesión API, generar un nuevo token. Bueno. Copia este token. Simplemente en el aumento API, paga el token en el encabezado. Ahora vamos a enviar esta solicitud. Mira, aquí recibimos mensaje de
éxito, y anteriormente tenemos
tres iPhones en nuestra tarjeta, y ahora tenemos cuatro,
así que está funcionando Además, los productos totales y precio
total de la tarjeta también están funcionando. Déjame
hacerte una pregunta. ¿Qué pasa si pasamos el ID de productos, que no está disponible en la matriz de productos? Nosotros
no manejamos eso. Entonces aquí, después de
obtener el índice, pasamos la condición I índice
es igual a menos uno, lo que significa que no podemos encontrar el
índice en los productos de la tarjeta. Entonces devolvemos respuesta punto
status 404 punto Json Object con mensaje producto
no encontrado en Tarjeta. Vamos a probar esto. Entonces en el
lugar de este ID de producto, solo
pasamos uno y
enviamos la solicitud. Ver, aquí obtenemos producto
no encontrado en el carrito. Genial. Ahora, qué cosa puede salir mal en la API.
Vamos a pensarlo. Cuando aumentamos la cantidad
del producto, idealmente, ese producto
debería estar en stock. Por ejemplo, si el iPhone 14 solo
tiene seis en stock, y ya tenemos seis
iPhones en el carrito e
intentamos aumentar uno más iPhone
14 idealmente, podemos hacerlo No podemos aumentar la cantidad de
iPhone a siete porque solo tenemos
seis iPhones en stock También podemos poner
una condición más antes de actualizar
los datos de la tarjeta. Si productos de punto de tarjeta
en paquete cuadrado, índice de cantidad de punto, igual
a producto, stock de puntos. Después devolvemos
respuesta punto estado, 400 punto JCN Object con mensaje, producto, agotado
Gant aumentar producto Ahora la pregunta es, ¿cómo podemos obtener este producto en stock punto? Bien, necesitamos encontrar un producto de la colección de
productos. En la parte superior, después de
este ID de producto, podemos const producto es igual a en el punto del producto Fine By ID, y aquí pasamos el ID del producto Ahora bien, esto podría suceder este ID de
producto no es válido, por lo que podemos poner aquí
también condición. Ya lo hicimos
en el post API. Ver aquí. Entonces copiemos esta condición y
péguela en nuestra API de aumento. A en el comando antes
del método find, verifique si el producto existe. Ahora, probemos
esta implementación. Entonces ve a Cartero,
envía la solicitud. Ver, ahora obtenemos error
interno del servidor. Ahora seleccione el punto final
y presione Control más D o Comando más D. Obteniendo
el ID del producto original. Enviar la solicitud, C, aumento de
cantidad en uno. Nuevamente, envíe la solicitud. C, obtenemos seis iPhone, nuestro stock es ocho, por lo que enviamos la solicitud
dos veces más. Mira, ahora tenemos ocho iPhones y enviemos
la solicitud una vez más Ver, aquí obtenemos error, producto agotado, no
podemos aumentar producto en uno. Ahora nuestra API está funcionando bien.
145. Disminuye la cantidad de producto: Ahora definamos rápidamente una API o disminuyamos
la cantidad de producto. También será lo mismo. Vamos a copiar esta API incrementada
y pegarla en la parte inferior. Ahora, antes que nada,
agregamos aquí comentario superior, disminuir la cantidad del producto. Además, aquí cambiamos el
punto final para disminuir el ID del producto. Ahora vamos a revisar esta
API paso a paso, así nos aseguramos de
no olvidar nada. Primero, obtenemos el producto
que también necesitamos. Después de eso, encontramos
el carrito bueno. Después de eso, encontramos el índice, bueno ahora aquí hay una cosa para disminuir la cantidad
del producto a uno, no
necesitamos
verificar el stock. Pero también, tenemos que
revisar una cosa más. Si actualmente en nuestra tarjeta, solo
tenemos una cantidad de
producto e intentamos disminuir esa cantidad de
producto a uno. En ese caso, tenemos que eliminar el objeto de producto
completo
de la matriz de productos. No te preocupes, escribiremos lógica para esto después de
completar la actualización. Solo recuerda, estoy
agregando aquí comentario, consulta condición
para la cantidad uno. Después de eso, tenemos que disminuir la cantidad del producto a
menos es igual a uno. También para el total de productos, menos es igual a uno,
y aquí también, precio total del carrito
menos es igual a, aquí menos el
precio del total. Después guardamos una
tarjeta y cambiamos este mensaje a disminución de la
cantidad del producto con éxito. Ahora tenemos que hacer poco
cambio en esta API. Pasemos a nuestro comentario. Aquí agregamos I condición, carrito punto productos,
corchete, índice la cantidad es
mayor que el bollo entonces disminuimos
la cantidad en uno. Movemos esta línea en el bloque
I y después de eso, lo contrario, tenemos que eliminar objeto de producto
completo que
está disponible en este índice. Para eliminar el elemento de
la matriz en JavaScript, utilizamos el método Plis Así tarjeta punto productos punto índice Slic que es
índice que queremos eliminar Y luego en el segundo argumento, pasamos uno, lo que significa que solo
queremos eliminar un elemento. Mediante esta expresión, ese objeto de producto
completo se eliminará de
la matriz de productos. Ahora aquí hay una cosa. Después de eliminar todo el
objeto del producto de la matriz de productos, no
podemos tabla para menos este precio total de la tarjeta porque aquí necesitamos
el precio del producto. Entonces tenemos que hacer
algo así. precio total de la tarjeta menos es igual al precio
del punto del producto. Este precio del producto lo
obtendremos de la colección
de productos. Entonces en la API incrementada, cambiamos esta tarjeta
punto precio total de la tarjeta plus es igual al precio
del punto del producto. Por lo que el precio original del producto
se sumará en el total. Guarda los cambios,
vamos a esta API. Duplicar esta API de producto
incrementada y cambiar su nombre para disminuir A cambiar el punto final de la API a disminuir la tarjeta
y enviar la solicitud. Ver, ahora
solo tenemos siete iPhones. Vamos a disminuirlo
dos veces más. Ver, ahora tenemos
cinco iPhones y total de productos y
precio también está funcionando Así es como disminuimos la
cantidad del producto.
146. Eliminar un producto individual del carrito: Ahora en nuestra página de tarjeta, podríamos tener la opción de
eliminar el
producto completo de la tarjeta. No queremos disminuir la cantidad
de producto uno por uno. Así que definamos API para eliminar el
producto de la tarjeta. Entonces comenzamos con la página de punto
del enrutador, punto final para cortar eliminar barra
diagonal ID del producto de la columna Además, necesitamos los datos actuales
del usuario, por lo que agregamos middleware Orth y luego una función de devolución de llamada
con solicitud Ahora hay
pasos muy similares a nuestra API de disminución. Veamos la API, qué necesitamos en el producto
remove. Ver primero, necesitamos obtener
un producto, luego carrito. Entonces también, necesitamos encontrar
el índice del producto, y también necesitamos esta condición. Copia este código hasta aquí y
pégalo en la API remove. Ahora volvemos a disminuir API, y como podemos ver para
eliminar todo el producto, solo
necesitamos esta línea. Copiamos esto y lo
pegamos en nuestra API. Bueno. Ahora después de eso, tenemos que actualizar cart
dot total products y cart dot total cart price. Vamos uno por uno. Carrito punto total productos
menos es igual a, aquí necesitamos la cantidad de ese producto que tenemos
en el objeto producto. Supongamos que tenemos
siete productos totales y tenemos cuatro iPhones
en la matriz de productos Ahora bien, si tratamos de eliminar los datos completos del
teléfono del carrito, entonces para el total de productos, tenemos que menos siete menos
cuatro es igual a tres. Así que tenemos que encontrar
la cantidad que está disponible en la matriz
de productos. Entonces antes de este método de empalme, podemos hacer algo como esto. El total del carrito de productos, menos es
igual al carrito de productos punto. Aquí, accedemos a ese objeto de producto
que queremos eliminar, corchete, índice, y luego agarramos la cantidad
de ese producto. Lo adivinaste correctamente. Podemos hacer lo mismo para
el punto CAT precio total
CAT menos es igual a productos de punto de tarjeta, corchete
cuadrado, cantidad de
punto índice en carrito punto productos en
corchete cuadrado, punto índice PCE La razón por la que eliminamos
todo
el objeto producto al final porque si
eliminamos ese objeto antes, ¿cómo podemos acceder a la cantidad
y precio del producto? Ahora, por fin, simplemente esperamos
tarjeta punto C y después de eso, respuesta punto Json objeto con propiedad de
mensaje a producto
eliminado con éxito, y también enviar la tarjeta con él. Ahora antes de probar esta API, podemos agregar una
condición más en esta API. Así que imagina que
solo tenemos un producto en el carrito y también retiramos
ese producto. Ahora, en lugar de almacenar la tarjeta en
blanco en la base de datos, es mejor quitar
esa tarjeta para ese usuario. usuario quiere agregar nuevo
artículo en el carrito, luego en la API head to cart, ya
ponemos código para
crear el nuevo carrito. Podemos verificar si
ese producto es el único producto o
no en el carrito. Aquí, después de esta condición de
índice, podemos agregar una condición
más if. Aquí comprobamos si los productos del punto del
carrito la
longitud del punto es igual a uno, y los productos de punto CAT
en corchete cuadrado, índice, ID del producto es
igual al ID del producto, que obtenemos de las permanente. Si esta condición es cierta, entonces podemos eliminar el CAT completo. Así que espera CAT dot Fine By ID y DLT y passe GAT
dot guión bajo Después volvemos, respuesta, asegúrate de agregar aquí devolución. De lo contrario, también se ejecutará el
código inferior. Así que asegúrate de
agregar aquí devolución. Respuesta punto Json objeto con propiedad de
mensaje, carrito
eliminado con éxito. Además, tienes que convertir esta tarjeta
ID de producto, punto a cadena De lo contrario, nuestra condición
no va a funcionar, y eso es todo. Degustemos nuestra implementación, veamos los cambios,
y abramos cartero Duplica esta API de disminución, cambia su nombre para eliminar el
producto del carrito. Bueno. Ahora vamos a enviar
el punto final de la API para cortar el carrito eliminar el ID del producto, y enviar la solicitud Y debido a que solo tenemos
un producto en nuestro carrito, obtenemos el carrito eliminado
con éxito. Entonces como puedes ver, definir
la API no es tan difícil. Simplemente da pasos uno por uno, y si te confundes, entonces escribe comentarios para cada paso que despejen
muchas de tus dudas.
147. Crear modelo de pedidos: Ahora antes de agregar
la pasarela de pago, vamos a crear una nueva
colección de pedidos para almacenar la información sobre todos los
pedidos y con su estado. Entonces en la carpeta models, creamos un nuevo archivo
llamado orders dot js. Bueno. Ahora, antes que nada, importamos mangos const es
igual a requerir de Después de eso, el esquema de orden de costo es igual al esquema de punto nu
Mongoose Y aquí definimos nuestro esquema
de cobranza. Esto ya lo sabemos, ¿verdad? Creamos esquema muchas veces. Ahora en la colección de pedidos, necesitamos todas las cosas que
agregamos en la colección de tarjetas. Entonces copiamos el
esquema completo del carrito. En el esquema de orden, pegamos nuestro esquema. Tenemos usuario que ordena productos, productos
totales, y
también precio total de la tarjeta. Ahora podría preguntarse ¿por qué
necesitamos estos datos de todos los productos? Necesitamos estos datos de productos para almacenar el historial
del pedido del usuario. Si el usuario quiere ver qué productos
pidió anteriormente, tenemos que mostrarles
esta lista de productos. Entonces tarjeta y orden son
dos cosas separadas. En la colección de tarjetas, almacenamos todos los productos que el usuario
quiera adquirir. Los productos de la tarjeta pueden
agregarse, actualizarse o eliminarse. Pero una vez que el usuario
realiza el pago y realiza el pago, los datos de la tarjeta se
convierten en un pedido, y eliminamos esos datos
de la tarjeta de la colección de tarjetas. En la recolección de pedidos, almacenamos datos permanentes para transacciones
completadas. Y por eso, los usuarios pueden ver
sus pedidos anteriores. Ahora en esta colección, tenemos que añadir algunos rellenos más. Primero, hacemos este precio total
de la tarjeta al precio total. A continuación, necesitamos ID de pago, tipo cadena y
requerido a true. Esta es la identificación del pago. Obtendremos esta identificación de
la pasarela de pago. Y por esta identificación, podemos ver qué método de pago utiliza el
usuario para el pago, UPI o tarjeta o banca neta
o algo más A continuación, estado de pago a objeto, tipo a cadena requerida para true. Y en este estado, podemos mencionar pago pagado o llenado. A continuación, lo que queremos
es dirección de envío, tipo a cadena, y
requerido a true. medida que nos movemos esto por debajo del precio total por
conveniencia. No importa. Ahora, después de eso, queremos estado de
orden, escriba a cadena, y aquí podemos agregar posibles
valores para este campo, que es enum a array El primer valor puede estar pendiente. A continuación, podemos tramitar a continuación, CB También se puede entregar o se puede
cancelar por defecto, haremos nuestro
estado de pedido a pendiente. Aquí no es estado de pago, es estado de pedido. Ahora a continuación, podemos almacenar la fecha en la que el usuario
realiza este pedido, creado en el tipo de objeto a la fecha y el
valor predeterminado a la fecha punto ahora. Como queremos fecha en la que se entrega
este pedido, entregado en tipo de
objeto a la fecha. Por ahora, estos
campos son suficientes. Si en el futuro
necesitamos más campos, entonces como sabemos, podemos agregar
fácilmente rellenos en
esta colección. Ahora vamos a crear colección. Por lo tanto, el orden de costo es igual
al modelo de punto Mangosta. Aquí, pasamos nombre singular, que es orden, y aquí
pasamos esquema de orden. Después de eso, por fin,
vamos a módulo de exportaciones de punto es igual a la colección de pedidos,
y eso es todo.
148. Flujo de trabajo de pagos: Anteriormente, hemos terminado agregar y actualizar
las funciones de la tarjeta. Ahora, cuando nuestro usuario quiere comprar las cosas
disponibles en la tarjeta, necesitamos integrar el
pago en nuestra aplicación. Entonces, antes de
sumergirse en el código, directamente, primero
entendamos el flujo de trabajo
completo del pago. Así que imagina que este es nuestro usuario, ve productos agregados a la tarjeta, y desde la página de la tarjeta, haz clic en el botón de pago
o pago. paso número uno es, llamaremos a nuestra API de checkout en
esta pulsación de botón, como sabemos, tenemos los
datos de nuestra tarjeta en nuestra base de datos, por lo que obtenemos el monto total
del precio de su tarjeta. También, podemos pasar en qué
moneda quiere pagar. Ahora en el paso
dos, los detalles, precio y moneda,
enviaremos a Pasarela de Pago. Ahora paso número tres,
Payment Gateway creará un formulario de pago y
lo mostrará en su navegador o teléfono. Paso número cuatro, vea
ingrese sus datos de pago como tarjeta o UPI o
billetera vea quiera usar, vea ingrese esos datos en el formulario de pago
y haga clic en pagar Recuerda, los datos de pago del usuario
van a la pasarela de pago, no al back end, y por
eso es seguro. Ahora paso, pasarela de pago, enviar los
datos de pago al banco, banco validar los datos de pago. Si es cierto, el banco
devolverá el éxito, y si es falso
o nuestro usuario
no tiene saldo suficiente
o algo sale mal, banco devolverá fallará. Por lo que el banco enviará este estado de éxito o fracaso a
Payment Gateway. Ahora paso número seis, pasarela de
pago, enviar el
estado de éxito o fracaso a nuestro back end. Si es un éxito, entonces
realizaremos alguna tarea
en el back end que queremos
realizar como agregar datos de
la tarjeta a la recolección de
pedidos, establecer el estado de pago a pagado
o cualquier cosa que queramos hacer. Ahora después de completar
el proceso de todo en el paso siete,
desde el back end, mostramos que el pago del usuario es exitoso o el pago se
falla, así de simple como eso. Entonces, la pasarela de pago es como un intermediario que se
encarga de los pagos seguros, de pago y transferencia
directa de
dinero a nuestra cuenta Ahora hay muchas pasarelas de
pago disponibles como raya,
papel, pago de maquinilla de afeitar
y mucho más Pero estos tres son de arriba. Ahora bien, ¿cómo podemos decidir
qué pasarela de pago
queremos utilizar? Entonces, si estamos apuntando a
la audiencia global, entonces stripe es una buena opción porque permite pagos
internacionales, y también permite UPI Ahora, la gente también permite el pago
internacional, y la gente también es una buena opción. Ahora bien, si nuestro negocio
se basa en la India, entonces sorpay es lo mejor para nosotros. Resorpay también puede manejar pagos
internacionales, pero solo es adecuado para negocios con sede en India transacción
extranjera En palabras simples,
en palabras simples, negocios están registrados en la India y también quieren
obtener transacción extranjera. Para las empresas
internacionales a nivel mundial, las pasarelas como rayas o papel podrían ser una
mejor opción Entonces en este curso, les
mostraré tanto reser p para negocios
indios, y si su negocio
está fuera de la India, entonces también
le mostraré la integración en papel El motivo por el que no puedo mostrarte la raya porque para Demos, stripe no permite cuenta en algunos
países, pero no importa qué pasarela de
pago te muestre. Si entiendes la
lógica de la pasarela de pago, entonces puedes aplicar cualquier pasarela de
pago por tu cuenta. Y ese es mi enfoque principal. Entonces solo mira estas lecciones. Voy a aclarar la lógica
detrás de la pasarela de pago.
149. Implementar la pasarela de pago Razorpay: Vamos a configurar resupe para nuestra aplicación de nodo
Cardwig. Crearemos y probaremos pagos así.
Será divertido. Además, si estás
fuera de la India, entonces puedes saltarte esta lección porque solo puedes registrarte en resupe si estás en la India o tu negocio
registrado en India Después de esta lección,
aplicaremos el pago
en papel en el que cualquier
usuario del país puede crear una cuenta. Ahora veamos más o menos cómo funcionará
este pago. Entonces, cuando el usuario hace
clic en el botón PayNW, el front-end llamará a una
API. Vamos a echarle un vistazo. En esa API,
crearemos orden para AserPay dando alguna
información sobre nuestro Como la cantidad que
queremos cobrar
del usuario y en qué moneda
queremos recibir el pago. Ahora cuando RSR PE obtiene
esta información, genera orden, que es el objeto de información
con ID de objeto único Y luego tenemos que pasar este ID de
objeto al front-end. Ese es el trabajo de la primera API. Ahora cuando front end
obtiene el ID del objeto, front-end abrirá la ventana de pago
sor P. Pase el ID del objeto
y algunos detalles. Ahora podrías preguntar por qué
necesitamos pasar el ID del objeto. Por este objeto ID solo reser PA obtiene la información
sobre el pago También nos ayudará en la verificación de pagos
y muchos más beneficios. Ahora el usuario ingresará los datos de pago
y dará clic en pagar ahora. Si ese es un pago exitoso, entonces reer Pay genera una identificación de pago con firma
única, y luego
llamaremos a nuestra segunda API, que verificará nuestro pago En la segunda API,
verificaremos el pago. Razón por la que necesitamos verificarlo porque esa API está llamando
desde el front-end. Cualquiera puede manipular fácilmente esa información y hacer que
el pago sea exitoso. Por lo que verificaremos
el pago de una manera muy segura, que también
implementaremos en esta lección. Solo después del
proceso de verificación, si es exitoso, entonces crearemos un nuevo pedido
en nuestra colección de pedidos, y luego eliminaremos esa tarjeta de usuario. Piense en sor pagar es como
un mostrador de boletos de cine. Para API uno, vas al
mostrador, que es pago de navaja, les
dices qué
película quieres ver diciéndoles
cantidad y moneda,
y luego te dan boleto, que es un ID de pedido único. Ahora, para API dos, después de
mostrar el boleto a seguridad, ves la película, El
contador verifica que el boleto se usó correctamente
y actualiza los registros Entonces, para el pago de la maquinilla de afeitar en el backend, necesitamos crear dos APIs Primero, para crear orden de pago de
maquinilla de afeitar, y la segunda API es para verificar
el pago de razor pay. Si
verificamos con éxito el pago, después de eso, en el último paso, crearemos un nuevo pedido en el cobro del pedido
y retiraremos nuestra tarjeta. Ahora comencemos con la
creación de la primera API, que es para crear
ser pay order. En la carpeta de ruta,
creará un nuevo archivo llamado orders dot gs. Ahora para
agregar rápidamente el router, abrimos la tarjeta Route file, movemos esta
línea del router en la parte superior, y copiamos estas dos primeras líneas. En nuestros pedidos dot
archivo JS, lo pegamos aquí. Ahora en la parte inferior, tenemos que hacer puertos de punto
del módulo es
igual a Router. Ahora vamos a este router
en el archivo JS punto índice. Entonces en la cima, const,
orden, Rowe es igual a exigir Aquí vamos a la
carpeta de rutas y pedidos. Y en la parte inferior,
después de las rutas de la tarjeta, agregamos app.us slash
API slash Ordenar
y pasar aquí Ordenar y pasar aquí Bueno. Ahora podemos enfocarnos
en construir APIs. Así router punto post, punto a barra de pago Además, necesitamos moth middleware porque queremos que solo los usuarios puedan iniciar
sesión, y por fin acing
callback función con solicitud Aquí en esta API, queremos crear ser pay order. Y para eso, necesitamos
ser pay instancia. Entonces en la terminal,
instalamos reser pay package, NPM install ser pay a la tasa, 2.9 0.5, que es la última versión mientras estoy grabando estas puntuaciones Bueno. Ahora en la parte superior, ingresamos costo ser P es igual a requerir ser P. ¿Me
puedes decir por qué doy
esta letra mayúscula? Correcto porque es clase. Ahora en nuestra API, creamos Cast
reserp Instance is equal to New reserp inside this, necesitamos pasar objeto
con dos propiedades ID de subrayado clave. Esta es la identificación clave de
nuestra aplicación de pago de reser. En nuestra aplicación,
almacenaremos esa clave en el archivo punto ENV porque
necesitamos mantenerla privada Así proceso punto nv punto reser py subrayado clave subrayado No te preocupes, los
definiremos en algún tiempo. Después de clave ID, necesitamos
clave subrayado secreto para procesar punto nv punto ser pay,
underscore, key,
underscore Ahora, vamos a establecer estas dos
variables en el archivo punto ENV. Sor pay, underscore, key, underscore ID es igual
a dejarlo Y siguiente ReserPunerScore,
clave, subrayado secreto. Los agregaremos cuando
creamos la cuenta resorpay. Por ahora, completemos nuestra API de
pago y después de eso, crearemos una cuenta de pago de
reser Después de crear la instancia, podemos crear orden. Orden de costo es igual a esperar reserpy instancia
órdenes punto punto Crear aquí tenemos que pasar opciones
objeto para este pedido El primero es la cantidad. Digamos que pasaremos aquí 500. Después de eso, tenemos que
pasar la propiedad de moneda. Esto especificará en qué moneda queremos proceder
al pago. Supongamos que queremos hacer el
pago en la rupia india, entonces pasamos aquí INR, y si queremos hacer el
pago en el dólar estadounidense, entonces pasamos aquí USD. Pero asegúrese de que si usa la moneda de
otro país, entonces el pago
interno de sus cuentas de pago de reserva debería estar activo. Por ahora, simplemente pasamos INR. Y por último, tenemos que
pasar Recibo único. Esto es como una
etiqueta con el nombre para el pedido. No afecta el pago, sino que ayuda a desarrolladores o empresas a reconocer
qué orden es cuál. Por ejemplo, si
tenemos varios pedidos, podemos usar este ID de
recibo para encontrar un pedido específico en el
panel de RSR Pi o en nuestra base Por lo que pasamos aquí los backticks recibieron subrayado
dólar Calibackets, fecha punto ahora para generar recibos
únicos Esto generará orden para nosotros. Aquí simplemente devolvemos respuesta punto Json aquí pasamos objeto con
pocas propiedades. Primero, el éxito a la verdad, lo que significa que creamos el orden
con éxito. Segundo, ID de pedido
para ordenar ID de punto. Siguiente cantidad a la cantidad del
punto del pedido y moneda
a la moneda del punto del pedido. Eso es todo para la primera API. Esta no es la API final, la
mejoraremos más adelante. Ahora antes de ir
a probar esta API, también
vamos a crear una segunda API para que no
te confundas
cuando hacemos pruebas. Sé que tienes muchas preguntas, pero no te preocupes al
final de esta lección, todo quedará claro. Después de esta API, creamos una nueva API post y
punto a barra pago verificar también
necesitamos os middleware para
esta API y por fin, función
ASN con Ahora en esta API, necesitamos tres cosas
del cuerpo de la solicitud. El segundo objeto es igual
a solicitar el cuerpo del punto. El primero es ser pay, orden de
subrayado, ID de subrayado A continuación, ser pay,
underscore payment, underscore ID y last ser
pay underscore Con la ayuda de este ID de
pedido e ID de pago, tenemos que crear un
tipo de firma. Si esa firma y ser P
subrayado la firma será igual cuando consideremos que nuestro pago está verificado.
No te confundas. Es realmente simple. La firma generada por Secst es igual a aquí, tenemos que usar un módulo
nodejs incorporado que En la parte superior, importamos const crypto es igual a cripto
requerido En la parte inferior de nuestra segunda
API crypto dot crear HMAC. Este es el
método Nojs para crear tiene código de
autenticación de mensaje
base, HMAC Ahora en el primer parámetro, tenemos que escribir el algoritmo
para crear el HMAC, que es un 256 de este tipo En el segundo parámetro, tenemos que pasar resorp secret Así proceso punto Env punto
ResorpunderScore , K, subrayado Ahora, después de este método
create HMAC, agregamos otro método
llamado update Esto toma qué
datos queremos tener. Aquí pasamos de vuelta ticks, dólar en paquetes de Cali, reser p guión bajo,
orden, guión bajo ID Aquí agregamos símbolo de barra, dólar, paquetes
Cully, sor pe,
guión bajo, pago,
guión bajo ID Después de eso, agregamos otro
método punto digest y aquí pasamos X. Obtengo este código de la documentación
reser P. Puedes leer la documentación
para más detalles. Este código
generará una firma. Ahora podemos compararlo con
esta firma de subrayado reser He generado firma
no es igual a ser pagar
subrayado firma Si no son
iguales, entonces aquí, devolvemos estado de punto de respuesta, 400 puntos GSN con Object, éxito a false y
mensaje a firma de
pago inválida Y después de
eso, simplemente respons dot Json success to true y message to payment verify
successfully Entonces si desde el front-end, alguien pasa el
ID de pedido falso o el ID de pago, entonces por este proceso,
podemos verificarlo. Si no se verifica el pago, entonces devolvemos respuesta
con mensaje lleno. Y si se verifica, entonces devolvemos respuesta
con mensaje de éxito. Entonces este no es un código completo. Lo actualizaremos
después de la degustación. Ahora antes de probar esta API, necesitamos clave ID y clave
secreta de reser pay Recuerda, dejamos
variables vacías en el archivo dart NV. Vamos a crear una cuenta de ser pay y generar esta
clave ID y clave secreta. Estos son muy similares al
ID y la clave secreta que
generamos al implementar la
autenticación de Google y Facebook. Ir a la página web reserp.com. Y como puede ver aquí, solo
tenemos la opción de India, Malasia y Singapur, lo que significa que solo estas empresas con sede en el
país pueden establecer el pago de reser Pero también, podemos aceptar
pagos desde cualquier país. Entonces glicon regístrate, ingresa tu dirección de correo electrónico. Después crea contraseña. Asegúrate de seguir
estos patrones de contraseña y haz clic en Continuar. Esto enviará OTP al correo electrónico, así que rápidamente agrego la OTP
aquí y doy clic en Verificar Ahora, aquí está la cosa.
Seleccione el país, su negocio está
incorporado, que es la India. Puede continuar, y ahora tenemos que
seguir algunos pasos más. Obvio, estamos
aceptando el pago. No es una configuración simple ya que
estamos llamando a otra API de sitio web. Tenemos que proporcionar nuestros datos. Además, estas plataformas de pago pueden cambiar su
interfaz muy a menudo. Entonces si en el futuro, no
obtienes la misma
interfaz como yo, entonces no te confundas. Simplemente proporcione los
detalles que están pidiendo y cree una
cuenta en el pago de reser Después de crear una cuenta, podemos crear
ID de clave y secreto de clave. Aquí lo está pidiendo, ¿dónde le gustaría
aceptar el pago? Por ahora, seleccione en línea
y comience a embarcar. Ahora, siguiente, ¿desde dónde pagan tus
clientes? Si tus clientes son de
la India, entonces selecciona India. Pero aquí, selecciono fuera de
la India y empiezo a abordar. Tomará algún tiempo
Ahora escribimos nuestro nombre. Asegúrate de escribir
tu nombre legal. Continuar. A continuación, verifica
tus datos de contacto, escribe tu número de celular, y enviará ODP, escribirá ese ODP, y da
clic en Continuar Ahora acepta pago aquí
selecciono en mi página web. Si quieres para app o cualquier cosa, entonces también puedes
seleccionarlos y continuar. Aquí, tenemos que agregar
nuestro enlace a la página web. Además, ser pagar verificar
este sitio web. ¿Es legal o no? Entonces si tienes tu sitio web, entonces agrégalo aquí. Por ahora, no tengo, así que da clic en agregar Carta
y agrega Carta. Ahora selecciona tu tipo de negocio. Selecciono no registrado. Además, si seleccionas el tipo de negocio
no registrado, entonces no puedes aceptar pagos
internacionales
en el modo en vivo Para eso, necesitas un negocio
registrado. Actualmente, no tenemos
ningún negocio registrado, pero si tienes entonces
selecciona registrado. Además, no te preocupes por aceptar pagos
internacionales. No necesitamos hacer
algún trabajo extra. Solo necesitamos un negocio
registrado, y Reserpy
te permitirá aceptar pagos
internacionales Ahora agrega tu número
personal de Pan, que todos tenemos edita
aquí y haz clic en Continuar. Aquí, me sale error a mi nombre, así que escribo mi nombre legal, que tengo en la tarjeta
Pun y continúo Ahora sube tu tarjeta
PN personal, selecciona, carga, selecciona tu
documento y ábrelo. Tomará algún
tiempo. Y continuar. Ahora
nos están sugiriendo completar el QIC. Selecciona tu categoría de negocio, yo selecciono tu educación. Si tienes otra categoría, entonces selecciona de acuerdo a esa. A continuación, selecciona tu subcategoría,
selecciona lo que quieras. A continuación, ¿cuál es su modelo
de negocio? También, seleccione esto de acuerdo
a sus necesidades y continúe. Después de eso, tenemos
que agregar datos bancarios. Aquí, necesitamos el
número de cuenta y el código IFSE de su sucursal de cuenta Ambos te metes en tu libreta. Asegúrate de escribir el número de cuenta en el que
quieres aceptar el pago. Relleno estos datos
y doy clic en Continuar. Se verificarán estos
detalles. Y hecho. A continuación, tenemos que
seleccionar el código de propósito. Permítanme tratar de continuar directamente. Está dando error. Tenemos que seleccionar el código de propósito. Podemos buscarlo por el grupo. Pero para probar,
simplemente selecciono este p00 14 y continúo A continuación, ¿tienes un código
importador exportador? No, no he aceptado los
términos y doy clic en Continuar. Ahora es el momento de la política
empresarial. Aquí piden muchas preguntas importantes como cancelación y tiempo de reembolso. Selecciono estos a siete días, puedes seleccionar de acuerdo
a tus necesidades, tiempo de procesamiento de
reembolso
a tres a cinco días, lo cual es bueno, pero de
nueve a 15 por seguridad. También, saltarse el tiempo, de
ocho a 14 días. Ahora tenemos que proporcionar también el número de contacto de
soporte. También trato de saltarme esto, pero está dando error. Entonces escribo mi número
y también escribo mi dirección de correo electrónico y hago clic
en Crear páginas de políticas. Aquí puedes ver las páginas,
haz clic en Continuar. Aquí tenemos
enlaces de políticas. Continuar. Envíe su solicitud. Aquí, trato de completar
el proceso de video KYC, pero aquí me sale error, así que intento varias veces,
pero no pasa nada Decido saltarme esto. Cierro todas las páginas e
intento abrir serpy.com. E intenta iniciar sesión con la
cuenta que acabo de crear, pero se está cargando y cargando. Así abre
ventana de incógnito y openerp.com. Si te gusta el inicio de sesión,
ingresa el correo electrónico, continúa e ingresa
tu contraseña. Bueno. Aquí obtenemos el tablero de SRP Por ahora, estamos en
el modo sabor. Podemos cambiarlo a partir de aquí, pero no lo cambies por ahora. Ahora para obtener la ApiKey, vamos a la opción de cuenta
y configuración Y aquí, en la configuración del sitio web
y aplicación, vamos por claves API y
generamos clave
Taste, nos enviará OTP, escribimos la OTP y
simplemente damos clic en Ver, aquí obtenemos el ID de
clave y el secreto clave. Ahora, primero, volvemos a copiar el
ID de clave al código VS, y en el archivo ENV, pegamos el ID de clave
para esta variable Nuevamente, copie el secreto clave y péguelo en la variable secreta de
archivo ANV Guarde este archivo, y
desde el sitio web, simplemente
puede hacer clic en
Descargar para copia de seguridad. Ahora, probemos nuestras dos APIs. Está funcionando o no. Entonces como sabemos, necesitamos
front-end para probar estas APIs,
porque en el front end, abriremos la página de RSRPEPayment Así que aquí creé una página SDML simple llamada RSRPFront end Obtendrás esta página
debajo de esta lección, y también está disponible en la carpeta Recursos proyecto a carpeta. Descárgalo y simplemente dalo
en tu proyecto actual. Ahora, vamos a ejecutar este archivo STML. Así que haga clic derecho sobre esto
y haga clic en Copiar ruta. En nuestro navegador, el ritmo de este camino. Ver, aquí obtenemos el título
y un simple botón. Si quieres ver qué pasó cuando hacemos
clic en este botón, entonces puedes ver el
archivo STML, es realmente sencillo Déjame mostrarte también, tenemos que cambiar algunos valores. Entonces aquí en la parte inferior,
en la etiqueta script, agregué alguna variable que
puedes pasar por tus datos. Primero, tenemos order endpoint, que es el punto final
de nuestra primera API. Y segundo, tenemos punto final
de verificación. Tienes diferentes puntos finales, luego puedes reemplazarlos de
acuerdo a tu punto final A continuación, tenemos dirección de envío. Aquí puedes escribir tu dirección. Después de eso, moneda de usuario, que configuré en INR, pero también puedes
pasar USD o Euro, etcétera, si tu ser pay
tiene pago internacional on Después de eso, tenemos ID de clave SRP. Aquí, tienes que
escribir tu identificación clave. Copio mi ID de clave del archivo
ENV y lo pego aquí. Asegúrese de escribir
su propia identificación de clave. De lo contrario, esto no funcionará. A continuación, tenemos togon. Aquí, tienes que
pasar tu token JWT. Ahora, actualmente, en
nuestra aplicación, establecemos solo 2 horas de caducidad, lo cual es poco
molesto para la degustación. Porque tenemos que crear el token
JWT una y otra vez. Para que podamos eliminar el
vencimiento del inicio de sesión y simplemente agregar caducidad en la etapa
final del proyecto. Abrir rutas de usuario,
y en la parte inferior, eliminamos este objeto
con propiedad caducada. Ahora vamos a generar token
que nunca expiró. Abra Postman y abra la API de inicio de sesión y simplemente envíe la solicitud Aquí, copiamos este token
y en el archivo SDML, simplemente lo
pegamos aquí A continuación, agregué este
evento on click para este botón de pago. En esto, antes que nada, llamamos a esta API de orden usando el método
fetch y
con este token Como sabemos por la API de pedidos, obtendremos los
datos del pedido. Eso lo conseguimos aquí. Si los datos no tienen éxito, entonces mostramos alerta
con mensaje de falla. Ahora bien, ¿y si obtenemos orden de pago de
reser con éxito
desde el back-end Entonces abriremos ventana de pago de
resorb. Aquí, desde el front end, tenemos que pasar estas
opciones con reserp Ver, aquí tenemos cantidad clave, moneda, nombre, ID de pedido, y por fin, tenemos manejador Este manejador es realmente
importante, que es la función. RSR P ejecuta esta
función de manejador cuando el usuario ingresa la información correcta y el
pago gira Entonces después de un pago exitoso, llamamos a nuestra segunda API
para verificar el pago. Si esa verificación
es exitosa, entonces mostramos alerta de éxito, y si falla, entonces mostramos error de campo. Y por fin para abrir resorpe, creamos nueva instancia reserp y pasamos opciones enteras aquí Entonces simplemente usando
reserp dot Open,
abrimos la
página ReserpPayment Por fin, tenemos este
campo de punto de pago que se ejecutará cuando el usuario ingrese datos de
pago incorrectos o si no tienen saldo
suficiente, entonces esta función se
ejecutará simple como esa. Ahora simplemente probemos
nuestra implementación. Estoy muy entusiasmado con ello. Guarde este archivo y
vuelva a nuestro navegador, actualice la página y simplemente haga clic en el botón Degustar
pago. La cosa pasa, eso no es justo. Comprobemos qué pasa. Así que al inspeccionar usando F
12 aquí en la consola, podemos ver que obtenemos error, acceso a fechTo
checkout API desde origin null ha sido
bloqueado por la política del curso Este es un error muy popular
para los desarrolladores de pila completa. Sucede porque por defecto, nuestra aplicación Express no puede aceptar llamadas API
desde ningún origen. Tienes que habilitar el curso
en nuestra app Express. Así que volvamos al código VS, abre una nueva terminal y escribe, NPM instala el curso
y pulsa Enter Ahora en el archivo
JS punto índice en la parte superior, importamos costo curso es
igual a requerir curso. Entonces en la parte inferior, antes de este punto express JS
y medio donde agregamos app dot Ug aquí llamamos a esta
función de curso, y eso es todo. Guarde los cambios y asegúrese de que nuestro servidor esté funcionando. Bueno. Ahora actualiza la página y volvamos a hacer clic
en el botón de pago. Ver, la
ventana de pago RSR P está aquí. Aquí obtenemos este tipo de métodos de
pago como tarjetas, banca
neta, billetera, carta de
factura, etcétera Creo que UPI no está aquí porque mi negocio no
está verificado Ahora en el lado izquierdo,
obtenemos el resumen de precios, que son cinco rupias en el
back-end en la cantidad, pasamos 500 aquí
estamos consiguiendo pi rupia. ¿Por qué? Entonces en la cantidad llenada, tenemos que pasar cantidad en la unidad más pequeña
de la moneda. Y cuál es la
unidad más pequeña de nuestro país PSA, que es 100 PSA es
igual a una rupia. Y aquí pasamos 500 PSA, que convierte a Pi rupia. Entonces, si cambiamos
esto a, digamos, 50,000, guarda los cambios
y actualiza la página. Y si volvemos a hacer
clic en el botón de pago, vea, aquí obtenemos 500 rupias. Así que asegúrate del
monto del pago. Por eso creé
esta plantilla de front end, para que puedas entender todo el
proceso con mucha claridad. Además, en la parte superior derecha, podemos ver que estamos en el modo
degustación porque
creamos clave ID y clave
secreta para el modo degustación. Ahora, probemos el pago. Entonces para probar el pago, primero, vamos a las tarjetas. Aquí, para fines de degustación, ser pay proporciona
algunos detalles de la tarjeta. Además, proporcionaron
detalles completos sobre la documentación. Te daré
este enlace de página en el lado derecho a continuación
de esta lección. Entonces aquí vamos a las tarjetas. Probemos la tarjeta india, copiemos este número de tarjeta, y en nuestra página, péguela aquí. Ahora pasa aquí cualquier fecha
futura de caducidad, como 12 barra 30 y número CVV,
pasemos 111, hagamos el pago,
asegure la tarjeta, tal vez Es el procesamiento y qué escenario primero
queremos probar, el éxito o el fracaso, vamos
por el fracaso. Se está cargando. Y ver, el pago falló, y también obtenemos Alert
pago fallido. Ahora probemos el éxito. Nuevamente, en ese número de tarjeta, vea que se está cargando,
seleccione éxito. Y aquí conseguimos esta
hermosa animación, y luego conseguimos
el pago exitoso. Y además, obtenemos aquí el pago verificado
con éxito, que obtenemos de
nuestra segunda API. Entonces nuestra API ambas está funcionando bien. Si quieres probar
otro método de pago, entonces también puedes hacerlo. Simplemente revise la documentación
para ese método de prueba. Ahora actualicemos nuestra
API para un uso real. Entonces como sabemos, nuestro
pago está funcionando. Ahora podemos mejorar nuestras APIs
y hacerla realista. Es realmente simple.
Déjame mostrarte. Entonces, ¿qué quieres
cambiar en la API de pedidos? Número uno, actualmente
estamos pasando cantidad
estática aquí,
pero eso no es correcto. Tenemos que pasar el precio total
de la tarjeta del usuario. Segundo, también estamos
pasando tu moneda IR pero el usuario puede decidir en qué
moneda quiere pagar. Por lo que queremos hacer estos
dos cambios solamente. Empecemos por obtener el
monto de la tarjeta. Entonces antes de esta
instancia reser, escribimos const, cart y esperamos cart C,
autoiput Entonces en la parte superior, costo, carrito es igual a requerir vamos una carpeta arriba
modelos y en ese carro. Ahora en nuestro
carrito API punto Fino uno, y aquí en el objeto, pasamos usuario a solicitar punto
usuario punto subrayado ID Ahora, esto va a
devolver carrito Objeto, pero tenemos que pasar condición
si CAT no está disponible o CAT punto productos punto
Longitud es igual a cero, entonces devolvemos respuesta con estado 404 punto JCN
mensaje a CRT no encontrado Ahora en el lugar de esta cantidad, tenemos que pasar el precio total del CRT del carrito
punto a cien porque tenemos que pasar cantidad en la
unidad más pequeña de la moneda Degustemos esto,
guardemos los cambios y actualicemos la página y hagamos
clic en Taste Payment. Si revisamos la consola, vea, aquí obtenemos el error. Es el error 404, lo que significa que no se encuentra la tarjeta. Oh, recuerda, en la lección de
quitar carrito, eliminamos el carrito eliminando el último producto de
la matriz de productos, así que tenemos que agregar un
producto en nuestro carrito, ir a Cartero, abrir
en al carrito API Aquí tenemos que actualizar Togan, copiarlo desde la API de inicio de sesión, y pegarlo en el encabezado de
autorización Bueno. Ahora envía la
solicitud, producto agregado. Es iPhone, bonito. Ahora vuelve al navegador
y actualiza la página, y otra vez, prueba el pago. Ver, aquí obtenemos nuestro precio de tarjeta. Ahora, como sabemos, en base de datos, almacenamos el
precio de todos los productos en valor en dólares estadounidenses, y por eso estamos obteniendo
dos iPhones en este precio Pero si estás usando el pago por maquinilla de afeitar, tu negocio
estará en la India y
lo más probable es que tus usuarios
objetivo también sean indios. Entonces en ese caso,
en la base de datos, hay
que almacenar el precio
en la moneda india. Ahora, supongamos que
quieres apuntar a audiencia
global y almacenar el
precio en el dólar estadounidense. En ese caso, hay que
convertir ese precio del dólar a moneda
india y
luego pasarlo en la cantidad déjame
mostrarte cómo podemos hacerlo. Entonces, para convertir
el valor del dólar en la moneda india, necesitamos el tipo de cambio actual. No podemos confiar en el tipo de cambio
estático. Entonces llamaremos a una API para obtener el tipo de cambio
exacto. Así que dirígete a novio y
busca tipo de cambio api.com. Esta es la API de
tipo de cambio popular. Ahora para obtener el tipo de cambio, necesitamos la clave API para eso. Entonces aquí ingresamos nuestro correo electrónico y simplemente damos
clic en GetVree Key Aquí, tenemos que
crear contraseña, aceptar términos y generar
ApiKey. ¿Qué es esto? Completa la
verificación, y luego te
enviarán la
clave de activación de API en tu correo electrónico. Abre ese enlace, y aquí
obtenemos la clave API. Podemos ver que podemos enviar
1,500 solicitudes de cambio. Si quieres obtener más solicitud, entonces tienes que pagar por eso. Cómo funcionan todas las API
de tipo de cambio. Por ahora, no te preocupes por eso. Simplemente copie esta clave
y en nuestro archivo ENV, agregamos la API de
puntaje de tipo de cambio, clave de
subrayado es igual a
pegar su clave API aquí Guarde este archivo y vuelva
a la página de tipos de cambio. Aquí, tenemos que encontrar la API, ir a la descripción general de Doc's. Aquí tenemos APIs, una para obtener
todo el tipo de cambio, y otra para obtener el par. Vamos a conversación de pareja. Aquí, obtenemos la
API, así que copia esto, y en nuestra API, vamos a crear una función separada para obtener el tipo de cambio. Entonces Const, el tipo de cambio de reloj
es igual a la función de flecha. Ahora en esta función, llamaremos a ese
tipo de cambio API. Entonces la respuesta const
es igual a wedge, y aquí en los backticks, simplemente
pasamos el IIURL Ahora tenemos que cambiar
un par de cosas. Aquí en el lugar de su APIE, tenemos que escribir corchetes de
dólar Cully,
procesar punto nw dot Exchange, tasa de
subrayado, subrayado clave de subrayado API Asegúrese de escribir el nombre de variable ENV
correcto. Ahora por fin,
tenemos dos divisas. primera es la moneda base, que es la moneda en que agregamos el precio
en nuestra base de datos, y
la segunda es la moneda de destino en la que
queremos convertir. Entonces nuestra moneda base es el
USD porque en la base de datos, agregamos el precio de los productos en USD y queremos convertir
esa moneda en INR. Entonces nuestra moneda objetivo es INR. También en el lugar de pasar valor
estático de la moneda
objetivo, podemos hacerla variable. Entonces en el parámetro, obtenemos moneda
objetivo y
pasamos ese dólar calibrar la moneda
objetivo Ahora, como sabemos, la búsqueda de
API es una tarea runosa asíncrona. Tenemos que esperar aquí
la respuesta. Y para usar esperar, tenemos que hacer esta
función asíncrona. Luly Ahora esta respuesta
devolverá datos como estos. Aquí necesitamos esta tasa de
conversación. Después de obtener la respuesta, tenemos
que convertir esos datos en JSON. Los datos de costo son iguales a
esperar respuesta punto JSON. Ahora a partir de esta función, podemos simplemente devolver datos punto conversación
subrayado tasa Bueno. Ahora en nuestro OrderYPI simplemente contamos aquí
cantidad, recuento de cambio, tasa de
subrayado es igual al
peso, parche, tipo de cambio, función, y como argumento, pasamos nuestra
moneda objetivo, que Ahora después de obtener
el tipo de cambio, creamos el monto const
es igual al precio total de la tarjeta de
punto de la tarjeta en el tipo de subrayado de
cambio, y tenemos que redondear este Así que envuelva esta expresión
con paréntesis y simplemente agregue punto a fijo
y pase aquí dos Ahora en la cantidad,
pasamos cantidad a 100. Ahora vamos a revisar esta
implementación. Guarde este archivo de nuevo en el navegador, actualice la página y
haga clic en Degustar el pago. Ver, ahora obtenemos el valor
en la moneda india. Genial. Ahora, supongamos que queremos que nuestro usuario pueda
pasar el valor objetivo. Entonces obtenemos el
valor objetivo del usuario en el cuerpo del punto de solicitud. El objeto Secst es igual
a solicitar el cuerpo del punto, y aquí obtenemos la moneda Y para el valor predeterminado, pasamos aquí nuestra
moneda de base de datos, que es USD. Ahora en el lugar de esta
moneda objetivo codificada, pasamos nuestra variable de moneda, que nuestro usuario pasa en
el cuerpo del punto de solicitud. Además, aquí está la única cosa. Si nuestra moneda base y la divisa
objetivo son las mismas, entonces no necesitamos obtener el tipo de
cambio, ¿verdad Entonces hagamos modificación
en nuestro código. Antes de este tipo de cambio, pasamos I condición
moneda es igual al USD, que es nuestro
valor de precio en la base de datos. Si ambos son iguales, entonces tenemos que hacer
cantidad es igual al precio total de la tarjeta punto de la tarjeta. De lo contrario podemos calcular
cantidad así. Entonces simplemente movemos estas dos
líneas aquí, quitamos esta const, y en la parte superior, definimos
let cantidad es igual a cero Por lo que reemplazamos este valor de cantidad acuerdo a nuestra condición. Y también en las opciones de pedido, tenemos que pasar esta moneda, guardar las chinges y
probemos nuestra implementación Refiéranos la página, da click
en probar pago ver, aquí obtenemos INR porque
desde front end, estamos enviando moneda como INR. Si quieres cambiar
eso, entonces abre stmlFle scroll a Aquí, en moneda de usuario, pasamos CAD por dólar canadiense. Guarde este archivo, actualice la
página y envíe la solicitud. Consulta aquí obtenemos valor
en el dólar canadiense. Además, si no pasamos su campo de moneda
en la llamada EPI, guarde esto, actualice la página y envíe nuevamente la solicitud Ver, por defecto, alcanza su pico en USD. Genial. Además, si su cuenta de
pago de maquinilla de afeitar no tiene función de pago
internacional, entonces no puede realizar pagos
internacionales. Es la política del ser pay. Si desea verificar
la función de
pago internacional de su cuenta, luego vaya a sus
cuentas y
opción de configuración de su cuenta de ser Bay. Asegúrate de estar
en el modo en vivo. Aquí, no puedo pasar al modo
e porque esta
cuenta no está verificada. Si puedes ir en modo vivo, entonces ve a los
pagos internacionales en el blog de pagos. Que puedas ver que tu función de pago
internacional está activada o no. Actualmente, estamos en
el modo de prueba y también testará campo en
nuestro pago internacional. Así que mejoramos nuestra primera API. Ahora pasemos al segundo. Ahora vamos a mejorar
nuestra segunda API. No te preocupes en que no
tenemos que hacer mucha cosa. Simplemente crearemos nuevos datos
de pedido en
la base de datos y eliminaremos la tarjeta de usuario si el
pago es exitoso. Si no se verifica el pago, entonces estamos ejecutando
este bloque de código. Yo pago es exitoso, entonces podemos escribir código aquí antes de que devolvamos respuesta de
éxito. Aquí creamos costo, nuevo orden es igual a nuevo orden. Asegúrese de que ingresamos
este modelo de pedido. Entonces en la parte superior, el
orden de costo es igual a requerir que vayamos uno más completo hasta
modelos y en esos pedidos Bueno. Ahora en la parte inferior, tenemos que pasar nuevo objeto de
orden aquí. En primer lugar, en este orden, agregamos usuario para solicitar punto
usuario punto subrayado ID Después de eso, necesitamos
productos, y en eso, almacenaremos todos los
productos que ordenemos, ¿cómo podemos obtener esta información? Bien, podemos conseguirlo
desde la parte de atrás. Antes de este pedido, encontramos costo, carrito es igual a ocho
carrito punto Fino Vn. Aquí en el objeto, pasamos condición usuario para solicitar punto usuario
punto guión bajo ID Simplemente en los productos del pedido, pasamos los productos a los productos
CAT dot. Siguiente, productos totales
a CRT Total Products. A continuación, tenemos precio total
a CRT Precio total CRT. A continuación, tenemos la dirección de envío, que tenemos que obtener
del front end. Por ahora, déjalo como está. A continuación, agregamos
estado de pago a pagado, ID de
pago para reservar pago,
guión bajo, pago, ID de
guión bajo Y como información extra, podemos almacenar RESERPEOder ID,
para reservar guión bajo, ordenar ID de guión bajo Pero tenemos que agregar este
campo en nuestro esquema de pedidos. Después de este campo, agregamos el ID de
ReserpeOder a la cadena. Y eso es todo. Pasamos toda
la información que necesitábamos. Ahora podemos almacenar este nuevo pedido, así que aguardan nuevo pedido punto CV. Y después de guardar el nuevo pedido, podemos eliminar nuestra tarjeta
de la base de datos. Así que espera tarjeta punto deleteB
aquí ya tenemos tarjeta. Es por eso que
utilizamos directamente card dot delete one. Si no llegamos aquí tarjeta, entonces tenemos que usar CRT dot
Fine one y eliminar método así, y eso es todo Ahora solo tenemos que pasar dirección de
envío en
la propiedad del pedido. Entonces dime de donde
sacamos la dirección de envío. Bien, lo conseguimos
de la parte delantera. En el cuerpo de solicitud de
verificación de pago, podemos obtener la dirección de envío
porque desde el front-end, ya
pasamos la dirección de
envío. Ver aquí paso la dirección de
envío. Ahora déjame
darte una situación. Imagina que el usuario olvidó
pasar la dirección de envío. Ahora bien, ¿cómo podemos entregar
el producto a ese usuario? Tenemos que asegurarnos de que el usuario
pase esta dirección de envío. Entonces aquí podemos escribir si la dirección de envío no
está disponible, luego devolvemos respuesta con el Código de Estado 400
para solicitud de apuesta, y en el objeto JSON, pasamos mensaje para por favor
proporcione su dirección de entrega. Ahora aquí hay una cosa más. Sabemos que esta API de verificación de pago se ejecutará después de que se realice el
pago. No podemos decir ahora usuario, no
proporcionan dirección de
sorbo, así que podemos hacer una cosa más Simplemente podemos poner esta condición al comienzo
de nuestra primera API. Y aquí obtenemos dirección de
zipping del cuerpo
del punto de solicitud Por lo tanto, nuestro front-end necesita pasar dirección de
Zipping en
estas dos API Además, en nuestros datos de pedido, establecemos la dirección de zipping a la dirección de
sorbo, y eso es todo. Aquí, nuestra
parte de implementación ha terminado. Veamos que estamos pasando dirección de
zipping en
ambas API o no Entonces en el archivo de plantilla ser P, podemos ver aquí en
la segunda API, estamos pasando dirección de zipping como
dirección de zipping, y también en nuestra primera API, también
estamos pasando dirección de
150. Pago internacional con Paypal: Veamos cómo podemos implementar pasarela de pago
internacional
en nuestra aplicación de nodo. Entonces como sabemos, para el pago
global, tenemos dos opciones muy
populares. Tenemos raya y
tenemos papel. En esta lección,
implementaremos papel como este. Lo implementaremos en nuestro back end, lo
probaremos con el front end, y también aquí podemos
ver los pagos de sabor. Entonces será divertido. Este video es para cualquier
gente del país. Empecemos con esto. Además, actualmente, stripe es única opción de
solicitar
para mi país, por lo que puedo mostrarles la
demostración de Stripe. Si en el futuro, lo permiten, entonces voy a crear
lección sobre eso también. Ahora entendamos
el flujo
de trabajo de la pasarela de pago Paper. Entonces, cuando el usuario haga
clic en el botón Checkout ,
crearemos una API ,
digamos, crear orden. API creará orden
para el pago en papel con algunos detalles
como la cantidad que
queremos recibir pagar, en qué moneda queremos que
el usuario pague USD o Euro. Recuerda, este pedido
es un pedido en papel, no nuestra colección de pedidos. Ahora, esta API
generará ID de pedido usando papel y simplemente devolverá
ese ID de pedido al front-end. Al usar ese ID de pedido, papel abrirá la página de pago donde el usuario puede ingresar
detalles sobre el pago. Ahora, después de que el usuario ingrese los datos de
pago, llamaremos a otra API para
capturar ese pago. Básicamente, mediante esta API, permitiremos a los usuarios el pago, agregaremos en nuestra cuenta
comercial en papel, y luego creamos los datos del pedido, y después del pago exitoso, creamos los datos del pedido y
confirmamos el pedido del usuario. Entonces, para implementar el pago en
papel, tenemos que crear dos APIs
en nuestro revés de nodejs Primero para crear orden, y el segundo es para capturar el pago
en nuestra cuenta. Sé que tienes muchas
preguntas, pero no te preocupes. Después de completar esta lección, comprenderá mejor
todo el flujo de trabajo. Así que vamos a crear estas dos APIs. Además, si implementas pasarela de pago
SRP de
la lección anterior, entonces tienes que
repetir pequeñas cosas como eliminar la
caducidad del token, etcétera Tengo que repetir para que
todos nos pongamos en una página. Perdón por eso. Espero que
lo entiendas. Ahora en la carpeta rutas, tienes que crear un nuevo
archivo llamado orders dot js. He creado este archivo con dos APIs porque en
la lección anterior, muestro la integración SRP, pero esas dos APIs separadas de esta integración de
pago Eso se puede ignorar totalmente. Ahora para
agregar rápidamente la ruta, simplemente
puede copiar las
dos primeras líneas de código de las rutas de la tarjeta y pegarla
en el archivo de ruta de Pedidos. Al final, hay que hacer módulo punto Xbards
es igual a Además, hay que agregar este enrutador en el archivo
index dot js, por lo que Const Order
routes es igual a requerir
carpeta Got routes y Orders En la parte inferior, después de
las rutas de la tarjeta, puedes agregar app.us slash API slash Order
y pasar Order Ahora puedes enfocarte
en construir APIs. Así que en nuestro archivo,
router punto post y punto para cortar La gente
barra Crear orden Aquí también necesitamos
middleware Os porque queremos que solo
los usuarios conectados puedan acceder a esta API También asegúrese de ingresar Osmddleware en la
parte superior y después de eso, está en devolución de llamada Ahora en esta función, sabemos que queremos
crear Pedido de papel. Para eso, primero,
tenemos que configurar P. En la carpeta de configuración, tenemos que crear un nuevo
archivo llamado paper dot js. En primer lugar, definiremos
variable para algunos detalles. Entonces el papel const es
igual a objeto. En primer lugar, el ID de cliente, que es nuestro ID de cliente de
aplicación, luego el secreto del cliente, que es la clave secreta de nuestra aplicación en
papel, y por fin,
también necesitamos URL base. Esta es la URL base
de la API en papel. Todos estos detalles los
almacenaremos en el archivo NNV porque
por razones de seguridad Así que aquí pasamos proceso
punto w punto papel, subrayado cliente subrayado ID Y en la segunda propiedad, escribimos process.nw punto
papel, subrayado secreto Y por fin, escribimos
proceso punto E y papel, , base,
subrayado URL Ahora, vamos a establecer estas tres
variables en el archivo ENV. Entonces PPL subrayado cliente
subrayado ID es igual
a dejarlo en blanco,
y siguiente, subrayado papel,
secreto es igual a, secreto es igual a La URL del guión bajo de la base del
guión bajo en papel es igual a. Los agregaremos cuando
registremos la cuenta comercial en papel. ¿Bien? Por ahora,
déjalo como está. Ahora en papel cuando queremos
crear un pedido en papel o
queremos capturar el pago en
bootstep necesitamos
crear un token único como JWT Entonces, para generar ese token, podemos crear una función para eso. Const G Xs token es
igual a la función de flecha. Ahora para generar el token, usaremos API de personas
oficiales. Entonces para llamar a API
usaremos AXOS. Axios es el paquete para
llamar a API en JavaScript. Es mucho más fácil que
usar el método fetch. Terminal de pluma, NPM,
instalar Axios. Bueno. Ahora para usar este paquete
Axios en la parte superior, importamos costo Axios es
igual a requerir Ahora, en nuestra Puerta
ases para confundir, esperamos axios punto aquí, tenemos que agregar el
método SDDP, que Y en este método, en
la primera posición, añadir punto final API en backticks, dólar Cali Brackets,
punto BRL V uno, O oth, dos, slash token Ahora en el segundo lugar, que es el cuerpo, tenemos que
pasar códigos dobles. Conceder, el tipo de subrayado es igual a las credenciales de subrayado
del cliente Y en el tercer lugar,
pasamos Configure Object. Primero, Oh, para objetar, usa un nombre P punto ID de cliente. Y a continuación tenemos contraseña
al secreto del cliente ppt. Ahora después de Oath,
agregamos encabezados al objeto en
códigos dobles tipo de contenido,
dos en códigos dobles, dos en códigos dobles, aplicaciones codificadas por URL xWWWfm Y eso es todo para esta API. Esta API generará
un exceso de token para nosotros, por lo que almacenamos eso en respuesta
variable. Y luego simplemente
devolvemos respuesta, punto de datos punto Xs
y como token de código. Ahora por usar esperar, hacemos esta función asíncrona y también tal vez este código nos
pueda dar error. Así que es mejor envolver este
código en try and cache block. Así que un
bloque try and catch y mueve este
código en el blog Try. Y en la caché,
nos consola dot log, error en la obtención de token de acceso Y escribimos este mensaje
de punto de error. Simplemente al final, hacemos módulo de exportaciones de punto
es igual a objeto. Y aquí agregamos papel a papel, o podemos escribir solo papel y obtener token de acceso
para obtener acessTken Guarde este archivo y vuelva
a nuestra ruta de pedidos. Ahora para crear un
nuevo pedido en papel, usaremos otra API P. Puedes obtener todas estas APIs en la documentación en papel.
No te preocupes por eso. Entonces costo respuesta es igual a esperar Axios para el
envío de solicitudes, y qué solicitud
queremos enviar post Así post en el primer argumento, tenemos que pasar y señalar
Batis dólar Cali Brackets,
papel punto arllasv Slash checkout slash Órdenes. Además, para usar esta variable de
papel, que definimos en el archivo de configuración de
papel, tenemos que importarla en la parte superior. Const ciBacketsPaper, y también
necesitamos gat access token es igual a
requerir que vayamos una carpeta
arriba Además, importamos const Axios
es igual a requerir Axos. Ahora en nuestra API en Axios
en el segundo parámetro, podemos pasar el cuerpo
de la solicitud Aquí pasamos objeto
con algunas propiedades. El primero es la intención. Esto establece la intención de
la orden de captura. Esto le dice a
la gente que el pago será capturado
inmediatamente cuando
el usuario lo apruebe. Debido a esto,
capturaremos de inmediato el pago
en segunda API. Siguiente propiedad que agregamos es
comprar unidades de subrayado. A la matriz. Esto
representa los artículos o servicios que el usuario está
comprando y cuánto cuesta. Por ahora, solo
pasamos un objeto, y en eso pasamos descripción
al pedido del carrito de compras, y otra propiedad
por cantidad a objeto. Dentro de esto, tenemos que pasar en qué moneda queremos
aceptar el pago. Entonces código de moneda a USD
y luego valor a diez. Queremos del usuario
tenue valor D. Ahora, después de comprar unidades, pasamos aplicación,
subrayamos contextos. Esto proporciona en papel
instrucciones sobre qué hacer después de que el usuario
haya hecho con el formulario de pago en papel. Entonces en este objeto, tenemos que pasar dos propiedades. El primero está escrito
subrayado URL. Esta es la URL en la que
queremos redirigir a nuestro usuario después del pago verificado
con éxito por papel. Y segunda propiedad es
cancelar guión bajo URL, esta es la URL en la
que queremos
redirigir al usuario después de que el pago sea
rechazado o cancelado Por ahora, deja este
campo tal como está. Llenaremos esto cuando
probemos esta implementación. Ahora, después del cuerpo
de la solicitud, podemos pasar otras configuraciones
como encabezado a objeto, tipo de
contenido a aplicación, ZSN y también tenemos que pasar encabezado
de
autorización a cerveza Batis,
espacio, y aquí
agregaremos token ¿Se puede decir cómo podemos
generar ese token? Podemos usar GXSSTKenFunction. En la parte superior const token es igual a un peso porque
esta es una función AN, obtener el exceso de token en el encabezado de
autorización, pasaremos el token
Calibrakets dólar, y eso es todo para
esta Ahora esta API creará un
nuevo orden como datos escritos, como ID de pedido y algunos enlaces. Aquí solo necesitamos
devolver el enlace, que es el enlace de papel. Si abrimos ese enlace
en el navegador, entonces obtendremos la página
de pago en papel. Así que simplemente devolvemos respons
dot Json Object approval URL, dos respons dot theta dot Links
dot find Aquí obtenemos la función de flecha de
enlace único, punto de
enlace L es igual a los códigos, aprobamos el punto exterior
HRF, y eso es todo Nuestra primera API está completa. Ahora definamos rápidamente nuestra segunda API para
capturar el pago, y luego probaremos
esta implementación. Así router, punto post, y punto para cortar
papel de captura Orden Después de eso está en devolución de llamada
con solicitud y respuesta. Ahora, capturar el pago
es muy sencillo. En primer lugar,
obtendremos
el ID de pedido del cuerpo del punto de solicitud
porque desde el front-end, tenemos que enviarlo y necesitamos este ID de pedido para
capturar el pago. Además, para la verificación,
podemos poner condición aquí, si el número de pedido no está disponible, entonces simplemente devolvemos el estado del punto de
respuesta, objeto Json de
400 puntos
con propiedad del mensaje, por favor envíe el ID del pedido
o proporcione el ID del pedido. Proporcionar sonidos buenos.
¿Qué dices? Sí. Ahora bien, si tenemos ID de pedido, entonces necesitamos token
para la API de captura PL. Entonces Gs token es igual a esperar, G exceso de token, y al final, simplemente
llamaremos a una API. Esperan axios punto
post para punto final, pasamos impuestos bc, dólar clacketSP punto BRL dos,
barra de cajas Órdenes dólar
Cali corchetes, barra de cajas Órdenes dólar
Cali corchetes Como captura. Ahora en el segundo parámetro, tenemos que pasar cuerpo. Para esta API, no
necesitamos pasar nada, así que pasamos objeto vacío. Ahora obtenemos el estado y algunos detalles sobre la
captura de esta API. Entonces podemos almacenar eso en
respuesta, y al final, simplemente
devolvemos el simplemente
devolvemos estado del objeto Json del punto de
respuesta a la respuesta, los datos de
punto, el estado del punto. Este estado
indicará que el pago capturó correctamente
o no, y eso es todo. Se puede ver lo sencillo que es. Solo tenemos que llamar a People API. Ahora podría preguntarse, ¿por qué no podemos llamar a estas API
desde el front-end? Supongamos que llamamos directamente a esta API
de orden de
creación desde el front-end. Ahora, como sabemos, el usuario tiene
exceso del front-end. Simplemente pueden modificar este valor de cantidad y
convertirlo en cero o 0.5. Imagínese cuánto dinero perderá
la compañía, y también algunas personas harán
mal uso de alguna información. Entonces es por eso que
tenemos que implementar estas funciones de pago
en nuestro back end. Aquí completamos nuestras dos
APIs para p. no te preocupes, esto es solo una
implementación básica. Mejoraremos estas API después pruebas porque en
la segunda API, después de capturar el
pago con éxito, tenemos que crear
un nuevo pedido para ese usuario y eliminar
los datos de la tarjeta. Por ahora, no
queremos esa complejidad, entonces lo haremos más adelante
en esta lección, ¿verdad? Antes de probar estas API, necesitamos una clave de cliente en papel, Secreto de
personas y URL base de personas. Recuerda, usamos
variables vacías en el archivo ENV, necesitamos agregar estos
tres campos primero, y para eso, tenemos que
configurar la cuenta de People Business Ahora vamos a configurar la cuenta Paper
Business. Creemos una nueva cuenta en papel y probemos esta implementación. En este proceso, es posible que necesites algunos documentos legales
y tus datos bancarios. Así que dirígete a la página de
desarrollador de papel, que es developer.paper.com Si ya tienes una cuenta comercial en
papel, entonces es buena, pero la mayoría de los estudiantes no tienen una cuenta comercial en
papel. Aquí estoy hablando de cuenta
comercial, no personal. También puede convertir
su cuenta personal en cuenta comercial
desde esta configuración. Aquí hacemos clic en C registrarse
para crear nueva cuenta. Asegúrese aquí de seleccionar la cuenta comercial
y comenzar. Ingrese su correo electrónico
aquí y envíelo. Ahora aquí, crea tu contraseña. Asegúrese de seguir esta
instrucción y enviarla. Ahora, describe tu tipo de
negocio, selecciono tu particular, y aquí tenemos que
dar también esta información. Producto o servicio,
digamos, mercados. Estoy escribiendo detalles aleatorios, pero en el mundo real, tienes que escribir tus datos originales. Código de propósito, déjame
ver lo que tienen. Selecciona tus servicios de
entretenimiento. Después de eso, tengo que escribir
mi número de cédula de identidad. Para tu país,
podría ser otra cosa, así que tienes
que escribir esos datos correctos. Nombre de la declaración a, digamos, que Dios los bendiga y
envíe el formulario. Ahora aquí, tenemos que llenar los datos sobre
personales y comerciales, así que rápidamente llené estos datos. Por lo que estas plataformas de pago cambian su
interfaz muy a menudo. Entonces si en el futuro, no
obtienes la misma
interfaz como yo, entonces no te confundas. Simplemente proporcione los
detalles que están pidiendo y cree una
cuenta comercial en papel. Después de crear una cuenta, podemos crear
ID de cliente y secreto de cliente. Además, aquí selecciono
moneda primaria a dólar estadounidense. Puedes elegir lo que
quieras acordar y continuar. Aquí están pidiendo
verificar tu identidad. Si estás planeando realizar tus pagos en el modo en vivo, entonces completa este proceso lo antes
posible. Por ahora, solo quiero probar, seleccionar, hacerlo después. Esto nos moverá en
la página de cartón. Ahora en la parte superior,
haz clic en desarrolladores, y como puedes ver, ahora
estamos en el modo Sandbox,
lo que significa modo de prueba Ahora para crear
ID de cliente y secreto de cliente, vamos a aplicaciones y credenciales. Haga clic en Crear aplicación. Escribe el nombre de tu app, cualquier cosa. Digamos nodo Cardwish. Estamos creando una cuenta para comerciante y simplemente creamos una aplicación. Se está cargando y ver, aquí obtenemos
ID de cliente y secreto. Entonces primero, copia el ID de cliente y pegarlo en nuestro ID de cliente de
archivo ENV Ahora, copia la clave secreta y también
pégala a valor secreto. Para
URL basada en papel, pasamos TDP,
dos puntos, doble barra
hacia adelante Bueno. Guarde este archivo. Ahora para probar con pago, también
necesitamos
cuenta de prueba sandbox para enviar el pago Entonces vamos a probar herramientas y se como cuentas sandbox ver, aquí tenemos dos cuentas de
prueba, una para negocios y
otra para personal En este momento, no necesitamos
crear una nueva cuenta. Si necesitamos, entonces crearemos. Ahora, como sabemos,
necesitamos front-end para probar esta API porque
en el front end, abriremos la página de pago en papel. Ahora, como sabemos,
necesitamos front-end para probar estas APIs
porque en el front end, abriremos la página de pago en papel. Así que aquí creé una simple página
SDML llamada p
degustación punto SDML Obtendrá esta página
debajo de esta lección, y también está disponible en los recursos proyecto a carpeta. Descárgalo y simplemente
agrégalo en tu proyecto actual. Ahora, vamos a ejecutar este
SDMLFle en Browser. Así que ve a sdmlfle en
el Explorador de archivos o Finder y simplemente
ábrelo en el Chrome Aquí obtenemos el título
y un simple botón. Si quiere ver lo que pasó al
hacer clic en este botón, entonces podrá ver
el archivo SDML Es realmente simple. Ver, actualmente se
está ejecutando desde archivos
locales de nuestra máquina.
Ahora, aquí está la única cosa. Recuerda, en el orden API, tenemos que pasar los
contactos de la aplicación. Ver, aquí. Básicamente, tenemos que pasar la página de Éxito
y cancelar la página. En el orden API, no
podemos pasar la ruta de la carpeta Local, tenemos que pasar URL. Entonces, ¿cuál es la solución aquí? Podemos alojar nuestro
archivo SDML en el servidor Local, y luego
pasaremos esa ruta aquí Déjame mostrarte que
es realmente sencillo. Entonces, en la pestaña de extensión,
busca Live Server. E instala esta extensión. Mediante el uso de esta extensión, podemos ejecutar nuestra aplicación
en el servidor local. Volver a archivos y enlace derecho en el papel degustación sdmlfle y seleccione abrir
con Y ver que está abierto
en el navegador, pero ahora se está ejecutando
en este puerto. Simplemente copie esta URL, vuelva al código Vas, y simplemente pégala en la URL escrita y
también en la URL Cancelar, pega la misma URL. Pero para verificar, esto
está funcionando o no, pasamos aquí cancelar. En el mundo real para preguntar desarrollador
front-end
qué página quieren
mostrar sobre el éxito y cancelar y cambiar el
camino de acuerdo a eso. Paso este camino
solo para probar. Guarde este archivo y
asegúrese de que el servidor esté funcionando. Aquí, me sale error, parámetros
duplicados. Oh, aquí paso respuesta
en el lugar de solicitud. Y también, déjame
revisar otra API. Sí, aquí también solicitamos. Guarde este archivo y
asegúrese de que nuestro servidor esté funcionando. Bueno. Está funcionando. Ahora de vuelta a la habitación y simplemente
haga clic en pagar con papal. No pasa nada.
Eso no es justo. Comprobemos qué pasa. Así que pan inspecciona usando FL, ve a Consola, y aquí
podemos ver que obtenemos error. El acceso a la API de búsqueda o
creación de pedidos desde origen Nulo ha sido
bloqueado por la política del curso Este es un error muy popular
para los desarrolladores de pila completa. Sucede porque por defecto, nuestra aplicación Express no puede aceptar llamadas API
desde ningún origen. Tenemos que habilitar el curso
en nuestra app Express. Así que volvamos a la terminal y escribimos NPM instalar CRE. Y dale a Enter. Ahora en el archivo index js en
la parte superior, importamos costo. Curso es igual a
requerir curso. Entonces en la parte inferior, antes de este express
DJs y middleware, agregamos app dot g
course, y eso es todo Ver los cambios. Asegúrese de que
nuestro servidor esté funcionando. Bueno. Ahora simplemente haz clic en botón de
pagar con papel. Aquí obtengo error
en la creación del orden, lo que significa que estamos
obteniendo error en API uno. Comprobemos lo que está pasando
aquí. Así que abre Consola. Aquí me dan 400 mal pedido. Así que volvamos al código VS
en el terminal, C, obtenemos token como portador. Ingresa tu token JWT, lo que significa que pasamos
token incorrecto desde el front-end Así que abra paper testing dot sdmlfle aquí tenemos que ingresar
a Abrir cartero, abrir API de inicio de sesión, generar un nuevo token Bien, copia este token, y en nuestro archivo STML,
pasa este token Guarde este archivo, menos esto. Haga clic en pagar con papel. Tomará algún tiempo y ver, aquí obtenemos la página de inicio de sesión de papel, lo que significa que nuestra primera API de
orden de creación está funcionando bien. Ahora antes de iniciar sesión,
cancelemos el pago. Ver, redireccionamos para cancelar URL. Ahora retrocede dos veces para nuestras rutas de front-end y
haz clic en Pagar con Paper. Obtenemos la página de inicio de sesión de Paper. Aquí en el mundo real, nuestro cliente ingresará
con su
ID y contraseña en papel. Pero aquí para degustar, usaremos la cuenta Sandbox Piense en papel Sandbox cuenta es como Dummi
cuenta para degustación Así que vamos a nuestro Panel de Papel. Aquí tenemos
cuenta personal. Haga clic en eso. Aquí, vea, obtenemos información de inicio de
sesión copiar correo electrónico y en nuestro
front-end, agregue ese correo electrónico. Ahora vuelve a Dashboard
y copia la contraseña y pégala en la contraseña
y da clic en Iniciar sesión. Aquí nos escriben
al error del comerciante. No podemos procesar su pago usando su cuenta en
papel en este momento. Por favor, vuelve al comerciante e intenta usar un método de
pago diferente. Así que déjame intentarlo de nuevo. Ver, aún así, estamos
recibiendo el mismo error. Ahora déjame probar otra cosa. Actualmente, mi solicitud
se basa en cuenta india, y aquí estoy tratando de
pagar por India a India. El papel no permite pagos
nacionales dentro de la
India a través de billeteras de papel. Incluso en la cuenta sandbox, intentamos una transacción entre
dos cuentas indias, entonces también
nos dará error para que el pago de la India a
la India tenga otra pasarela de pago
como el raiser pay Vamos a crear una
cuenta de prueba para otro país. Tipo de cuenta a
personal y aquí, seleccione cualquier país
pero no seleccione el mismo país que esa cuenta comercial.
Crear cuenta. Ahora intentemos iniciar sesión
con esta nueva cuenta. De vuelta a nuestra parte delantera. Aquí, estoy recibiendo el mismo error porque mi cuenta ha iniciado sesión. Entonces abramos este front end en pestaña de
incógnito y
paguemos con papel Aquí, obtengo la página de inicio de sesión. Asegúrate de iniciar sesión con otra
cuenta de país, correo electrónico de Addhe, y también agrega aquí la contraseña
e inicia sesión con esta cuenta Ver, aquí obtenemos la página
de pago en papel. En la parte superior, obtenemos
la cuenta de usuario, y aquí obtenemos precio a pagar. Además, aquí en la parte inferior, obtenemos varios
métodos de pago como saldo en papel, Cooperativa de crédito usando tarjeta, Un crédito en papel, y
también puedes agregar tu propia tarjeta. Esto es cuenta de prueba, y por eso
no hacemos nada. Además, aquí obtenemos la
dirección de esta cuenta. Estos son detalles de
la cuenta de degustación. Ahora hagamos clic en
Continuar para revisar el pedido. S, aquí obtenemos el pago fallido. Déjame comprobar lo que está mal. Abra la consola usando bien
F y vea, aquí obtenemos error en la API de orden de
captura. Entonces en nuestro código VS
en la terminal, aquí me sale este largo error, así que rápidamente desplázate hacia arriba. Aquí obtenemos error, no se pueden leer propiedades de estado de lectura
indefinido. Entonces en nuestra segunda API, no
estamos obteniendo estatus. Déjame comprobar lo que está
mal. Oh, lo siento. Aquí, me olvidé de escribir. Guarde este archivo y
vuelva a nuestro front-end. Permítanme intentar eliminar
este token y el ID
de par de la URL y ejecutar
este sencillo archivo SGML Ahora haz clic en Pagar con Papel. Ver obtenemos el pago papal, simplemente haga clic en Continuar
para revisar pedido Aquí vuelvo a recibir llenado de pago. Recuerda, cada vez que
aplicamos alguna característica nueva, definitivamente vendrán
errores. No se frustre, concéntrese en las soluciones, no en los problemas. Ver, aquí me sale error
interno del servidor. Permítanme verificar la
solicitud de terminal llena con Código de
Estado 400 en nuestra API de orden de
captura, lo que significa que no estamos
obteniendo el ID del pedido. Oh, aquí solo escribo
solicitud punto cuerpo. Hay que agregar ID de pedido por puntos, guardar los cambios, y en nuestro
front end, pagar con papel. Continuar con la revisión del pedido. Mira, pasamos a
nuestra página de éxito, y aquí también obtenemos el
pago exitoso, lo que significa que nuestra segunda API captura el pago también
está funcionando. Ver, en nuestra URL, también obtenemos Token, que es el ID de pedido, y vamos a buscar este
parámetro en nuestro front-end, y luego llamamos a la segunda API de
captura de pago y pasamos ese
ID de pedido en el cuerpo Y por eso capturamos el
pago en cuenta de papel. Comprobemos nuestra cuenta
comercial, obtengamos el pago de $10 o no. Para eso, tenemos que
ir al tablero de Papanicolaou. En las herramientas de prueba, vaya a las notificaciones de sandbox Ahora desde este menú desplegable, seleccionamos nuestra
cuenta comercial y hacemos clic en buscar. Y en la parte inferior,
obtenemos el pago. Si no obtienes aquí el pago, asegúrate de esperar de
dos a 3 minutos porque a veces lleva tiempo
mostrar el pago aquí. Ahora bien, si abrimos esto, entonces podemos ver que recibió el
pago $10 de John, que es probar el nombre de la cuenta. Aquí podemos ver la fecha
de la transacción. Este es el formato PST, que es el tiempo estándar específico. No te confundas con eso. Ahora podrías preguntar por qué obtenemos pago en esta cuenta
comercial. La razón por la que obtenemos el pago en esta cuenta comercial
porque al usar esta cuenta, creamos nuestra aplicación y luego obtenemos
ID de cliente y secreto en papel. Es por eso que obtenemos el pago
en esta cuenta comercial. Ahora aquí probamos
el pago para usuario estadounidense. Ver, aquí obtenemos
el código del país. Ahora para probar otro pago de
país, podemos crear una nueva cuenta. Seleccione aquí personal,
que es la cuenta del comprador, y aquí podemos seleccionar el país. Digamos que selecciono aquí país, Canadá, puedes seleccionar cualquier
país y crear cuenta. Esto es muy divertido.
Ver, en la parte superior, obtenemos la nueva cuenta
para usuario canadiense. Abra ese usuario y simplemente
copie el ID de correo electrónico. Ahora volvemos a nuestro front-end y aquí vamos a simple URL
de pruebas en papel. Asegúrate de que eliminamos este token porque es la página posterior
del pago exitoso. Ahora da clic en pagar con papel. Aquí nuevamente obtenemos la cuenta anterior porque
hemos iniciado sesión con ella. Entonces, para eliminar esta cuenta, damos clic aquí en este ícono de JD Ver en la parte inferior, obtenemos Cerrar sesión. Haga clic en eso. Ahora, da clic en este
cambio de correo electrónico de usuario y pega aquí este
nuevo correo electrónico de cuenta. Ahora de vuelta a deskbard, copia la contraseña y
pégala aquí e inicia sesión con ella. Bueno. Ahora, vea aquí en la parte superior, me sale el monto en orden, pero aquí desde mi cuenta, puedo pagar en
moneda canadiense, que es CAD. Además, obtenemos métodos de
pago limitados, y vea aquí obtenemos la tasa de conversación de la
gente un CAD equivale a 0.6 9549 USD Aquí, la gente a sus tarifas de
transacción, pero podemos pagar en la moneda de nuestro
país. Sigamos revisando el orden. Ver, aquí conseguimos
pagos exitosos. Y si revisamos nuestras notificaciones
de sandbox, busca aquí la cuenta
comercial Puede tomar poco tiempo, y aquí obtenemos
otro pago de $10. En la parte inferior, como podemos ver, obtenemos la ubicación de Canadá. Además, esta cuenta comercial
obtiene su pago en el USD, incluso el cliente paga
en otra moneda. Ese cliente necesita pagar
la tarifa de transacción papal. Entonces como sabemos, nuestro
pago está funcionando. Ahora podemos mejorar nuestras APIs
y hacerla realista. Es realmente simple.
Déjame mostrarte. Entonces lo que queremos
cambiar en la API de orden, por lo que actualmente estamos pasando cantidad
estática aquí,
pero eso no es correcto. Tenemos que pasar el precio total
de la tarjeta del usuario. Así que vamos a conseguir este precio
total de la tarjeta. Entonces antes de esto obtener
token de acceso, escribimos costo, carrito es igual a un peso, carrito Asegúrate de ingresar esta
tarjeta modelo punto Fino uno. Y aquí en el objeto, pasamos usuario para solicitar punto
usuario punto guión bajo ID Y también, para este ID de usuario, necesitamos agregar Osmidalware Asegúrate de ingresar
esto también. Esto devolverá el objeto de la tarjeta, pero tenemos que
pasar su condición si el carrito no está disponible o la
longitud del punto de los productos de la tarjeta es igual a cero, entonces devolvemos la respuesta con código de
estado 404 punto Json Object, message property
to cart not found. Ahora en el lugar de esta cantidad, tenemos que pasar tarjeta
punto precio total de la tarjeta. Y aquí no
cambiamos la moneda porque queremos obtener el
pago en el USD. Si quieres recibir el pago
en otra moneda, entonces puedes pasar
ese código de moneda
en este código de moneda. Pero hay que verificar que la moneda
sea aceptada por papel o no. Por ahora, probemos esto. Guarda los cambios y ve a Paper tasting dot sdmlfle déjame explicarte este
código Entonces aquí pasamos el token JWT
para lo cual agregamos producto. Actualmente, en nuestra aplicación, establecemos solo 2 horas de caducidad, lo cual es un poco molesto
para la degustación porque aquí tenemos que crear el
token JWT una y otra vez Para que podamos eliminar el
vencimiento del inicio de sesión y simplemente agregar caducidad en la etapa
final del proyecto. Entonces en las rutas de usuario
y en la parte inferior, eliminamos este objeto
con propiedad caducada. Ahora vamos a generar un nuevo
token que nunca caduque. Abra Bostman y abra la API de inicio de sesión y simplemente envíe la solicitud Bueno. Aquí copiamos este
token en el archivo SDML, simplemente lo
pegamos aquí Además, puedes pasar aquí
tu dirección de envío. Ahora, después de eso, aquí agregué este evento on click
para este botón de pago. En eso, antes que nada, llamamos a nuestra API de pedidos usando el método
fetch y
con este token Y como sabemos por
la API del pedido, obtendremos la URL de aprobación. Entonces lo conseguimos aquí. Si esos datos no tienen éxito, entonces mostramos alerta con
error en la creación del orden. ¿Qué pasa si obtenemos la URL de aprobación con éxito desde el back end? Después redireccionaremos al
usuario a esa página. Ahora el usuario ingresa
la información correcta y el pago se realiza con éxito. Ahora la gente pasa token
en los parámetros de URL, que es nuestro ID de pedido. Entonces después de un pago exitoso, obtenemos el token en
los parámetros de URL. Después de eso, llamamos a nuestra segunda API para
capturar el pago. Y si ese pago
capta con éxito, entonces desde el back-end,
pasamos estado en la respuesta. Aquí comprobamos que el
estado está terminado, después mostramos
alerta de éxito y si falla, entonces mostramos
error fallido, simple como eso. Ahora, simplemente probemos
nuestra implementación. Estoy muy entusiasmado con ello. Guarde este archivo y
ahora actualice la página, y volvamos a hacer clic
en el botón de pago. Obtenemos error en la creación del orden
si revisamos la consola. Ver, aquí obtenemos error. Se trata de 400 errores, lo que significa que no se encuentra el carrito. O, recuerde, en la lección de
quitar carrito, retiramos la tarjeta eliminando los últimos productos de
la matriz de productos. Tenemos que agregar un
producto en nuestra tarjeta, ir a Cartero abrir
cabeza a carrito API Aquí, tenemos que actualizar el token, copiarlo de la API de inicio de sesión y simplemente pegarlo en
el encabezado de autorización. Bueno. Ahora vamos
a enviar la solicitud. C, productos añadidos. Es iPhone, bonito. Ahora refresquemos la página, y nuevamente, probemos el pago. Ver, aquí obtenemos nuestro precio de tarjeta. Encantadora. Ahora aquí simplemente
cancelamos el pago, y pasamos a papel
degustación punto stmlPage Bueno. Ahora vamos a mejorar
nuestro segundo EPI No te preocupes en que no
tenemos que hacer muchas cosas. Simplemente crearemos un nuevo dato de
orden en la base de datos. Retire la tarjeta actual del usuario
si el pago es exitoso. Entonces aquí pasamos condición I pago se
captura con éxito, así que los datos de punto de respuesta estado punto, que obtenemos de
esta API de captura, si el pago es igual
a completado, escribimos código aquí
en el bloque I. Entonces aquí creamos costo. El nuevo orden es igual al nuevo orden. Asegúrese de que ingresamos
este modelo de pedido. Bueno. Ahora tenemos que pasar objeto
nuevo orden aquí. Así que antes que nada, en este orden, agregamos usuario para solicitar punto
usuario punto guión bajo ID Pero aquí para obtener los datos
del usuario, tenemos que adde o
middleware Bueno Ahora, después de eso,
necesitamos productos, y en eso almacenaremos
todos los productos que ordenemos. ¿Y cómo podemos obtener
esa información? Bien, lo conseguimos
de la parte de atrás. Entonces antes de este pedido,
encontramos const, Tarjeta es igual a esperar
carrito punto encontrar uno Y aquí en el objeto, pasamos condición usuario para solicitar punto usuario
punto guión bajo ID Simplemente en los productos del pedido, pasamos productos cart dot. Después de eso, los productos totales
al carrito puntean productos totales. A continuación, tenemos precio total, al carrito punto precio total del carrito. A continuación tenemos la dirección de envío, que necesitamos obtener
del front end. Por ahora, déjalo como está. A continuación, agregamos
estado de pago a pago, ID de
pago a los datos de
punto de respuesta ID de punto. Y si quieres guardar
alguna información extra, entonces puedes evaluar a
que realmente depende de ti. Además, si quieres
agregar un nuevo campo, entonces tienes que agregar ese
campo en nuestro esquema de pedidos. Por ahora, pasamos toda la
información que se necesita. Ahora podemos guardar este nuevo pedido, así que espera nuevo pedido dot save y después de guardar el nuevo pedido, podemos eliminar nuestra tarjeta
de la base de datos. Así que espera tarjeta dot Dilto
Aquí ya tenemos tarjeta. Es por eso que
usamos directamente card dot Eliminar uno. Si no llegamos aquí tarjeta, entonces tenemos que usar cart dot Fine one y eliminar
método como este. En la parte inferior,
movemos esta respuesta en este blog y devolvemos
esta respuesta. Esto es realmente importante. Ahora para el lado más seguro, agregamos condición y simplemente devolvemos aquí respuesta
con código de estado, 400 SN Object, estado
propiedad para no completar, y el mensaje al pago
no se captura con éxito. Inténtalo de nuevo más tarde, y eso es todo. Sólo tenemos que pasar dirección de
compresión en este objeto de orden De donde obtenemos
la dirección zipping. Lo conseguimos de la parte delantera. En el cuerpo de solicitud de
API de pedido de captura, podemos obtener dirección de zipping,
segundos dirección de envío
es igual a solicitar cuerpo de punto, dirección de envío de
punto Aquí estamos recibiendo dirección
zipping porque
desde el front-end, ya
pasamos la
dirección zipping en el cuerpo de la solicitud Ver, aquí paso la dirección de
zipping. Ahora, en nuestro pedido, podemos establecer la dirección de envío
a la dirección de compresión. Bueno. Ahora déjame
darte una situación. Imagine que el usuario olvidó pasar
esta dirección de envío. ¿Cómo podemos entregar el
producto a ese usuario? Así que tenemos que asegurarnos de que el usuario
pase la dirección de zipping. Entonces aquí podemos
escribir I condición, dirección de
envío no
está disponible, luego devolvemos respuesta con código de estado 400
para solicitud de apuesta, y en el objeto JSON, pasamos propiedad de Mensaje para por favor proporcione su dirección de
entrega. Ahora aquí hay una cosa. Sabemos que esta API de pago de
captura se ejecutará después de que el usuario
pague con papel. No podemos decir ahora al usuario, no
proporcionan dirección de
envío. Aquí podemos hacer una cosa. También podemos simplemente
poner esta condición
al comienzo de nuestra
primera API antes de cortarnos.
151. Cómo obtener el historial de pedidos: Ahora definamos rápidamente
otras API para los pedidos. Busquemos el
historial de todos los pedidos del usuario actual. Después de esta API papal, agregamos router dot Get y
apuntamos a reenviar slash Además, para encontrar la información del
usuario, agregamos os middleware, y luego usamos la función de devolución de llamada con solicitud Ahora aquí obtenemos directamente const pedidos es
igual a un peso, orden punto encontrar, y aquí
pasamos comparación Object, usuario para solicitar punto
usuario punto subrayado ID Además, necesitamos abreviar
estos datos por fecha. Método de punto corto, y
aquí en el objeto, pasamos creado en dos menos
uno para orden descendente. Aquí de la colección de pedidos, no
queremos mostrar todos los rellenos. Seleccionar punto, menos usuario,
menos dirección de zipping, menos ID de pago,
y al final, podemos enviar respuesta, punto JSN y pasar
aquí estos pedidos Probemos esta API. Entonces en Cartero aquí
en el CardWZPject, creamos una En la carpeta Pedidos, agregamos una nueva solicitud
llamada Historial de pedidos. Ahora punto final a SCTP, Columna doble para nuestra
slash Host Local, Columna 3,000 API slash
Ordenar y enviar Lo sentimos, olvidamos
pasar el token JWT. Así que ve a encabezados. Primero, pasamos
autorización al portador, y aquí pasamos token. Entonces volvemos a iniciar sesión. Aquí obtenemos token,
copiamos este token y lo
pegamos en esta API
y enviamos la solicitud. Ver, aquí obtenemos los
datos de los pedidos encantadores. Ahora en la siguiente
lección, definiremos nuestra última API para este proyecto.
152. Actualizar el estado por el administrador: Vamos a crear API para admin. Mediante esta API, él o ella puede cambiar el
estado del pedido a procesamiento, C entregado o
lo que quieran. Así router punto página porque
queremos cambiar sólo una
propiedad, no todo el documento, y señalar a la
orden de corte D estado aquí
también necesitamos el ID de orden, por lo que pasamos Columna ID de orden Entonces agregamos middleware Os
para token JWT. Y aquí también necesitamos
verificar la regla de usuario. ¿Es admin o no? Entonces agregamos aquí la regla Jack, middleware, la
entrada automática C no funcionó Y dentro de esto, tenemos que
pasar rol, que es admin. Ahora en la parte superior, vamos a
introducir este middleware. Const, check role es igual a requerir que vayamos una carpeta arriba,
middleware, y en
ese Ya usamos esto en
la ruta de productos. Si lo olvidaste, entonces
puedes ver el código de ruta. Ahora simplemente pasamos función
acing con
solicitud y respuesta. Genial. Ahora primero, obtenemos el pedido de la colección de
pedidos. Secctudado orden es igual a
esperar orden punto encontrar Por ID. Además, en lugar de esto, podemos usar bien
por ID y actualizar. Aquí en el primer argumento, tenemos que pasar el ID de orden, que es request dot
params dot order ID Y en el segundo argumento, pasamos el objeto
de valores actualizados. Entonces Estado de orden de objetos a
cualquier valor en el pase medio. Y ¿cómo podemos obtener ese valor directamente del órgano de solicitud? Aquí antes del pedido actualizado, teníamos estado de costo es igual a solicitar cuerpo de punto, estado de punto. Y aquí pasamos el
estado de la orden al estado. Y después de eso, en
el tercer argumento, pasamos objeto con nuevo a verdadero. Le dirá a los mangos que devuelvan nuevos datos actualizados en
este valor de orden Ya lo vimos en
la sección Mongo DB. Ahora podría ser posible
que no encontráramos orden. Actualicé el pedido
no está disponibleetiqueta, entonces devolvemos respuesta, estado de
punto 404 punto Json Object, propiedad de
mensaje para
ordenar no encontrado Por fin, simplemente pasamos
response dot json, Object, message property to order
status updated successfully, and after that, updated
order to updated order. O también podemos quitar
eso y hecho. Si quieres cambiar algo, entonces puedes hacer esos cambios de
acuerdo a tus necesidades. Probemos esta API,
abramos Postman, agreguemos una nueva solicitud en la colección de pedidos
llamada actualizar estado del pedido, seleccionar solicitud a página, punto final para cortar API, También seleccione página, estado del pedido, y aquí agregamos el ID de pedido. De la llamada API anterior, simplemente copio este ID de pedido
y lo
pego en el punto final. Ahora en nuestra API, pasamos el
encabezado a autorización, y también copiamos el valor de la API anterior
y lo pegamos aquí. Enviar la solicitud.
Aquí, me sale error. Déjame revisar la terminal. Sé comprobar error de rol. Entonces en la parte superior, tengo error tipográfico, así que cambio esto para verificar rol Los cambios y
enviar la solicitud. Ver, aquí obtenemos 403 error
prohibido, acceso denegado Admin solamente. Tenemos que cambiar la
regla de usuario para esta cuenta. Ve a MongoivCompass, abre la colección del usuario y encuentra tu cuenta por la
que ingresaste Menos esto, simplemente cambio
la regla para que admin la actualice. Ahora necesitamos volver a generar
el token web JSN. Vaya a iniciar sesión y
envíe la solicitud, copie este token y reemplace nuestro token
con este nuevo token. Ahora en body raw, también
necesitamos pasar Objeto
JSON con estado de
campo a IB
y enviar la solicitud. Ver, aquí obtenemos mensaje de éxito y también datos de
pedidos actualizados. Encantadora.
153. Limpieza del código para el archivo índice: Por lo que actualmente nuestra
aplicación está limpia. Simplemente se equivoque con
el archivo JS de punto índice. Podemos ver que esto
no se ve limpio. En la parte superior, muchos, muchos requieren
funciones para la entrada. Después de eso, tenemos código para crear registradores y controladores de errores
globales Después de eso,
tenemos conexión a MongoDB luego aplicamos algunos
middlewares y algunas rutas,
y por fin
escuchamos nuestro servidor Están sucediendo muchas cosas
en este archivo de puntos de índice. Podemos hacerlo limpio y almacenar cada lógica en
el archivo separado. No es obligatorio, pero
muchos desarrolladores hacen eso, pero eso puede confundirte Entonces hay otra manera que es en lugar de
separar el código, podemos hacerlo limpio agregando comandos y
separándolos entre sí. Puede elegir de todos modos, depende
totalmente de ti. Déjame mostrarte mi camino. En la parte superior, tenemos algunos config, así que adhiérase, comando
global config. Después de eso,
tenemos este Express,
Mangoose, Winston, y Addre comando, módulos de
terceros. Que tenemos esta app. No queremos tocarlo ahora. En la parte superior, sumamos
todos nuestros insumos. Algunas de estas todas las importaciones de ruta sobre esta app y adde comentario, módulos
personalizados, o
puedes decir módulo rutas No hay reglas
para el comentario. Puedes escribir el comentario, como
quieras llamar. Solo ten en cuenta que este comentario será visto por
ti en el futuro. Entonces en ese momento,
no te confundes. Ahora, después de eso,
podemos agregar comando para esta app, inicializar
express Ahora aquí tenemos este logger
y también en la parte inferior, tenemos este puerto, así podemos moverlo aquí y
podemos llamarlo constante. Después de eso, para esta
excepción no capturada, agregamos catch, unhandle errores sincrónicos que no
fueron capturados en los bloques
try catch Para el rechazo no manejado,
agregamos los rechazos catch
unhandlepMise Por estos comentarios,
podemos recordar por qué agregamos el código incluso
después del largo tiempo Después de eso, aquí tenemos conexión a
base de datos. Entonces tenemos estos dos
middlewares, entonces middleware,
luego para archivos estáticos, agregamos serve archivos estáticos agregamos Después para las rutas,
agregamos rutas API. Después de eso, tenemos el middleware de
error, así que agregamos el manejador de errores personalizado, y por fin iniciamos el servidor Ahora bien, si revisamos nuestro archivo
index dot js, mira, ahora se ve un
poco más limpio. Sí, la separación del código
hará que esto sea más limpio, pero puede confundirnos también. También puedes separar el código. Yo depende totalmente de ti. Así que aquí, nuestro
proyecto de comercio electrónico ha terminado. Ahora, a partir de la siguiente sección, saltaremos sobre
nuestro proyecto tres, que es la aplicación de
redes sociales.
154. Sección 13: introducción al proyecto 03: Bienvenido a la nueva sección
del curso Node JS definitivo. A partir de esta sección,
vamos a construir un proyecto completamente nuevo.
¿Puedes adivinar? Sí, vamos a construir aplicaciones de redes
sociales
back end usando NodeJS Llamaremos a este
proyecto nuestro Linky Pi. Este proyecto es uno de
mis proyectos favoritos. Déjame explicarte qué
vamos a cubrir en este proyecto. En este proyecto, crearemos API para seguidores siguientes, incluyendo el envío de solicitudes
a cuentas privadas, envío de correo electrónico desde
nuestra aplicación. Además, crearemos APIs para publicar con me gusta y comentarios. Después crearemos
API para chat, chat
personal y chat grupal. Además, aplicaremos
experiencias de chat en tiempo
real con socket
y muchas cosas más. Si realmente entiendes
y construyes este proyecto, entonces tu cartera realmente
mejorará. Esto va a ser
divertido. ¿Estás emocionado? Estoy muy emocionada
y espero que tú también. Entonces comencemos a construir
este increíble proyecto.
155. Configuración del proyecto 03: Ahora vamos a montar
nuestro nuevo proyecto. Entonces en la carpeta de proyectos, creo una nueva carpeta
llamada nuestro Linky File Ahora, vamos a abrir esta
carpeta en el código VS. Bueno. En el terminal, escribimos NPM en Y para la inicialización y para
crear el paquete Además, vamos a crear el archivo de perros
índice, que es nuestro archivo principal. Ahora, como sabemos, configuraremos nuestra aplicación en este archivo. Y para eso,
necesitamos algunos paquetes. Entonces en la terminal,
escribimos NPM, install,
Express, Mongos para Mongo DB, cours para Además, agregamos Dt NV, necesitamos eso y golpeamos Enter. Tomará algún
tiempo. Bueno. Ahora, configuremos
rápidamente nuestra aplicación. En primer lugar, Const Express es igual a requerir de Express Después de eso, st app es igual a, aquí llamamos Express
para escuchar esta app, agregamos aquí punto LISN Aquí en el primer argumento, tenemos que pasar el puerto. Después de const app, definimos
otro puerto const es igual a procesar nw dot port o 3,000
o 5,000, lo que quieras En la producción,
nuestra aplicación tomará puerto de
la variable de puerto ENV En el segundo argumento,
tenemos que pasar la función de devolución de llamada que
simplemente consola dot log En tis, el servidor se está
ejecutando en el puerto, y aquí imprimimos nuestro port
dollar calibracets Además, tenemos que agregar
algunos productos intermedios de aplicaciones. En el curso superior es
igual a requerir curso. Y aquí agregamos app punto g, simplemente llama aquí curso. Y después de eso, para
pasar datos en JSON, usamos app.us, express dot JSON Sin este
middleware, no podemos obtener datos en la
solicitud del cuerpo Ahora veamos esta
implementación. Ver los cambios y
en el terminal, nodemon index dot js C, el servidor se está ejecutando. Genial. Ahora conectemos también esta aplicación
con base de datos. Para eso, necesitamos mangos. Entonces en la parte superior, costo mangos es igual a requerir de mangosta Ahora, después de esta variable, agregamos Mongoose dot connect Aquí, tenemos que pasar la cadena de conexión
de nuestra base de datos. Anteriormente,
pasamos directamente la cuerda aquí, pero eso es poco arriesgado. Hagamos esto seguro. En nuestro proyecto, creamos
un nuevo archivo llamado punto ENV. En este archivo, creamos
una nueva variable llamada
DVes igual do, Mongo DB, columna,
double for slash, host local,
columna 27017, columna 27017, que es nuestra cadena de conexión local
Mongo Se puede obtener eso
del Mongo Divi Compass,
y después de eso, hacia adelante menos Y aquí ingresamos nuestro nombre de
proyecto, nuestro Slinky Pi. Ahora para usar esta variable de
entorno, necesitamos configurar D E y
V. Así que en el archivo índice Gs, en la parte superior, requerimos
punto Env dot config En el
método mangos dot Connect, ¿qué pasaremos? Correcto, pasamos proceso
punto w punto d.
podemos ver lo sencillo que se vuelve
esto después solo crear una o
dos aplicaciones de nodo. Esto va a mejorar
poco a poco y
te vas a poner más
cómodo con nodo. Ahora, como sabemos, este mangos dot connect
devuelve una promesa, así que tenemos
que manejar esa promesa Dot entonces método, función de devolución de
llamada, y aquí simplemente
consultamos dot log, Mango Div conectado
con éxito. También después del método entonces, agregamos el método catch para
manejar el rechazo de promesa, y aquí obtenemos error, función de
error, y
nos consola dot log, conexión
Mongo Di falló y simplemente adherimos este error Comprobemos también
esta implementación. Guarde este archivo, y
en la terminal,
vea, aquí conseguimos que Mongo Di
B se conecte con éxito Por ahora, esto está bien. Añadiremos Winston y Lager
al final de este
proyecto ya que los necesitamos Ahora en la siguiente lección, crearemos nuestro modelo de usuario.
156. Crear modelo de usuario: Ahora es tiempo de ejercicio. Entonces esta es la pequeña
muestra de documento de usuario. En base a estos, hay que
crear un esquema de usuario. También puedes ver el código del proyecto
anterior. No te preocupes por eso. Así que dedique algo de tiempo y
complete este ejercicio. Y después de eso,
mira la solución. Ahora veamos la solución. Entonces en nuestro proyecto, creamos
una nueva carpeta llamada models, y en eso,
creamos un nuevo archivo llamado users dot js. Bueno. Ahora, antes que nada,
importamos costo, mangos es igual a
requerir de mangos Y después de eso, definimos const, el esquema de usuario es igual al nuevo esquema de punto de mangos y aquí pasamos el
esquema en el objeto Ahora, antes que nada, para
nuestra aplicación de redes sociales, necesitamos nombre de usuario para objetar, escribir, para cadena
requerida, a true. Además, no queremos
espacios en blanco en el nombre de usuario. Entonces para eso, pasamos
stream a true. También significa longitud a tres, y longitud máxima, digamos 30 o 40, lo que
quieras tomar. Después del nombre de usuario, agregamos correo electrónico
al objeto, tipo a cadena, requerido a verdadero,
único a verdadero, soñamos con verdadero porque no
necesitamos espacio en el correo electrónico también. Y siempre convertimos
nuestro correo electrónico a minúsculas, así que minúsculas a verdadero también Después de eso, necesitamos
contraseña para objetar, escribir a cadena, y
requerido para true. También queremos almacenar algunos detalles de
perfil del usuario, y estos datos el usuario puede agregar desde la configuración como Instagram. No debe ser obligatorio. Entonces podemos obtener un nombre de
perfil simple, que es tipo a cadena, y no necesitamos que sea único y tampoco lo
necesitamos obligatorio, así que no agregamos aquí
ningún validador. Ahora bio a objeto,
escriba a cadena. Y longitud máxima a 150. A continuación, agregamos cuentas, estado, tipo a cadena, um, a matriz. Aquí, pasamos valores, active, next, desactive y bend. Establecimos el valor predeterminado en activo. A continuación, lo que podemos agregar, se verifica para objetar, escribir a bullian y valor
predeterminado a false También, después de eso,
agregamos es private, object, type to bullian
y default to false A continuación, el usuario puede agregar el
tipo de género a la cadena, um a la matriz, y aquí pasamos masculino, femenino, no binario, o el usuario puede
decir prefiero no decir. A continuación, también tomamos el número de
teléfono para objetar, escribir a cadena porque el usuario
puede agregar código de país en este. Y aquí también recortamos a verdad. Ahora lo que podemos añadir, creo que
esto es suficiente por ahora. Si en el futuro,
necesitamos más detalles, entonces podemos agregar más
campos en el futuro. Aquí tenemos nuestro esquema. Ahora vamos a crear modelos de usuarios. Así costo usuario es igual
al modelo punto Mongos. Aquí, pasamos
nombre singular, que es usuario. Y segundo, pasamos el esquema, que es el esquema de usuario. Ahora, para interactuar con
este modelo de usuario, necesitamos exportar este. Por lo tanto, las exportaciones de módulos
son iguales a usuario y hechas. Ahora en la siguiente
lección, crearemos API para registrar un nuevo usuario.
157. Registrar un nuevo usuario: Vamos a crear nuestro primer
EPI para esta aplicación. Aquí, creamos una nueva
carpeta llamada Routes, y dentro de esta carpeta, creamos un nuevo archivo
llamado users dot js. Bueno. Ahora, antes que nada, necesitamos crear Router. Importamos Express es
igual a requerir Express, y después de eso, costo Router es igual a express dot Router. Al final, simplemente el módulo exportaciones de
punto es igual a Router. Ahora agreguemos esta ruta en
nuestro archivo principal index dot js. Después de estas entradas, ingresamos rutas de usuario de
costo es
igual a requerir. Aquí vamos a Routes
folder slash users. Ahora, después de los middlewares, agregamos app dot U. Aquí en la primera posición, agregamos prefijo para esa ruta Así que slash usuario de la API. Y aquí simplemente
agregamos rutas de usuario. Ahora vamos a crear API de registro. Así que de vuelta al archivo de ruta de los usuarios. Aquí agregamos Router punto post
y punto para reenviar slash, y luego función de devolución de llamada asincrónica con solicitud Ahora, antes que nada,
necesitamos obtener rellenos de la
solicitud del cuerpo. Pero la pregunta es, que llena necesitamos para registrar
un nuevo usuario. Entonces, para
las aplicaciones de redes sociales, las empresas en su mayoría
toman datos mínimos para registrar un nuevo usuario. Porque si tomamos diez a 15 rellenos como primer
paso del proceso, entonces no mucha gente creará una cuenta en nuestra aplicación de
redes sociales. Entonces es mejor que solo tomemos esos datos que se
requieren para nuestro esquema. Además, el usuario puede
rellenar fácilmente esos datos, y es por eso que si te das cuenta, casi todas las
aplicaciones de redes sociales solo toman nombre, ID de
correo electrónico del
usuario y contraseña. Sólo estos rellenos. Toman otros rellenos más tarde de
la configuración del usuario. Es por eso que abrir una cuenta en aplicaciones
de redes
sociales es realmente sencillo. Aquí tomaremos solo
tres rellenos del usuario. El objeto de costo es igual
a solicitar el cuerpo del punto, y aquí obtenemos el
nombre de usuario, correo electrónico y contraseña. Ahora bien, si no
obtenemos estos rellenos, entonces devolvemos error. Así que el nombre de usuario no es válido
o el correo electrónico no está disponible, o la contraseña no está disponible, luego devolvemos respuesta
con estado 400 y pasamos objeto
Json con mensaje de error faltantes campos de formulario requeridos. Después de eso, también
pasamos el éxito a las caídas. Este campo de éxito ayudará al
front-end a mostrar errores. Ahora, también, aquí encontramos usuario ya
está disponible en
nuestra base de datos o no. El usuario de Const es igual a un peso. Aquí agregamos modelo de usuario, C, auto Input works dot
Fine one Object. Y aquí necesitamos dólar
u operador para matriz, y aquí pasamos múltiples
condiciones en objetos separados. Entonces nuestra primera condición
es nombre de usuario a nombre de usuario, y segundo, correo electrónico a correo electrónico. Si alguna de esta
condición es cierta, entonces obtenemos a ese usuario. Entonces aquí pasamos condición. Si el usuario está disponible, luego devolvemos la respuesta con código de
estado
400 punto Json objeto mensaje a aquí pasamos condición. El nombre de usuario del punto de usuario es
igual a nuestro nombre de usuario. Si esto es cierto, el signo de interrogación, usuario ya está tomado, lo contrario el correo electrónico
ya está registrado. Y después de eso,
pasamos el éxito a las caídas. Ahora, si el usuario no está
ya registrado, entonces simplemente
creamos un nuevo usuario. Entonces costo nuevo usuario es
igual a nuevo usuario. Aquí pasamos objeto de usuario, nombre de
usuario a usuario, o simplemente podemos eliminar este correo electrónico a correo electrónico y
contraseña a contraseña. Ahora, como sabemos, no pasamos aquí contraseña en texto normal, necesitamos cifrarla Y para eso, qué paquete
usamos, trata de recordarlo. Sí, es cripta. Entonces NPM instala,
cripta y presiona Enter. Bueno, minimizar la terminal, y en nuestro
archivo de rutas en la parte superior, const, crypt es igual
a requerir cripta Ahora en nuestra API, creamos Cost het pass
es igual a esperar, creamos punto s. y aquí
en el primer argumento, tenemos que pasar nuestra contraseña, y en el segundo argumento, pasamos el
número salt, que es diez. Ahora podemos simplemente establecer
contraseña a st contraseña. Y después de esto, simplemente
podemos esperar nuevo usuario punto c. ¿Qué queremos hacer
después de crear nuevo usuario? Bien, generamos
token JWT para ese usuario, y para eso, necesitamos el paquete de token web
JSN Entonces NPM instala el token web JSON, a la tasa 9.0
0.2, y presiona Enter Bueno. Ahora minimice
este terminal, e ingresemos este token
web JSN en la parte superior Sacst JWT es igual a
requerir btgon JSN. Ahora, como hicimos anteriormente, creamos función para
generar JSN WebTGon porque también
necesitamos que en nuestra API de inicio de
sesión SACSTGenerate, token es igual a aquí obtenemos datos como función de error de
parámetro Y en esto, simplemente
devolvemos el signo de punto JWT. Al principio, pasamos los datos, y después de eso, necesitamos
pasar la clave secreta JWTs Así proceso punto nw punto
JWT subrayado clave. Ahora necesitamos agregar esta
variable clave en nuestro archivo ENV. clave de subrayado JWT
es igual a aquí, podemos pasar cualquier clave
que sea segura Por ejemplo, la clave de seguridad JWT. No utilices esto para la producción. Lo paso al azar. Tienes que crear
tu propia clave de seguridad. Además, aquí no
agrego caducidad para
nuestro token porque para la aplicación de redes
sociales, la caducidad del
token no es buena. Los usuarios quieren
acceder rápidamente a nuestro sitio web. Además, imagina que visitas Instagram todos los días y todos los
días, tienes que iniciar sesión. En caso de que usaras esa
app durante mucho tiempo, no. Entonces, como desarrollador, tenemos que pensar siempre desde la perspectiva del
usuario. Ahora, en nuestra ruta API callback, simplemente const token es
igual a generar Aquí en la parte inferior, elimino Typo de
mi nombre de función Ahora en nuestra función generar
token, tenemos que pasar los datos del usuario que queremos agregar en
nuestra carga de pago de token. Así Objeto, subrayado ID a
nuevo usuario punto subrayado ID, y nombre de usuario a
newser dot nombre Y al final, simplemente devolvemos estado del punto de
respuesta a 01 para la creación de
nuevos datos punto GSN, y pasamos directamente este token Ahora, probemos esta API. Entonces abre Cartero. Aquí creamos una nueva colección, creamos colección en blanco para nuestro nuevo proyecto
llamado Our Linky Fi Y en esta carpeta, agregamos una nueva carpeta
llamada users, y en esta carpeta,
agregamos una nueva solicitud, llamada register, un nuevo usuario. Bueno. Ahora solicite el tipo para publicar, y señale a SDDP, Columna doble
slash host local, Columna 3,000 slash
API slash user Y enviar la solicitud.
Ver, aquí obtenemos error, 500 no pueden desestructurar los rellenos
faltantes Pasemos todos los
rellenos de formularios que sean necesarios. Selecciona body, raw, y aquí
pasamos nuestro Objeto JSON. Nombre de usuario para codificar,
subrayado, bendecir. Por cierto, este es mi nombre de
usuario de Instagram. Siguiente correo electrónico a código en
el gmail.com rojo. Y por último, enviamos la contraseña 212-34-5678 y Ver, aquí obtenemos
token como respuesta. Y si revisamos nuestra base de datos, aquí obtenemos nuestra base de datos
linkifed, y en la colección del usuario, vea, aquí obtenemos
también nuevos datos de usuario Además, conseguimos que el estado de la cuenta esté
activo es verificado y es
privado, ambos son falsos. Establecemos todos estos valores como
predeterminados en nuestro esquema de usuarios. Además, aquí olvidé
agregar unique a true para este nombre de usuario
porque aquí queremos que este nombre de usuario sea único
para todos nuestros usuarios.
158. Ejercicio: API de inicio de sesión del usuario: Ahora hagamos otro ejercicio. En este ejercicio, se tiene que
crear una API de inicio de sesión, que verificará el nombre de usuario
y la contraseña del usuario. Ya lo hicimos en
nuestro proyecto anterior, pero quiero
que lo hagas por tu cuenta. Puedes ver este código de contraseña de
verificación, pero el resto de la API, tienes que crear por tu cuenta. Sé que puedes hacer eso, así que completa este ejercicio, y luego cuál es la solución.
159. Solución: API de inicio de sesión del usuario: Espero que completes el ejercicio
o intentes resolverlo. Ahora veamos la solución. Entonces Enrutador, punto de publicación, y punto para reducir el inicio de sesión Y aquí pasamos función
asíncrona con
solicitud y respuesta Ahora, antes que nada, en
esta función de devolución de llamada, obtenemos los datos del cuerpo
de la solicitud Por lo tanto, el objeto costo es igual
a solicitar el cuerpo del punto. Y aquí llegamos a
nombre de usuario y contraseña. Ahora podemos pasar
condición si el nombre de usuario
no está disponible o la contraseña no
está disponible, entonces devolvemos error. Entonces devuelve respuesta,
estado, 400 Json. Aquí pasamos Object
success a false y message para por favor proporcionar
nombre de usuario y contraseña. Ahora después de eso, encontraremos al usuario con este nombre de usuario. Costo usuario es igual a
esperar usuario punto Fine one. Aquí en el objeto, pasamos nombre de usuario a nombre de usuario, o también podemos eliminar este. Ahora es posible que no
encontremos ningún usuario con el nombre de usuario
dado. Si el usuario no está disponible, entonces devolvemos el estado del punto de
respuesta, objeto Json de
400 puntos con éxito a false y el mensaje
a las credenciales no válidas. Ahora si encontramos al usuario, entonces necesitamos comparar la
contraseña usando Biblioteca BCRP Segundo, contraseña válida
es igual a esperar, B crypt punto comparar. Primero, pasamos contraseña de entrada, que son front ensend
en el cuerpo de la solicitud, y en el segundo argumento, pasamos contraseña de punto de usuario Simplemente pasamos aquí
otra condición que la contraseña válida es
falsa o no está disponible, luego devolvemos el código de estado del
punto de respuesta 401, que significa token de autenticación inválido o
faltante. Además, enviamos
objeto Json con éxito a false y message a credenciales
inválidas. Aquí, si especificamos
contraseña no coincidente, entonces significa que encontramos usuario y simplemente contraseña
no coincide. Además, aquí creo que
tenemos que pasar el mismo código de estado
para usuario no encontrado. Cambia este 400 con 401 y el mensaje también es credenciales
inválidas. Ahora, si se verifica la contraseña, entonces podemos generar token fresco y enviarlo en la respuesta. Entonces const token es igual
a generar token. Aquí pasamos el objeto de datos con subrayado al ID de subrayado de
punto de usuario, y el nombre de usuario al nombre de
usuario de punto de usuario Al último punto de respuesta Json
enviar este token. Eso es. Ahora probemos esta API. En el cartero, creamos una nueva solicitud llamada
Login a user Aquí seleccionamos el método SDTP
para publicar endpoint a SDTP, Column double for or slash, host
local, Column
3,000, slash API, slash user
slash login, user
slash login Column double for or slash, host
local, Column
3,000, slash API, slash user
slash login, y enviamos la solicitud. Ver, aquí obtenemos error, no se puede desestructurar
propiedad nombre de usuario Entonces aquí tenemos que
pasar datos en cuerpo. Selecciona cuerpo, crudo, aquí
pasamos objeto con
username a code, bless y password al 12345678
y mandamos Ver, aquí nos sale el mensaje, credenciales
inválidas
porque paso un nombre de usuario incorrecto. Cambio mi nombre de usuario a código
original subrayado bendecir, y enviar la solicitud Mira, aquí obtenemos el token, lo que significa que nuestra API
está funcionando bien.
160. Implementar token de acceso y actualizar token [ACTUALIZACIÓN]: Ahora como hemos visto en nuestro proyecto anterior sobre el
registro y el inicio de sesión, volvemos a tokens, 14 token de acceso, que es
sort leaf o caducidad SOT, y otro es refresh token, que es long leaf o
long expire token. En resumen, cuando el
token de acceso caduca, front-end envía la solicitud a
algún punto final como reprimir En la reprensa verificamos
el token de actualización, y luego devolvemos
un nuevo token de acceso Esta es la lógica. Ahora vamos a implementar esto
rápidamente
en nuestro tercer proyecto. Entonces en la parte inferior, tenemos
generar función token. Podemos renombrar esto
para generar tokens. Ahora tenemos que volver a fichas
a partir de aquí. Entonces almacenamos este primer token en la variable llamada token de
exceso, y luego aquí lo configuramos caduca en propiedad
para digamos 1 hora. En producción, podemos agregar el exceso de caducidad de token
a tres o 4 horas. Pero
para probar fácilmente esta aplicación, no
estoy configurando el
tiempo de caducidad para el exceso de token. De nuevo, te lo estoy diciendo solo
para las pruebas, así que no necesitamos generar otro exceso de token
nuestras próximas APIs. Ahora duplicar esta línea, cambiarla variable
para refrescar token, ta, la cambiamos a objeto, subrayamos ID a datos
punto subrayado Y aquí agregamos escena de caducidad a 30 días porque esta es una aplicación de
redes sociales por fin, simplemente
volvemos un objeto con acceso y token de actualización. Además, establecemos
diferentes claves secretas para token de acceso
y token de actualización. No es necesario, pero
es mejor que lo hagamos. Pt NV en el
lugar de la clave JWT, agregamos token de acceso, clave y después de eso, definimos otra variable, reprimimos token, key es
igual a nuestra clave secreta Guarde esto y vuelva a
nuestro archivo de salida de usuario. Aquí, cambiamos la
clave secreta para acceder a la clave de token. Y para el token de actualización, lo
cambiamos para
refrescar la clave de token. Ahora en la API de inicio de sesión, cambie el
nombre de esta función para generar tokens. En el lugar de obtener token, obtenemos object y desestructuramos el exceso de token y refrescamos
token de esta función Bueno. Ahora aquí estamos un
exceso de token en la respuesta. Además, ¿
me puede decir qué tenemos que
hacer antes de enviar el
token sobrante en la respuesta? Derecha. Tenemos que almacenar token de
actualización en la colección del
usuario, y luego vender token de actualización
en la cookie SDTP solamente Entonces aquí esperamos
Bcrt punto s. aquí, pasamos token de actualización, coma pasamos aquí sal a diez Esta expresión devuelve el token. Entonces lo almacenamos en variable
llamada Nu he repres token. Después de eso, el token de
represión de punto de usuario es igual a New has repress Entonces tenemos que esperar al usuario punto
C. Ahora solo tenemos que configurar token de
actualización en la
cookie para recordar cómo usamos response dot Cookie. Aquí, pasamos el nombre de la cookie, que es token de actualización. Aquí agregamos token de actualización
y en el tercer parámetro, necesitamos pasar objeto de
configuración. Aquí, la primera propiedad
es solo SDDP, que establecemos en true, secure a false, pero
asegúrate de que para la producción,
tú la haces verdad Mismo sitio para rayar
para el mismo dominio, pero actualmente, lo
configuramos en ninguno, y por fin, podemos pasar mensaje a 30
días en 24 horas en 60 minutos en 60 segundos
en 1,000
milisegundos y Ahora tenemos que simplemente copiar esta lógica desde la
generación de token hasta enviar respuesta y
pegarla aquí en esta API. Y aquí, tenemos que cambiar solo ID de subrayado de punto de usuario
a ID de subrayado de punto de usuario
nuevo, nombre de usuario de punto de nuevo usuario, token de actualización de
punto, y
también Nwuser dot Por fin en la respuesta, también
agregamos estatus a 201.
161. Ruta de actualización y cierre de sesión [ACTUALIZACIÓN]: Ahora, vamos a crear
ruta para refrescar, así que Route dot post slash refresh y aquí agregamos función de devolución de llamada
ASN con
solicitud Ahora, antes que nada, necesitamos
obtener el token de actualización
de la Cookie. Entonces const user refresh
token es igual a request dot Cookie,
dot refresh token Aquí no obtenemos esta cookie porque en
nuestro middleware Express, no ddt Cookie parser
middleware, y para eso, necesitamos
paquete Cookie parser, abrir terminal, y aquí escribimos
NPM install Cookies parser
y pulsamos Enter esta cookie porque en
nuestro middleware Express,
no ddt Cookie parser
middleware, y para eso, necesitamos
paquete Cookie parser,
abrir terminal, y aquí escribimos
NPM install Cookies parser
y pulsamos Enter. Bueno. Ahora abre
el archivo index dot gs. En la parte superior, entramos const Cookie parser es igual a
requerir Cookie En la parte inferior, agregamos app
dot g, Cookie parser. Asegúrate de llamar a
esta función aquí. Guarda este archivo y
vuelve a nuestra ruta. Aquí, pasamos condición. Si el token de actualización de usuario no
está disponible, entonces devolvemos el estado del
punto de respuesta 401 punto Json, y aquí pasamos el mensaje. No, se proporciona token de actualización. Después de eso, necesitamos el ID de usuario
que envíe la solicitud de
token de acceso y cómo lo obtendremos del token de actualización,
tenemos
que decodificar
este token de actualización Costo decodificado usuario es igual a JWT dot Verify aquí pasamos user refresh
token y después de eso, pasamos el proceso de clave
secreta de actualización punto ENV dot refresh token, Ahora bien, esta expresión podría
devolver error, así que agregamos aquí, intenta y gatchblog simplemente mueve
esta línea en el blog seco Y en el blog de caché, devolvemos response
dot status 403, 44 PDN dot JSON, y pasamos tu mensaje
a token de actualización no válido También, como sabemos, cuando definimos
variable usando costo, solo
será accesible en
este blog seco. Entonces tenemos que
definirlo antes del blog seco. Y quitar costo de aquí. Ahora, después de eso, costo usuario
es igual a un peso, usuario punto fino BYD Y aquí pasamos descodificado
usuario punto subrayado ID. Y luego si el usuario no
está disponible, entonces devolvemos el estado del
punto de respuesta 404 punto Json. Y aquí agregamos
propiedad de mensaje al usuario no encontrado. Ahora, si encontramos usuario, entonces tenemos que comparar tokens, y para eso, simplemente
usamos paquete BCRP Así que espera, comparación de puntos BCRP. Pasamos token de actualización de usuario, que obtenemos de la cookie y lo
comparamos con el token de actualización de
punto de usuario. Esta expresión devuelve el
resultado para la comparación. Secons es válido. Y ademas aqui pasamos otra condicion I
es valida es falsa, entonces volvemos a devolver
respuesta punto status 403 punto Json con mensaje para
refrescar token no es valido. Ahora bien, si los tokens son válidos,
entonces ¿qué vamos a hacer? Crearemos nuevos tokens, almacenaremos el token de actualización en
la colección del usuario,
estableceremos el token de actualización en
la cookie
SDDPoly y luego devolveremos
el token en exceso Estos pasos ya los hicimos en la API de registro e inicio de sesión. Copia el simplemente lo pegamos
para actualizar la API y listo. Ahora definamos rápidamente
API para cerrar sesión también. Entonces probaremos juntos estos
dos APIs. Ruta, poste de dardo,
punto a corte Cerrar sesión. Recuerda para este
proyecto en front end, tenemos que golpear API
para slash API, slash user, slash
refresh o logout point porque los agregamos
en Aquí, agregamos devolución de llamada ASN
con solicitud y respuesta. Ahora bien, ¿me puede decir qué
debemos hacer en el cierre? Cierto, es realmente sencillo. Tenemos que eliminar el
token de actualización de la cookie, y luego simplemente eliminamos el token de la colección del
usuario también. Además, al hablar contigo
sobre la colección del usuario, recuerdo que no agregamos token de
actualización rellenado en
la colección del usuario. Entonces hagamos eso primero, y luego completaremos
esta ruta de bloqueo. Entonces el modelo de un usuario,
y en la parte inferior, agregamos astken relleno al
objeto, al tipo, a la cadena No nos adherimos requeridos
porque cuando nuestro usuario se bloquea, entonces tenemos que
quitar el astken Si agregamos requerido, entonces no nos
permitirá hacer eso. Tan simple como eso. Ahora
en la API de cierre de sesión, iniciar tarea es muy
similar a actualizar API Por ejemplo, también necesitamos
obtener el token de la cookie,
buscar el token de actualización del usuario y luego convertirlo en nulo. Así que vamos a copiar el código de la API de actualización
y pegarlo aquí. Bueno. Ahora vamos a revisar
este código desde el inicio. Esto es bueno. Esto también es
bueno hasta que consigamos al usuario. Aquí, no necesitamos crear tokens, así que podemos eliminar esto. Además, no necesitamos
hacerlo como el token, así podemos eliminar esta línea, y luego aquí almacenamos
null en el token de repress Ahora en el lugar de respuesta, dardo Cookie, usamos
response, dot clear Cookie. Al principio, pasamos el nombre de la
cookie que está bien. Después de eso, aquí no
necesitamos
pasar esta variable
token de actualización, sino que necesitamos este objeto de
configuración, y por fin, simplemente devolvemos mensaje en el
lugar de token de acceso, bloqueado
con éxito y hecho. Ahora
probemos rápidamente estas API. Entonces, un cartero en
la carpeta del usuario, creamos una nueva solicitud
llamada repress access token Necesitamos postsolicitud. Punto a SDD P, Columna doble
diagonal hacia adelante, host local Columna 3,000, slash APIs usuario, slash reprime y
envía Ver, aquí obtenemos error
porque no tenemos Cookie, vaya a Iniciar sesión Ruta, enviar la solicitud
con los datos de escritura. Ver aquí obtenemos token y también reprimir token
se establece en Cookie Ahora de vuelta a reprimir API, enviar la solicitud de nuevo. Mira, aquí tenemos el
nuevo token. Genial. Ahora probemos Logout API. Simplemente duplique este gusto de
solicitud y
cambiamos el nombre de la solicitud para
digamos cerrar la sesión de un usuario, y también cambiamos el
punto final de la API para reducir el usuario, reducir el cierre de sesión y
enviar Verás, obtenemos mensaje de éxito, y si comprobamos la cookie, mira, aquí no
obtenemos un token de actualización, ambas API están funcionando bien. Además, quiero decirles que esta
lección actual y anterior son lecciones actualizadas. Si en el futuro, no
ves este código en mi grabación de
pantalla, entonces no te preocupes, puedes seguir
absolutamente esas lecciones. Yo sólo quiero que las coures
estén lo más actualizadas posible. También aprenderás las
mejores prácticas actuales para Node jazz.
162. Detalles de usuario registrados actuales: Vamos a crear otra API para enviar los datos de
los usuarios conectados. Entonces aquí agregamos otro punto de enrutador Obtener
punto para reenviar barra diagonal y simplemente pasar aquí función de devolución de llamada
ASN con
solicitud Bueno. Ahora en esta función, costo usuario es igual a
esperar usuario punto encontrar Por ID. Y aquí simplemente pasamos ID de usuario. Pero, ¿cómo podemos obtener esa identificación? Sí, necesitamos extraer
ese ID del token JWT. Y para eso, necesitamos
crear Osmddalware. Por ahora, completamos esta API, y luego
agregaremos Othmidalware Aquí pasamos solicitud punto
usuario punto subrayado ID. Ahora, no queremos enviar
contraseña con estos datos. Agregamos aquí el método de selección de punto, y en la cadena,
agregamos menos contraseña. Después de eso, si
no obtenemos el usuario, entonces pasamos la condición I, el
usuario no está disponible, usuario no está disponible, entonces devolvemos el estado del
punto de respuesta 404. También pasa punto GSN Object con éxito a caídas y
mensaje al usuario, no encontrado Si encontramos al usuario, entonces simplemente lo devolvemos
en respuesta dot Json user. Ahora muchos estudiantes podrían preguntar, ¿podemos ver el código de proyectos
anterior mientras lo aplicamos
en nuestro nuevo proyecto? Sí, claro,
se puede ver ese código. Solo piensa, ¿hay algo que puedas
mejorar en ese código? En caso afirmativo, entonces mejorarlo, y si no, entonces quédate
con ese código. No hay nada de
malo en eso. Vamos a crear middleware de Os. Entonces en nuestro proyecto, creamos una nueva carpeta llamada middleware Y en esa carpeta, creamos un nuevo archivo middleware
llamado oth dot js Ahora, antes que nada, aquí
creamos una función llamada OT y sabemos que esta
es la función middleware Entonces llegaremos aquí
tres parámetros, request, response, y next. Ahora en esta función, primero
obtenemos un token
del encabezado de solicitud. ¿Recuerdas en qué encabezado, nuestro front-end
pasará el token? Escriba en el encabezado de
autorización, el encabezado SecondsTo es igual a solicitar encabezados de punto autorización de
puntos Después de eso, verificamos
el estado. Si el encabezado de autenticación no está disponible, o el punto de encabezado oth comienza
con aquí en los códigos, pasamos el espacio Barr Si esto no es cierto, entonces devolvemos error. Entonces devuelva la respuesta, el estado del punto 401 para el
objeto Json no autorizado, el éxito para forzar, y mensaje a la autorización,
token requerido. Ahora bien, si obtenemos oth header, entonces necesitamos extraer nuestro
token de ese encabezado. Así costo token es igual a
oth header dot split method, en códigos, pasamos ritmo, y aquí necesitamos segundo ítem, así corchete cuadrado, índice uno. Ya lo vimos en
el proyecto anterior. Derecha. Entonces ahora tenemos una ficha. Lo único es que
necesitamos verificar el token y establecer los datos de nuestros usuarios
en request dot user. Secct decodificado usuario es
igual a JWT punto Verify. Aquí, primero, pasamos nuestro token, que obtenemos del encabezado. Y luego en segundo argumento, pasamos proceso punto EV
punto JWT clave subrayado Simplemente podemos establecer esta
variable como request dot user. Solicitar usuario punto es
igual a usuario decodificado, y luego llamamos siguiente función. Esto es lo más importante. Ahora bien, ¿y si no
obtenemos este usuario decodificado? Si no manejamos esto, entonces obtendremos error. Entonces manejamos esto con
try and catch block. Aquí intentamos el bloque de caché y simplemente movemos estas tres
líneas en el bloque try. En el bloque de caché, simplemente devolvemos respuesta, estado de
punto, 401, punto Json, Object, éxito a falso y mensaje a token
no válido. Y hecho. Ahora vamos a exportar esta función. Por lo tanto, las exportaciones
de punto del módulo son iguales a OT. Ahora volvemos a nuestra ruta de usuarios. Aquí en nuestro GIPI, agregamos oth middleware, ver en Bonito. Ahora probemos esto. Entonces cuando Cartero, aquí
agregamos nueva solicitud llamada actual bloqueada en punto de
usuario a SJDP, Columna doble
barra cuatro host Local, Columna 3,000 API slash
usuario y Ver, aquí obtenemos error, se requiere token de
autorización. Entonces de la llamada a la API anterior, copiamos este token JWT, y en nuestra
API actual, vamos a los encabezados Aquí, agregamos encabezado de
autorización. Valorar al espacio Barr y pegar nuestro token
y enviar la solicitud Ver, aquí me sale token inválido, pero por qué paso el token válido. Comprobemos la terminal. Ver, servidor también se está ejecutando. Creo que el error está ocurriendo
en el bloque seco y caché. Por eso mi servidor
sigue funcionando. Así que aquí en el bloque de caché, agregamos consola dot
log este error. Establece los cambios y vuelve
a enviar la solicitud. Ahora volvemos al código VS,
volvemos a la terminal, y aquí obtenemos error, JWT no está definido Oh, olvidé importar JWT del paquete de token
web JSON Entonces, en la const superior, JWT es igual al token web JSN
requerido Se puede ver así es como
podemos resolver el error. No te asuste si
ocurren errores en tu código. Intenta resolverlo paso a paso. Si ocurren muchos errores, podemos aprender más
sobre nuestros errores, y con eso, podemos
mejorar nuestro código. Así que no te preocupes por los errores. Ver los cambios y echar un vistazo. Ver, aquí obtenemos los
detalles de uso sin contraseña.
163. Cómo restablecer la contraseña del usuario: Ahora implementemos la función de restablecimiento de
contraseña en
nuestra aplicación. Primero, entendamos la
visión general de esta característica. Entonces, cuando el usuario ingrese su correo electrónico y haga clic en
el botón de restablecer contraseña, entonces llamaremos a nuestra primera solicitud de
API Restablecimiento de contraseña. Ahora, esta API
generará un nuevo token y enviará una URL con ese
token en su correo electrónico. Cuando los usuarios hagan clic en
ese enlace del sitio web, tomaremos una nueva
contraseña del usuario, y cuando los usuarios hagan clic en enviar, llamaremos a nuestra segunda contraseña de restablecimiento de
API. En esta API, verificaremos ese token y actualizaremos la nueva contraseña en
el documento de usuario. Si todo esto funciona bien, entonces devolveremos mensaje,
contraseña, reiniciaremos con éxito. Aquí, tenemos que
crear dos API, solicitar el restablecimiento de contraseña
y restablecer la contraseña. Así que comencemos con la
creación de la primera API, así Router punto post endpoint
para solicitar la contraseña de Ds, D reset, y también agregamos función de devolución de llamada
ASN con
solicitud y respuesta Entonces aquí no estamos
agregando ware ortomidal porque queremos que cualquiera
pueda restablecer su contraseña Están haciendo reset password
porque en el 99% de los casos, olvidaron su contraseña, así que no pueden iniciar sesión, y
por eso no agregamos
aquí orthomidalware Ahora, antes que nada, obtenemos un correo electrónico de usuario del cuerpo de
la solicitud. El objeto Secons es igual
al cuerpo del punto de solicitud. Y aquí nos llega el correo electrónico. Ahora usando este correo electrónico, primero
verifiquemos que el usuario
esté disponible o no. Entonces const user es igual a
esperar usuario punto Fine one. Y aquí pasamos
objeto de comparación con correo electrónico a correo electrónico. A continuación, pasamos condición. Si el usuario no está disponible, entonces devolvemos respuesta
que código de estado 404 punto Json Object con éxito a caídas
y mensaje dos, este correo electrónico no está registrado, o también podemos pasar
usuario no encontrado. Depende totalmente de ti. Ahora si el usuario está disponible,
entonces ¿qué haremos? Bien, vamos a generar token. Entonces costo, el token de reinicio es
igual al seno de punto JWT. Primero, pasamos nuestros
datos, así objeto, subrayado ID a usuario
punto subrayado Y en el segundo parámetro, pasamos clave JWT,
así proceso punto Env punto clave de subrayado
JWT Y también en el tercer argumento, pasamos objeto con
expiries en propiedad a 1 hora porque aquí queremos agregar estos
expiries en propiedad, y por eso no usamos
aquí Tenemos token de reinicio.
Ahora solo queremos enviarlo
al correo electrónico de nuestro usuario. Enviar un correo electrónico es
una lógica separada, por lo que actualmente,
no lo implementamos. Primero, creamos
nuestras dos APIs de reinicio para que no te confunda Entonces aquí estamos escribiendo
comentario para enviar correo electrónico y luego simplemente
devolver respuesta Json. Aquí pasamos Objeto
con propiedad de mensaje, restablecimiento de
contraseña,
enlace, enviar al correo electrónico. Y después de eso, también pasamos token de
reinicio para restablecer token. Enviando este token de reinicio en respuesta porque aún
no enviamos correo electrónico. Es sólo para pruebas. Después de enviar el correo electrónico, no
necesitamos
pasar el token de reinicio
en la respuesta. Ahora, definamos nuestra
segunda API en la que
verificaremos ese token de reinicio
y guardaremos la nueva contraseña. Así router punto post y punto
para reducir restablecer la contraseña. Y aquí agregamos función de devolución de llamada
ASN con
solicitud y respuesta En primer lugar, obtenemos rellenos
del cuerpo de solicitud. Así que el objeto Const es igual
a solicitar el cuerpo del punto, y aquí desestructuramos el token de
reinicio y además obtenemos la nueva contraseña que el
usuario quiere actualizar Aquí necesitamos
realizar dos pasos. Paso uno, verificar el token, y el paso dos, si el
token está verificado, luego actualice la contraseña.
Tan simple como eso. Entonces para verificar el token, podemos usar JWT dot Verify Al principio, pasamos
nuestro token de reinicio. El segundo argumento,
necesitamos agregar nuestro JWT key process dot ENV
dot JWT Ahora bien, esta expresión nos
dará a los usuarios datos que pasamos
cuando generemos este token. Ver aquí en la parte superior, pasamos ID de subrayado a ID de subrayado de punto de
usuario Almacenamos eso en la variable
llamada usuario decodificado. Ahora encontramos al usuario usando ese ID de
guión bajo y luego
actualizamos la contraseña Dejar usuario es igual a esperar
usuario punto encontrar por ID. Y aquí pasamos descodificado
usuario punto subrayado ID. Ahora después de eso,
pasamos condición. Si el usuario no está disponible, entonces devolvemos respuesta con Status Code 400 dot
Json Object con éxito a false y mensaje
a token inválido o caducado. Ahora si conseguimos el usuario, entonces simplemente
actualizaremos la contraseña. Aquí, para contraseña, necesitamos primero
tener esa contraseña. No podemos almacenarlo tal como está. Esperen, punto cripta
tiene aquí, primero, pasamos nueva contraseña, y en el segundo argumento, pasamos la Sal, que es diez. Esto generará una contraseña, por lo que podemos almacenar directamente
esa en contraseña de punto de usuario, y por debajo de eso, simplemente
esperamos al usuario punto CV. Y por fin, simplemente devolvemos objeto Json de punto de
respuesta
con propiedad de mensaje, restablecimiento de
contraseña con éxito,
y eso es todo. En la primera API, generamos el token de reinicio y lo
enviamos con correo electrónico, y en la segunda API, usuario nos enviará
ese token de reinicio y lo
verificaremos. Si se verifica, sólo entonces
actualizaremos esa contraseña. Aquí en la verificación de tokens, tenemos poco problema de seguridad. Aquí solo estamos verificando
el token usando JWTKey, pero esto no es muy seguro Déjame explicarte
con un ejemplo sencillo. Supongamos que los usuarios envían
solicitudes de restablecimiento de contraseña. En el back end, generamos un token de reset y lo
enviamos al usuario. Ahora podría suceder, usuario puede volver a enviar la
solicitud de la contraseña de restablecimiento, y nuevamente enviamos el nuevo token de
reinicio al usuario. Ahora bien, estos son dos
tokens que se validan para restablecer
la contraseña Supongamos que
el usuario pasa el segundo token y cambia la contraseña. Ahora bien, ¿y si este primer token
antiguo los hackers obtienen y cambian la contraseña usando
este token de reinicio antiguo Esta implementación
es poco arriesgada. Ahora bien, ¿cuál es la solución aquí? Es realmente simple. Cuando generamos
un token de reinicio en nuestra primera API en el momento
antes de enviar el correo electrónico, almacenaremos el token de reinicio
en la colección de nuestro usuario. También almacenamos el token
caduca y el tiempo. Ahora, cuando verifiquemos el token, compararemos el token de reinicio almacenado con el
token de reinicio del usuario. Si ambos coinciden y el
token no está caducado, entonces actualizaremos
la contraseña. Solo por este enfoque, el último token de reinicio es válido y solo para
los caducos y el tiempo. Este enfoque es
más seguro que el anterior. Entonces vamos a implementar esto. Aquí antes de enviar correo electrónico, escribimos user dot Reset token
es igual a reset token, y user dot reset token, caduca es igual
a la fecha punto ahora, además, queremos
agregar 1 hora expira. Entonces 60 minutos en 60
segundos en 1,000. Convertir segundos
en milisegundos. Y después de eso, podemos esperar
al usuario punto c. También en la parte superior, convertimos este usuario const a al
usuario Y también, necesitamos agregar estos dos rellenos en el modelo de
nuestro usuario. Entonces, cuando el usuario Schema, aquí, al final, agregamos reset token a
object, type to string, y después de eso, reset token expira a object
y type to date, guardamos los cambios, y
volvemos a nuestra API de reset. La parte de verificación, agregamos condición si el usuario no
está disponible, o el token de reinicio de punto de usuario
es igual a restablecer token o el token de
reinicio de punto de usuario caduca es menor o igual
a punto de fecha ahora. Si alguna de estas
condiciones es cierta, entonces devolveremos el
token caducado, y el token no se verifica. Además, después de actualizar
la contraseña, necesitamos hacer nulos estos
dos rellenos. Antes del punto c del usuario, establecemos el reset del punto del usuario, token es igual a nulo y el token del reset del punto del usuario
expira es igual a nulo. Esto es más seguro. Si el usuario restablece
correctamente la contraseña, no
hay tokens que sean
válidos para restablecer la contraseña. Ahora vamos a probar esta
implementación. En el cartero, creamos
una nueva solicitud llamada
request , reset password, method,
to post point to SDDP, Column double forward
slash local host, Column 3,000, slash API, slash user, slash request, Y en cuerpo, vamos a raw y aquí pasamos
objeto JN con correo electrónico. Asegúrate de pasar Correo electrónico
válido y también ese correo electrónico debe
estar en tu correo electrónico de usuario. De lo contrario,
obtendremos usuario no encontrado. Si no pasa
correo electrónico válido en los datos del usuario, entonces desde el Mongo Di convertirse en
pase, puede cambiar eso Ahora envía la solicitud aquí, me sale Ken no encontrado. Déjame revisar el punto final. Oh, aquí está solicitud, hay contraseña, restablecemos. Y en mi punto final,
escribo solicitud, vamos a restablecer, des contraseña. Entonces cambio este punto final
y envío esta solicitud. Mira, aquí obtenemos un
token de reinicio, copiamos este token, y necesitamos crear
una nueva solicitud llamada método de
restablecimiento de contraseña para
publicar y punto final a SDDP, Columna doble
barra hacia adelante host local,
Columna 3,000, barra de
usuario de API, barra diagonal Además, aquí necesitamos pasar body, raw object con reset token, y pegar ese token. Y luego pasamos
la nueva contraseña. 123-45-6789. Ahora envía la solicitud. Ver, obtenemos el
restablecimiento de contraseña con éxito. Entonces ambas API están funcionando. Ahora, lo único que queremos
hacer es que necesitamos enviar este token o
enlace de página de reinicio en el correo electrónico del usuario, y lo veremos
en la siguiente lección.
164. Formas de envío de correo electrónico en Node JS: Ahora hay muchas formas de
enviar correo electrónico desde la aplicación de
nodo. El primero es mediante el uso de SMTP, que es un protocolo simple de
transferencia de correo segunda forma es mediante el
uso de la API de SendGrid, y la tercera forma es por Amazon SS, que es un servicio de correo electrónico simple Ahora veamos los pros y los
contras de cada forma, lo que nos ayudará a decidir
qué servicio de correo electrónico podemos
usar para nuestra aplicación. Entonces SMTP funciona mejor para aplicaciones
pequeñas porque
es simple de configurar, necesitamos pasar solo el correo electrónico
y la contraseña de nuestra cuenta, y luego SMTP enviará ese
correo electrónico desde nuestra Pero SMTP es poco lento en comparación con
otros servicios de correo electrónico Además, con SMTP, solo
podemos enviar
una cantidad limitada de correos electrónicos Por ejemplo, si usamos Gmail, entonces solo podemos enviar
500 correos electrónicos por día. Si usamos Yahoo, entonces podemos enviar solo
100 correos electrónicos por día. SMTP no es escalable
para grandes empresas. Está bien para aplicaciones
pequeñas. Ahora pasemos a SNGrid. En SendGrid,
no necesitamos pasar correo electrónico y la contraseña
de nuestra En lugar de eso,
necesitamos generar ApiKey y enviaremos correo electrónico
usando la API de SendGrids Entonces esto es rápido y confiable. También es fácil de configurar. Muchas empresas utilizan SendGrid para enviar
correos electrónicos masivos como Uber, AirBnB, app, etcétera. Pero para enviar correos electrónicos
ilimitados, necesitamos comprar
su plan de pago. Ahora pasemos a Amazon SES. Este es el servicio de correo electrónico más confiable y
seguro utilizado por grandes empresas como
Netflix, LinkedIn, etcétera También es muy rápido. Podemos enviar millones
de correos electrónicos por día, y además su plan pago es
más barato que los planes de Sandgrad, pero el único contras es que
es poco difícil de configurar Eso lo podemos manejar. Entonces aquí, podemos ver claramente
que si necesitamos velocidad, seguridad y bajo costo, entonces podemos usar Amazon SES. Entonces, en la siguiente lección,
implementaremos Amazon SES
en nuestra aplicación.
165. Cómo configurar Amazon SES para enviar correos electrónicos: Implementemos la encuesta de correo electrónico Amazon
Simple en nuestra aplicación de nodo. Es realmente simple.
Esto lo desgloso en tres pasos. Paso uno, configurar el SS
en la aplicación de nodo. Paso dos, crear
una cuenta de Amazon SS y verificar el correo electrónico para probar. Paso tres, enviaremos correo electrónico
de prueba desde nuestra API. Aquí quiero aclarar una cosa para configurar la cuenta de
Amazon SS,
necesitamos los datos de la tarjeta de pago
y los datos de identidad. No necesitamos pagar nada, necesitamos los datos de la tarjeta. Aquí usaremos pre
versión de Amazon SES. Entonces, si no
tiene esos detalles, puede omitir esta
lección y puede aplicar remitente de correo electrónico
gratuito usando
SMTP en la siguiente lección Para implementar Amazon SES, necesitamos instalar el paquete de AWS. Así que NPM instala en dit AWS sdk client Ss a la tasa 3.738
0.0 y pulsa Enter Bueno. Minimizar el terminal. Ahora en nuestro proyecto, creamos una nueva carpeta llamada Config
y en esa carpeta, creamos un nuevo archivo
llamado Amazons dot js En primer lugar, necesitamos
configurar el cliente SS
y para eso, necesitamos el método del cliente SS. Así Const CL soportes. Aquí conseguimos SS cliente
es igual a requerir
a la tasa aws SDK cliente Ss. Después de eso, const,
como cliente es igual a nuevo como cliente y dentro de él, tenemos que pasar el objeto de
inicialización Ahora la primera propiedad
del objeto es region. Aquí, tenemos que
pasar por nuestra región. Almacenaremos la
región en el archivo ENV, por lo que agregamos aquí process
dot ENV Aws Score Después de eso, tenemos que
pasar credenciales propiedad. Ahora bien, esto es realmente importante. Sin esto, no
podemos enviar correo electrónico. Aquí pasamos objeto
con exceso de ID de clave, y también necesitamos
pasar clave secreta en exceso. Estas dos propiedades las
obtendremos cuando creemos una cuenta en la Amazon
AWS. No te preocupes. Primero configuramos todos estos
en nuestra aplicación de nodo, y luego crearemos una
nueva cuenta en Amazon Aws. Entonces aquí también pasamos
proceso punto Un punto Aws, subrayado Xs, subrayado clave Para secreto, pasamos
proceso punto n punto Aws,
subrayado, clave de
subrayado secreto, y hecho Ahora solo necesitamos crear la función
Enviar correo electrónico y
agregar algunos rellenos de correo electrónico. Entonces Const enviar correo electrónico es
igual a la función de flecha. Aquí, antes nos olvidamos de agregar try y cache
block, los agregamos, y en el cache,
simplemente consola dot log, Amazon, error SCS Aquí agregamos este error. Ahora, escribamos nuestro
código en try blog. Si algo sale mal, entonces nuestro bloque de caché
consolará ese error. Ahora para enviar el correo electrónico, necesitamos proporcionar alguna
información del correo electrónico, queremos enviar correo electrónico a
qué correo electrónico queremos enviar, cuál es el asunto, cuál
es el cuerpo, etcétera Así que los parámetros de costo es
igual a objeto. Aquí, primero tenemos una fuente, aquí, tenemos que pasar nuestra dirección de correo electrónico
verificada, cual verificaremos en
la página web de Amazon SS. No te preocupes, no escribas
nada por ahora. Déjalo plan. Asegúrate de escribir este nombre de
propiedades en la capital, igual que yo escribo. De lo contrario, obtendrá error. Ahora, después de la fuente,
agregamos destino, objeto
addhee con
propiedad a dirección, y aquí tenemos que
pasar matriz de correos electrónicos a los que
queremos enviar También podemos enviar correos electrónicos
a múltiples usuarios. Ahora bien, ¿cómo podemos obtener esa
dirección de correo electrónico en esta función? Derecha, a partir de los parámetros. Entonces aquí agregamos dos, que es la dirección de correo electrónico. Además, necesitamos asunto
del correo electrónico y también necesitamos
el texto del correo electrónico. Ahora, aquí en la dirección dos, agregamos dos parámetros. Aquí, si tenemos múltiples, entonces podemos agregar esos
ID de correo electrónico también con coma Ahora después del destino, agregamos la
propiedad del mensaje al objeto. Primero, agregamos sujeto a objeto
con propiedad de datos aquí, tenemos que pasar el asunto que obtenemos del parámetro. Ahora después de asunto,
agregamos cuerpo a objeto, texto a objeto, y
dentro de estos datos al texto, que nuevamente obtenemos
del parámetro. Sé que esta es una sintaxis un
poco extraña, pero es lo que es. Tenemos que seguir eso. Ahora
tenemos listas nuestras permanente Ahora podemos crear comando
para estas perams. Const, comando es igual a
Nuevo enviar correo electrónico, comando. S, la entrada automática funciona, y aquí simplemente pasamos perams Ahora necesitamos enviar este
comando para enviar el correo electrónico. Entonces Ss cliente punto SN, y aquí pasamos comando. Ahora como sabemos, enviar el
correo electrónico llevará algún tiempo, por lo que será una tarea
asincrónica Y para eso, nos adherimos aguardan. Y por esperar, necesitamos hacer esta
función asíncrona Ahora vamos a hacer la respuesta
en la variable de respuesta, y al final, simplemente
agregamos consola dot log, email sent successfully
message ID column, y aquí devolvemos
response dot message ID. Al final de este archivo, simplemente módulo de exportaciones de punto
es igual a enviar correo electrónico. Asegúrate de no llamar a
esta función aquí. Sólo tenemos que
pasar la referencia. También, aquí en las fuentes, pasamos proceso punto En
punto Aws subrayado, correo electrónico, que será nuestro correo electrónico desde el que
queremos enviar correo electrónico Entonces aquí, nuestro paso
número uno está hecho. Solo necesitamos agregar
estas tres variables en el archivo ENV y
también necesitamos pasar este correo fuente Dirígete al navegador y
ve a aws.amazon.com. Y aquí necesitamos
crear una nueva cuenta de AWS. Aquí, escribimos nuestra dirección de
correo electrónico, y aquí tenemos que pasar
nuestro nombre de cuenta de AWS. Por ahora, pasa cualquier cosa, podemos cambiarlo más tarde
desde la configuración. Haga clic en Verificar dirección de correo electrónico. Después de eso, va
a pedir contraseña, simplemente crear una contraseña y continuar aquí vemos
como plan personal, y además tenemos que
pasar nuestros datos. Rápidamente escribo mis datos
y estoy de acuerdo y continúo. Ahora aquí, tenemos que
pasar los datos de la tarjeta. Si no tienes
los datos de la tarjeta o no quieres
dar tu información, entonces puedes implementar SMTP porque la mayoría de los estudiantes
no tienen tarjeta, por lo que puedes implementar SMTP, que solo usa tu Eso te voy a mostrar
en la siguiente lección. Por ahora, paso datos de
su tarjeta y
luego verifico y continúo. Esto procesará pagos
pequeños como $1 o incluso más pequeños para la verificación de
su tarjeta. Entonces aquí entro mi pago OTP se está procesando y aquí se
hace el pago Ahora tenemos que aportar identidad. Seleccione su uso personal. Si quieres usar para negocios, entonces puedes seleccionar eso también. A continuación, seleccionamos individuo, y aquí necesitamos
proporcionar documento de identidad. Por lo que rápidamente llené este formulario y también subo mi documento
y hago clic en Continuar. Aquí se proporcionan algunos
detalles más para su verificación. Escribo aquí mi
número de teléfono y envío SMS. Si eres de
otro país, entonces podrías obtener otro relleno. Aquí, verifico mi número
con OTP y luego continúo. Ahora aquí acabamos de establecer
este plan básico gratuito, y finalmente completar el registro Dn ir a la consola de
administración de AWS. Mira, aquí estamos en la Consola. En primer lugar,
verificaremos nuestro correo electrónico remitente. Entonces, en la parte superior, inserte SE y
abra esta página de Amazon SS. Da click en estas tres
líneas y ve a identidades para verificar
correo electrónico o dominio. Aquí, tenemos que
crear identidades. Ahora si quieres
usar para producción, entonces tienes que verificar
tu dominio aquí. Pero ahora para probar, podemos usar tu correo electrónico. Aquí, escribimos nuestra
dirección de correo electrónico desde la que queremos enviar correo electrónico a los usuarios y damos
clic en Crear identidad. Consulta aquí obtenemos
verificación pendiente. Amazon tiene S enviar correo electrónico a ese correo electrónico y
necesitamos verificarlo. Entonces aquí abro ese correo electrónico. Da click en este enlace,
ve la verificación realizada, y si actualizamos esa página, mira aquí también nos verifican. Entonces tenemos que copiar
este correo electrónico y en nuestra aplicación de nodo
en las fuentes, agregamos correo electrónico de subrayado de AWS Agreguemos esta variable
en el archivo ENV. El correo electrónico de subrayado de AWS es igual a aquí paso
mi correo electrónico verificado Ahora tenemos que crear clave de acceso y clave secreta para
nuestra aplicación. Busca aquí IAM, que es la gestión de
identidad y acceso. Aquí vamos a los usuarios
y creamos un nuevo usuario. Escribimos nombre de usuario, digamos, nuestro Linky Pi y pulsamos en siguiente Aquí tenemos que adjuntar
políticas, buscar aquí, AS Xs completas y seleccionar la política de proceso completo de
Amazon SS, y dar clic en siguiente
y crear usuario. Ahora para generar
la clave de acceso, abra este usuario y vaya a las credenciales
de seguridad. Aquí tenemos cero claves de acceso, así que creamos clave, seleccionamos
otra opción, pulsamos en siguiente. Aquí está
pidiendo descripción, pero es opcional, simplemente crear clave de acceso. Ver, aquí obtenemos clave de acceso, y también obtenemos clave de acceso
secreta. Tenemos que agregarlos
en nuestro archivo ENV. Asegúrate de descargar
este archivo punto CNV. En nuestro archivo ENV, primero, agrego aquí nombre de variable,
AWS, subrayado Xs, clave de
subrayado es
igual a copiar la
clave ases del navegador y
pegarla en nuestro Además, agregamos otra variable llamada AWS, underscore secret, underscore key es igual a copiar la
clave secreta desde el navegador, y también pegamos Ahora necesitamos región. En el archivo ENV, agregamos la región de subrayado de
AWS. Ahora olvidando la región aquí en el
lado izquierdo de nuestro perfil, obtenemos una lista de región. Soy de la India.
Por eso selecciono Mumbai. Mi región será AP sur uno. Aquí, tienes que seleccionar el tuyo. Si no tienes idea, entonces simplemente puedes
buscar tu región en Google y seleccionar
la ubicación de
Neal. Agrego este
valor de región en el archivo NV. Ahora aquí, nuestro paso dos está hecho. Entonces este archivo a menos que la función de envío de correo electrónico esté funcionando o no, que
es nuestro paso tres. En nuestra solicitud, des
restablece la contraseña API, llamaremos a la función Enviar
correo electrónico en el primer argumento para
pasar el correo electrónico del usuario Usuario punto email coma aquí, escribimos nuestro asunto de correo electrónico Vamos a definir nueva variable para asunto es igual
al restablecimiento de contraseña, solicitud de tu cuenta de
Linkifi Además, definimos el texto
que queremos
enviar en las garrapatas traseras,
haga clic en este enlace. Restablezca su contraseña, SDDP cool
y doble barra diagonal,
nuestra contraseña de restablecimiento de barra de linkify.com En el parámetro de consulta, signo de
interrogación, reset tocan es igual a aquí
agregamos paquetes rizado dólar, reset tocan Esta URL es para
acceso directo o un front-end. Entonces sentido Instagram, correcto. También, puedes modificar este
texto de acuerdo a tus necesidades, o también puedes pasar el código STML como
cuerpo del correo electrónico Apenas en los params de correo electrónico
en el lugar de este texto, tenemos que pasar STML Ahora en la función Enviar correo electrónico, pasamos asunto y también texto. Guarde los cambios a menos que esta función de
enviar correo electrónico
esté funcionando o no. Entonces un cartero, y aquí hay una API de
solicitud de restablecimiento de contraseña, que es nuestra primera
API para restablecer Ahora antes de llamar a
esto, permítame pasar aquí correo electrónico
válido para que obtenga el
token de reinicio en ese correo electrónico. Aquí, cambio mi correo electrónico
a uno de mis correos ficticios, lo
actualizo, y también en
el cuerpo del punto de solicitud, paso el mismo correo electrónico Bueno. Ahora,
enviemos la solicitud. Ver aquí obtenemos
no se pudo enviar solicitud. Oh lo siento, se me olvidó
iniciar el servidor. Entonces nodemon index dots Niza. Ahora, enviemos la solicitud. Aquí me sale sendemail no
está definido. Se me olvidó ingresar eso. Entonces en la parte superior, costo, enviar correo electrónico es igual a requerido. Aquí vamos una carpeta
arriba, Config Amazon SCS. Guarda esto y vuelve a enviar
la solicitud. De nuevo, me sale error. No entres en pánico. Vamos a revisar. Es error de validación. Entonces, como sabemos, acabamos de verificar nuestro correo electrónico remitente en Amazon SES, pero también tenemos que verificar el correo electrónico del receptor para
probar la función de correo electrónico. Es la condición de Amazon SES para probar la cuenta
sandbox Si pasamos al plan de producción
y pago, entonces le enviaremos un correo electrónico a cualquier persona sin
verificar su correo electrónico. Para el entorno de pruebas,
necesitamos verificar el correo electrónico del
receptor. Así que déjame revisar qué
correo electrónico utilizo para la cuenta de
usuario en el
Mongo DB Compass Ver, esto es correo electrónico. Entonces aquí, tengo que
agregarlo en nuestra identidad de usuario. Entonces busca Ss así. Ir a identidades.
Crear identidad, seleccionar correo electrónico, y nosotros aquí su correo electrónico que está
disponible en su base de datos. Crear identidad. De nuevo envían el
correo electrónico de verificación en este correo electrónico. Entonces abro ese correo
aquí y abro este enlace. Verás, nos llegan
felicitaciones. Bueno. Déjame refrescar esta página. Ver, se verifica. Entonces volvamos a morir. Enviar la solicitud aún, me sale Sandymil no está definido Déjame revisar el archivo
Amazon SS. Oh, en la parte inferior, olvidé quitar
este paréntesis Agregué para mostrarte error, y me olvidé de quitar eso. Guarde esto, y volvamos
a enviar la solicitud. Ver, aquí obtenemos
el token de reinicio. Pero si revisamos
nuestro terminal, vea, aquí todavía obtenemos un error de
validación, error Amazon SS, correo electrónico. Comprobemos SandyMLFunction. Bien. Aquí en el destino, tenemos que cambiar
estas dos direcciones a dos direcciones plurales. Ahora intentemos de nuevo. Aquí obtenemos nuestro token de reinicio. Ahora vamos a revisar nuestra terminal. Aquí obtenemos un nuevo error. El correo electrónico no se verifica
en esta región. Pero por qué como sabemos, ya
verificamos nuestro correo electrónico. Aún así, estamos
recibiendo este error. Déjame explicarte. Aquí verifiqué nuestro correo electrónico ambos
en la región equivocada. Permítanme consultar también
en el sitio web de Amazon. Mira, aquí tengo seleccionada
la región de Europa, y en mi variable NV, paso la región de Mumbai, y por eso me sale este error. Selecciono aquí esta región umbi. Ahora tengo que volver a verificar
ambos correos electrónicos en esta región. Ir a identidades,
crear identidad, seleccionar aquí correo electrónico, escribir el
correo electrónico y crear identidad. Ahora verifiquemos esto
desde el correo electrónico bueno. Ahora tengo que hacer lo
mismo para otro correo, si como y hecho aquí ambos correos son
verificados para mi región. Entonces ahora volvamos a probar
nuestra implementación. Envía la primera llamada a la API. Verás, obtenemos token de reinicio. Y además, si
revisamos nuestro terminal, entonces mira aquí obtenemos
correos electrónicos enviados con éxito, y también obtenemos ID de mensaje. Y si reviso mi bandeja de entrada de correo, aquí me sale el correo electrónico
en el spam porque aquí estamos en el modo degustación y tampoco verificamos dominio. En producción, hay que
hacer pequeños cambios en la configuración y su correo electrónico no
entrará en la carpeta de spam. Este es el poder de Amazon SES. Sé que configurar esta cuenta SES es una parte un poco difícil
y aburrida. Pero para una mejor
experiencia suave como esta, necesitamos pasar de
esa pintura dulce. Ahora el usuario puede abrir este enlace de front-end y luego el front-end
llamará a nuestra segunda API. Ese es el trabajo de front end. También desarrollador front-end tú si eres un enlace.
No te preocupes por eso. Ahora, también, si tenemos que usar
Amazon SES para la producción, entonces necesitamos
solicitar acceso a la producción. Si verificamos nuestro
estado actual en la página de GetSet, vea actualmente, nuestro estado es
sandbox lo que significa probar Aquí podemos leer la
mención en las tarjetas a continuación, verificar una
dirección de correo electrónico y enviar dominio para solicitar ces de
producción lo que le permite enviar correo electrónico a nivel de producción y aprovechar todas
las capacidades de SCS Para la producción, hay que
verificar el envío de dominio desde aquí. Y si proporciona información de
escritura y envía una solicitud, entonces AWS generalmente la aprueba
dentro de las 24 a 48 horas. Después de obtener la aprobación, podemos enviar correo electrónico a la dirección de correo electrónico. Además, voy a dar un poco más de información en el
artículo a continuación de esta lección. Entonces, para la producción, se
puede leer eso. ¿Bien? Así es como
enviamos el correo electrónico de la manera más segura, súper rápida y
barata de Amazon SS.
166. Envío de correos electrónicos GRATIS: Veamos cómo podemos enviar
correo electrónico usando la forma SMTP, que es gratis,
pero tiene límite diario Podemos enviar solo 500
correos electrónicos desde GML SMTP, y si usa YahooSMTP, entonces solo podemos Pero para tu solicitud local o proyecto universitario,
esto está bien. Además, si implementas Amazon SS y está
funcionando para ti, entonces puedes saltarte esta
lección porque
agregaremos solo
funciones de envío de correo electrónico en esta lección, igual que lo hemos hecho en
la lección anterior. Ahora veamos la implementación de
SMTB. Divido esta implementación
en tres sencillos pasos. Paso uno, implementaremos configuración de
SMTV en
la aplicación de nodo Después paso dos, vamos a generar una contraseña para SMTB
último paso tres, vamos a probar esta
implementación Empecemos con el
paso número uno. Para implementar SMTP,
necesitamos paquete llamado nodo mailer NPM instala Node mailer, en el d 6.10 0.0 y Bueno. Ahora aquí en nuestro proyecto, creamos una nueva carpeta
llamada config, y en esa carpeta,
crearemos un nuevo archivo llamado SMTP dot js Bueno. Ahora para iniciar
la configuración, necesitamos un
método mailer de nodo del paquete El correo del nodo Sconst es igual
a requerir el nodo Mailer. Y después de eso, necesitamos
crear transporte para la configuración. Así nodemler punto
Crear Transporte. Y dentro de esto, tenemos que
pasar el objeto de configuración. Aquí, agregaremos propiedades, y la mayoría de sus valores los
pasaremos en el archivo ENV Así que host para procesar punto nw
punto SMTP Underscore host. Segundo, necesitamos pot para procesar punto nw dot SMTP Underscore Después de eso, seguro a la verdad. Este valor es cierto
por solo poner 465. Para otras macetas, necesitamos
usar valor falso. Después de esto,
pasamos de a objetar. Y aquí tenemos que pasar usuario para procesar punto nw punto
SMTP, subrayado Y después de eso, pasar a procesar punto w punto SMTP, pasar guión bajo No te preocupes, pasaremos
estos valores en solo un minuto. Ahora para enviar el correo electrónico, creamos una nueva función
llamada Enviar SMTP, correo electrónico es igual a la función de
error Ahora en esta función, antes de escribir el código, es mejor agregar
try y cache block. Y en el bloque de caché,
pasaremos el registro de puntos de consola. Error al enviar correo electrónico
y simplemente agregarcorreo electrónico. Ahora en el
blog dri, agregamos costo. Las opciones de correo son iguales a objeto. Aquí pasamos algunas opciones. A partir de dos proceso punto nvt
SMTP subrayado usuario, entonces tenemos Aquí, tenemos que pasar el correo electrónico de
los receptores. Pero aquí hay una
pregunta. ¿Cómo podemos obtener el correo electrónico de los receptores
en esta función? Bien, lo obtendremos
del parámetro. Entonces nosotros también agregamos. También, aquí necesitamos tema. Este es el asunto de nuestro
correo electrónico y también pasamos texto, que es el cuerpo del correo electrónico. Ahora en las opciones, agregamos dos a dos, sujeto a asunto,
y texto a texto. Entonces tenemos opciones listas. Ahora solo necesitamos
enviar el correo electrónico. Esperen, y aquí
necesitamos transportador, que obtenemos de este método de
nodo Miller. Entonces vamos a almacenarlo invariable
llamado transportador, y en la función de enviar correo, usamos transporter
dot send mail, aquí tenemos que
agregar opciones de correo Esta expresión
escribirá la respuesta, así que vamos a almacenarla en
una variable llamada respuesta. Por fin, simplemente
consolamos el registro de puntos, correo electrónico enviado con éxito,
y también agregamos ID de mensaje, y adherimos el ID de mensaje de
punto de respuesta. Para enviar el correo electrónico, solo
necesitamos
llamar a esta función y pasar estos argumentos. Exportamos esta función
usando módulo que exporta es igual a
enviar correo electrónico SMTP Guarde este archivo, y ahora
en nuestra API de reinicio de solicitud, simplemente
llamaremos aquí, enviaremos la función de correo electrónico SMTP,
vea trabajos atoiput Aquí en la lección anterior, creé estas dos
variables, tema y texto. Puedes copiarlo y
simplemente en esta función, pasar el correo de punto del usuario,
que es el correo electrónico del receptor, asunto de la
coma y el texto Ahora permítanme comentar
esta función anterior para Amazon SES. Aquí nuestro paso uno está hecho. Ahora pasemos al paso dos, que es definir variables de
entorno. Entonces, en los archivos ENV de
la lección anterior, agregué estas cuatro
variables para Amazon SES. Si no aplicas
eso, entonces no te preocupes. Ahora aquí pasamos cuatro
variables para SMTP. Si no recuerdas
sus nombres, entonces simplemente puede
copiarlo del código. No hay nada malo en eso. Entonces primero, SMTP y
ace host es igual a aquí estoy usando gmlhst
así que escribo smtp.gmail.com Después de eso, el
puerto de subrayado SMTP es igual a 465. Aquí, si estás usando
Yahoo o Outlook, entonces puedes usar los valores
post y port. Pero Gmail es bueno para SMTP. Ahora necesitamos usuario de
guión bajo SMTP, y aquí pasamos el correo electrónico desde el que
queremos enviar Este es el ID de correo electrónico de la empresa. Entonces aquí agrego mi ID de correo electrónico. Yo uso este correo solo para demo, en el futuro, no lo
voy a usar. Ahora solo necesitamos pasar la contraseña de
guión bajo SMTP es igual a aquí, podemos pasar nuestra contraseña de Gmail, pero después de 2024, Gmail no
permite este tipo de configuración Entonces, en lugar de pasar una contraseña
real, podemos pasar una contraseña. Veamos cómo podemos
generar una contraseña. Así que abre google.com y ve
a administrar mi cuenta de Google. Aquí vamos a la seguridad. Ahora para generar
la contraseña de la aplicación, hay una condición. En nuestra cuenta de Google, verificación en
dos pasos
debe ser incapaz. Si está deshabilitado
para tu cuenta, entonces debes habilitarlo. De lo contrario,
obtendrá un error SMTP. Ahora, después de que no puedas pasar la
verificación en la parte superior, busca una contraseña y abre
las contraseñas a en seguridad. Te verificará primero, bien. Ahora es nombre de la aplicación. Aquí podemos escribir nodo, Miller, SMTV o cualquier otro nombre, no
importa Lo único es en el futuro, si quieres eliminar la contraseña de
esta aplicación, entonces puedes recordar
ese nombre de aplicación. Ahora haz clic en Crear. Mira, aquí obtenemos contraseña de
16 dígitos, simplemente copia esta y
además puedes tomar captura de pantalla o hacer click en Foto en tu teléfono porque
una vez que la cerramos, entonces no podemos ver la contraseña. Copia esto y
pégalo en nuestro archivo ENV. Asegúrate de dejar
el espacio tal como está. No cambies nada
en esto. Y eso es todo. Aquí, nuestro paso dos está hecho. Ahora pasemos al paso
tres, que es probar. Entonces, antes de probar, asegúrate pasar el correo electrónico válido
en los datos de tu usuario. Si no pasas tu correo electrónico, entonces puedes modificarlo
desde el Mongo DB Compass Bien. Ahora abierto Cartero, y aquí enviamos primera
solicitud, restablecer contraseña API Ver, aquí vamos a restablecer token, y si revisamos nuestro terminal, obtenemos error. Conectar,
icono, rechazar. A lo mejor esto es un error
para una contraseña de una sola vez. Así que déjame intentarlo de nuevo. Aún así, me está dando el error. Así que déjame crear otra contraseña de
aplicación para nodemiler,
SMTP, crear y copiar esto
y asegúrate de hacer clic Ahora en nuestro archivo ENV, reemplace la contraseña,
guarde este archivo Ahora intentemos de nuevo. Enviar la primera solicitud. Aquí obtenemos token
y en el terminal,
vea, obtenemos el correo electrónico
enviado con éxito, y también obtenemos el ID del mensaje. Y si abro mi bandeja de entrada, mira, aquí me sale el nuevo correo electrónico. Eso es muy sencillo enviar
correo electrónico desde la aplicación de nodo. En resumen, puedes usar Amazon SES para aplicaciones de
tipo empresarial, y si tu
aplicación es pequeña, entonces puedes usar el método SMTP, pero solo nos dará
500 correos electrónicos en un día, depende totalmente de ti
cuál elijas
167. Lógica del seguidor y del seguimiento: Hoy en día, en cualquier aplicación de
redes sociales, hay seguidor y
siguiente característica es imprescindible. Entonces vamos a implementar
eso también en nuestra aplicación. Es posible que te asuste un poco esta función si
la estás implementando por primera vez. Pero créeme,
es realmente sencillo. Entonces, primero entendamos la lógica de seguidor
y seguimiento. Así que aquí están, que es el usuario de inicio de
sesión en nuestra aplicación. Y aquí hay otro usuario, digamos Harley y su estado
de perfil es público. Ahora, quieres seguir a Harley, así que presionas el botón de seguir. Ahora ¿qué pasó
en la parte de atrás? En primer lugar, para cada usuario, agregaremos tres nuevos campos
en el esquema del usuario,
seguidores, que es la matriz de usuarios que siguen a ese usuario. Aquí agregamos
ID de usuario como referencia. A continuación, agregamos el siguiente campo, que es el array de usuario
que es seguido por este usuario. Por fin, agregamos follow request, que también es array, pero en eso,
agregaremos todos los
ID de usuarios que envía solicitudes
para seguir al usuario. Agregaremos ID de usuario en esta solicitud de seguimiento solo si la cuenta de
usuario es privada. Ahora volvamos a nuestro ejemplo, supongamos que quiere seguir Hurley y Hurley
cuenta es pública En primer lugar, tu ID de usuario se agregará en la lista de seguidores de
Hurley Entonces el ID de usuario de Halley
agregará en su siguiente lista. Muy sencillo. Ahora aquí, cuenta de
Halley es pública ¿Y si configuramos su
cuenta en privada? En este caso, no podemos añadir tu ID de usuario en la lista de seguimiento de
Halley En este caso, agregaremos su ID de usuario en la matriz de solicitud de
seguimiento de Hal. Ahora Hali tiene dos opciones. Puede aceptar la
solicitud o rechazar. Si Ali rechaza, entonces simplemente
eliminamos su ID de usuario de la solicitud
AlisFollow Ahora bien, ¿y si Hali
acepta la solicitud? Después primero, eliminamos
tu ID de usuario de la lista de solicitudes y la
agregamos en la lista de seguidores. Y además, agregamos el
ID de usuario de Hale en tu siguiente lista. Entonces así de sencillo es
este seguidor y las siguientes características. Ahora en la siguiente lección,
definiremos AEI para estas características
168. Sigue al usuario: Ahora definamos API
para agregar seguidor. Como sabemos, la lógica
es muy sencilla. Entonces vamos a implementarlo rápidamente. Aquí en la parte inferior, agregamos router punto post
endpoint para reenviar slash Aquí, agregamos ID de usuario, así que Column user ID slash follow Este es el ID de
usuario del usuario al que queremos seguir. Además, necesitamos el ID de usuario registrado, así que agregamos aquí orth
middleware y acing function con
request Ahora dentro de esta función, en
primer lugar,
obtenemos este ID de usuario, por lo que Const ID de usuario es igual a solicitar punto
Perms dot ID de usuario Además, necesitamos const, usuario
actual es igual para
solicitar ID de subrayado de
punto de usuario punto En primer lugar,
revisaremos una condición. Si el ID de usuario es igual
al ID de usuario actual, entonces devolvemos la respuesta
con el código de estado 400 para la solicitud mala punto Json
Object, propiedad Message. No puedes seguirte a ti mismo. La primera lógica de seguir
API es que
comprobaremos que otra cuenta de usuario
es privada o pública. Para eso, llegamos a la información
del usuario. Así que contras usuario a seguir es igual a esperar usuario punto bien comprar ID. Y aquí pasamos ID de usuario. A continuación, pasamos tu condición. Si el usuario a seguir no
está disponible, devuelva la respuesta
con el código de estado 404 y Json a Object con la
propiedad del mensaje, Usuario no encontrado. Además, necesitamos encontrar información de usuario
actual. Entonces const usuario actual
es igual a esperar usuario punto Fine BD y pasar
aquí ID de usuario actual Y también pasa aquí,
la misma condición, así que duplica esta condición por Alt más tamizar más flecha
abajo u Opción tamizar
más
flecha abajo y mover esta línea debajo de la opción de retención
o alterar Y aquí simplemente cambiamos
este usuario a usuario actual. Ahora después de que obtengamos los dos usuarios, podemos pasar tu condición si
el usuario a seguir es privado. Si esto es cierto, lo que
significa que la cuenta es privada. La cuenta es privada, entonces necesitamos agregar el ID de usuario
actual en la solicitud de
seguimiento de otro usuario. Pero para eso, necesitamos agregar tres campos en
nuestro esquema de usuarios. Entonces en el esquema de usuario, por fin, agregamos seguidores llenos a
array, y dentro de eso, agregamos tipo de objeto al esquema de punto
Mangoose
tipos de punto punto ID de objeto, y ref al usuario Además, necesitamos seguir
y seguir la solicitud, que tiene el mismo
tipo de esquema y referencia de usuario. Justo aquí cambiamos siguiendo
y seguimos solicitud. Guarde este archivo, y
vuelva a nuestra ruta. Aquí, escribimos usuario a seguir, punto follow request, dot push. Y aquí agregamos el ID de usuario actual, y luego podemos esperar al
usuario para seguir punto save. Y aquí devolvemos respuesta
con mensaje JSON. A seguir, solicitud enviada. Bueno. Pero aquí hay una cosa. Es posible que el usuario
ya esté disponible en la matriz de solicitud de
seguimiento. Antes de este método push, añadimos condición I usuario para seguir punto seguir solicitud
punto incluye aquí, pasamos ID de usuario actual. Si el ID de usuario actual está
disponible en la matriz, entonces devolvemos el estado del punto de
respuesta, 400 puntos Json Object con MsATPperty para seguir Y después de eso, agregamos s, y podemos mover esta
parte en el bloque s. Entonces aquí escribimos
la lógica de agregar solicitud de
seguimiento si la
cuenta es privada, pero nuestra otra
cuenta de usuario puede ser pública. Después de esto, si agregamos Ls, si te estás confundiendo, entonces puedes escribir
comandos para eso. Escribo comentario aquí,
lógica para cuenta pública. Bueno. Ahora bien, ¿qué queremos
hacer si la cuenta es pública? Derecha, direccionaremos agregar ID de usuario
actual en
la lista de seguidores, y en la lista de
seguimiento de usuario actual, agregaremos el ID de usuario para seguir. Usuario para seguir
seguidores de punto dot push. Aquí agregamos ID de usuario actual, y después de eso, usuario actual, seguimiento de
punto, push de punto. Y aquí agregamos ID de usuario. Y después de eso, guardamos
estos dos documentos. Así que espera al usuario para
seguir dot save, y esperar al usuario actual dot save. Después de eso,
devolvemos respuesta con objeto
JSON con propiedad de
mensaje, usuario seguido con éxito. Ahora como lo hicimos anteriormente, podría ser
posible que
nuestro ID de usuario actual ya
esté disponible
en la lista de seguidores. Pasamos tu condición
antes de esta lógica. Si usuario para seguir seguidores de
punto, dot incluye aquí
pasamos ID de usuario actual. Si está disponible, entonces devolvemos respuesta
con código de estado, 400 para solicitud bat, y en el objeto Jason con propiedad de
mensaje para ya
seguir al usuario. Después de esto, agregamos s, y moveremos este
código en el bloque se. Eso es. Es realmente simple. Ahora vamos a probar esta
implementación. Entonces, para probar la API follow, necesitamos otra cuenta de usuario. Vamos a crear esto
primero, abrir la API de
usuario creada , cambiar el nombre de usuario, digamos, Hurley 001 y enviar un correo electrónico a Hali en
el gmail.com rojo Además, seguiré siendo
contraseña igual. De lo contrario, olvidaré la contraseña y
enviaré la solicitud. Ver, aquí obtenemos
el nuevo token de usuario. Aquí necesitamos este ID de usuario de
Hurley. Entonces por Mongoi nos brújula,
vamos a los usuarios y copiamos
esta nueva ID de usuario Volver a Cartero para seguir, creamos una nueva solicitud Siga API, método SDB, para publicar, URL a SDDP, Columna doble diagonal hacia adelante Host
local, Columna 3,000, slash API slash usuario
slash aquí pagamos el nuevo
ID de usuario ,
slash Necesitamos el token de usuario actual, así que vamos a la API de inicio de sesión, cambiamos la contraseña
porque la cambiamos en nuestra lección anterior
y enviamos la solicitud. Copia este token, y en nuestra API de
seguimiento, vamos a los encabezados, adherimos la autorización,
y en el portador de valor, el ritmo
espacial del token. Y enviar la solicitud. Ver, aquí conseguimos usuario seguido
con éxito. Seguimos directamente al usuario porque esa nueva
cuenta de usuario es pública. Ahora, probemos también
haciendo que esa cuenta sea privada. Entonces vamos al Mongo Di
BeCompasrFresh los datos. Primero, eliminamos el ID
de la siguiente lista. Y además eliminamos ID de
la lista de seguidores y también hacemos que esta nueva cuenta de
usuario sea privada a true y la actualicemos. Ahora, volvamos a seguir
API y enviar la solicitud. Ver aquí obtenemos seguir
solicitud enviada encantadora. Ahora en la siguiente lección,
crearemos API para aceptar la solicitud de seguimiento y rechazar la solicitud de
seguimiento
169. Acepta la solicitud de seguimiento: Definamos API para aceptar y rechazar
la solicitud de seguimiento En primer lugar, vamos a
implementar rechazar la solicitud porque
va a ser fácil de probar, así router punto post y punto
a slash rechazar la solicitud Ds, slash y aquí necesitamos
el ID de usuario solicitante Llame al ID del solicitante. Después de eso, también
necesitamos la vajilla
ortomddal Agregamos una función sing calve
con solicitud y respuesta. Ahora, antes que nada,
en esta función, obtendremos Costo, ID de
solicitante es igual a solicitar punto Perms ID de solicitante de
punto También necesitamos const, usuario
actual es igual
a solicitar el ID de subrayado de
punto de usuario punto bajo, que obtendremos
de este En primer lugar, comprobaremos si ambos usuarios están disponibles
en nuestra colección o no. Recuerda, hicimos lo mismo
en la API anterior. Aquí está, copia este código. Además, copie esta primera
condición para el mismo ID, y en la parte inferior,
péguela en nuestra API de rechazo. Aquí tenemos que hacer
pequeños cambios. Entonces en el lugar de ID de usuario, tenemos que agregar ID de solicitante, y aquí también ID de solicitante Y también, necesitamos cambiar el nombre de
esta variable así que
seleccione usuario a seguir, presione F dos y cambie
esto a usuario solicitante Nos dará más claridad. Ahora para rechazar la solicitud, solo
necesitamos
eliminar el ID del solicitante matriz de solicitudes Pero antes de eso, podemos
verificar si hemos solicitado ID en la matriz de
solicitudes de seguimiento o no. Entonces si el usuario actual punto
follow request punto incluye ID de solicitante, si esta condición no es verdadera,
pasamos aquí signo de exclamación, pasamos aquí signo de exclamación, y luego devolvemos
respuesta con código de estado
400 y punto JSON Object
con propiedad de mensaje dos, no se encontró ninguna solicitud de seguimiento Y sigo la solicitud se encuentra, entonces aquí podemos usar método de
filtro para eliminar el ID del
solicitante de la matriz Entonces Const,
solicitud actualizada es igual a usuario actual punto seguir
solicitud punto Filtrar Aquí agregamos ID, que es el elemento individual de esta función de flecha de matriz, y aquí devolvemos condición dt dos cadenas no es igual
a ID de solicitante Esto eliminará
el ID del solicitante de la siguiente matriz de solicitudes Simplemente podemos establecer solicitud de seguimiento de punto de usuario
actual es igual a la solicitud actualizada. Y luego esperamos al
usuario actual punto c. y por fin, simplemente
devolvemos respuesta con objeto
JSON con
propiedad de mensaje a seguir, solicitar, rechazado,
y eso es todo. Ahora vamos a probar esta API. Entonces abre Cartero, y aquí agregamos una nueva solicitud llamada rechazar
la solicitud de seguimiento Ahora en esto, establecemos el método API
para publicar y apuntar a SDDP, Columna doble para
slash, host local, Columna 3,000 API usuario slash rechazar solicitud slash aquí necesitamos pasar
el ID del solicitante,
que es el ID del
usuario que envió la Aquí abrimos Mongo Db Compass, y ¿me pueden decir qué
usuario envía una solicitud Correcto, es nuestro primer usuario, cuyo ID se agrega en la
matriz de solicitud de seguimiento de otro usuario. Así que copia este ID y
pégalo en la URL, y nosotros enviamos la solicitud. Oh, tenemos que pasar JWT Token. Ahora aquí necesitamos token del usuario que
recibe la solicitud, que es nuestro nuevo usuario. Entonces en la API de inicio de sesión, cambio el nombre de usuario a Hurley 001 y también cambio la contraseña
y envío la solicitud Copia este token. Y
en la API de rechazo, vamos a los encabezados, adherimos la autorización, y valoramos al
espacio portador, el ritmo del token. Ahora enviamos la solicitud. Ver, aquí obtenemos
solicitud de seguimiento rechazada. Como si revisáramos nuestra base de datos,
actualice la colección. Ver, para el segundo usuario, no
obtenemos ningún ID en
la siguiente solicitud. Aquí, nuestra
API rechazada está funcionando bien. Ahora podemos definir API para
aceptar la solicitud del usuario. Esta API es muy similar a
la API de solicitud rechazada, por lo que copiamos toda la API
y la pegamos a continuación. Bueno. Ahora aquí, primero cambiamos el punto final para aceptar como
solicitudes ID de solicitante Después de eso, si
aceptamos la solicitud, también
necesitamos eliminar ID del
solicitante de la
siguiente matriz de solicitudes Así que mantenemos nuestro código tal como está. Pero después de eliminar
el ID de solicitante, necesitamos agregar el
ID de solicitante a la lista de seguidores Eso significa que estamos aceptando
la siguiente solicitud. Entonces, antes del método save, agregue el usuario actual dot
followers dot push. Aquí empujamos el ID del solicitante, y también necesitamos agregar el ID de usuario actual en la
siguiente lista de usuarios del solicitante Así que el usuario solicitante, punto
siguiente punto push. Aquí empujamos el ID de usuario actual. Ahora también esperemos al
solicitante usuario punto save. Por fin, cambiamos el
mensaje para seguir solicitud, aceptado, y eso es todo. Ahora probemos también esta API. Así que volvamos a Cartero y aquí necesitamos la misma
petición como rechazo Para que podamos duplicar la API de
sabor desde aquí, cambiar el nombre para aceptar
la siguiente solicitud. También punto final para aceptar
como ID de solicitante de solicitud. Y si revisamos
los encabezados, mira, aquí también obtenemos ese token, y por eso
duplicamos esta prueba. Ahora, vamos a enviar
esta solicitud de API. Ver, aquí
no obtenemos ninguna solicitud de seguimiento encontrada porque acabamos de
rechazar la solicitud de seguimiento. Aquí necesitamos enviar de nuevo la solicitud de
seguimiento. Para eso, vamos a seguir API y enviar la siguiente solicitud. Solicitud enviada, buena. Ahora vuelve a aceptar solicitud
API y enviar la solicitud. Ver, obtenemos
solicitud de seguimiento aceptada, y si revisamos nuestra base de datos,
actualizar la colección. Ver, aquí también obtenemos ID de usuario en la lista de seguidores y solicitamos nuestro ID se elimine de
la solicitud de seguimiento. Y aquí obtenemos el ID
en la siguiente lista.
170. Ejercicio: conseguir la lista de seguidores y seguirlos: Ahora es el momento de
poco ejercicio. En este ejercicio, quiero
que creen dos APIs. Una API para obtener la lista de
usuarios de otro usuario, y una segunda API para obtener la siguiente lista
de otro usuario. Si eres usuario uno, entonces puedes enviar solicitud
para obtener la lista de usuarios dos, seguidores
y siguientes. Aquí nuestra API se ve así. ID de usuario de la API de Slash, seguidores de
slash. Slash siguiendo
para la siguiente API. Piensa primero en la lógica
y luego ponla en práctica. Es realmente simple. que puedes completar este ejercicio. Intenta resolver esto y
luego cuál es la solución. Espero que completes este ejercicio o intentes
resolver este ejercicio. Te agradezco por eso. Ahora veamos la solución. Entonces aquí agregamos
router dot Obtener y apuntar para cortar Colin user
ID, slash Este es el ID del usuario cuya lista de seguidores el usuario de inicio de
sesión quiere ver. Entonces necesitamos middleware y luego asing función de devolución de llamada
con solicitud Ahora dentro de esta función, primero, obtenemos costo ID de usuario es igual a solicitar punto
Perms punto ID de usuario Además, necesitamos costo, usuario
actual, es igual a solicitar punto
usuario punto guión bajo ID Ahora entendamos
la lógica de esta API. Deberíamos mostrar la
lista de seguidores de cualquier usuario no. Solo puedes ver la lista de seguidores de aquellos
usuarios, a quienes sigues o cuya
cuenta es pública. Aquí, necesitamos la lista actual de seguidores de
usuarios y otros usuarios es propiedad
privada. Nuevamente, copiamos el código de ambos
usuarios de la API anterior y lo
pegamos en esta API. Ahora aquí cambiamos
el nombre de la variable a usuario y cambiamos este ID de
solicitante a ID de usuario Bueno. Ahora, después de esto, podemos pasar condición si usuario
dot followers dot incluye, aquí pasamos el ID de usuario actual. O el punto de usuario es privado es falso, lo que significa que la
cuenta de usuario es pública. Si alguna de esta
condición es cierta, entonces mostraremos a
los usuarios la lista de seguidores. Devolver respuesta dot Json, y aquí pasamos
usuario dot followers. Agregamos, y en eso
devolveremos respuesta punto Estado 400 punto Jon, pasa tu Objeto con propiedad de
mensaje, Gant, Obtener lista de seguidores,
cuenta es privada Ahora hagamos esta
implementación, guardemos los cambios
y abramos cartero Aquí, creamos una nueva solicitud llamada Lista de
seguidores de Getting Users. Aquí agregamos URL, SDP, Columna doble cuatro slash, host
local, Columna 3,000,
slash API, slash ID de usuario,
y por fin, agregamos seguidores de slash y por fin, agregamos seguidores Ahora de vuelta a la base de datos Mongo DB, copia este segundo ID de usuario, que tiene seguidor y
pega este ID en la URL Ahora en esta API, necesitamos pasar token.
Así que ve a los encabezados. Aquí agregue autorización y
valor al espacio portador. Y aquí, tenemos que
pasar otro usuario Token que esté siguiendo
este ID de usuario. Así que volvamos a la API de inicio de sesión, y aquí simplemente
iniciamos sesión con cuenta antigua, cambiamos la contraseña,
y enviamos esta solicitud. Ver, aquí obtenemos token, copiamos esto y
lo pegamos en nuestro encabezado API. Bueno. Ahora envía la solicitud. Mira, aquí obtenemos la matriz
con el ID del seguidor. Pero como sabemos, en
el mundo real, necesitamos mostrar el nombre de usuario, así que tenemos que poblarlo Para eso, en nuestra consulta fina, teníamos
método populatet al principio, pasamos fill name que
queremos poblar,
que es followers, y
luego pasamos fills name,
que queremos obtener
de la referencia, que es underscore
ID Ahora aquí hay una cosa. Aquí, poblamos la lista de seguidores Entonces ahora no es lo mismo que antes. Será una matriz de objeto con ID de guión bajo y
campos de nombre de usuario en cada objeto Entonces no podemos pasar aquí,
esto incluye método. Podemos usar el método de índice fino que usamos en los proyectos
anteriores, y también escribir aquí diferente
condición, usuario actual, punto siguiente punto incluye, y aquí pasamos ID de usuario. Entonces, si el usuario actual está
siguiendo al otro usuario, entonces también podemos obtener
esa lista de seguidores. Guarda los cambios
y echa un vistazo. Enviar la solicitud. Ver aquí obtenemos la siguiente lista
con ID y nombre de usuario. Ahora, vamos a crear otra API y la adivinaste correctamente, vamos a duplicar esta
API y en la parte inferior, agregamos aquí Ahora aquí solo necesitamos
cambiar las pequeñas cosas. Entonces, antes que nada,
cambiamos el punto final para cortar el ID de usuario,
slash siguiente Entonces aquí en la consulta del usuario, necesitamos rellenar el
siguiente campo, entonces esta condición será la misma y cambiamos el
mensaje a siguiente lista, cuenta es privada,
y ya está hecha Ahora en la siguiente lección,
definiremos API para
dejar de seguir al usuario
171. Ejercicio: deja de seguir al usuario: Déjame darte
otro ejercicio. En este ejercicio, hay
que crear API para dejar de seguir al usuario Entonces nuestro punto final API
se verá así. Usuario de la API de Slash, ID de usuario de slash
, slash dejar de seguir. Es realmente sencillo, dedique algo de tiempo y
resuelva este ejercicio. Y después de eso, vuelve
y mira la solución. Ahora
veamos rápidamente la solución. Así que aquí escribimos router punto
Post y 0.2 slash Columna, ID de
usuario, slash Además, necesitamos la función
de devolución de llamada Omidleware
ACN con solicitud y respuesta . Ahora aquí necesitamos
encontrar a ambos usuarios. Así que copia este código de inicio con ambas condiciones y
en nuestra API pasa este código. Ahora aquí no necesitamos este método de poblar,
así que lo eliminamos, y además cambiamos este
nombre de usuario a usuario para dejar de seguir Bueno. Ahora después de
obtener los dos usuarios, pasamos tu condición yo usuario
para dejar de seguir seguidores de punto, punto incluye
ID de usuario actual si no es cierto, y aquí agregamos signos de exclamación, y luego aquí devolvemos
respuesta con código de estado, 400 y en Jason, pasamos Mensaje de objeto al usuario no está disponible
en Y después de eso, podemos eliminar ID de usuario
actual
del usuario para dejar de seguir la lista de
seguidores Entonces usuario dejar de seguir
seguidores de Dart es igual a usuario dejar de seguir el método de filtro de puntos de
seguidores de Dart Aquí obtenemos cada ID, y aquí devolvemos la condición ID, punto dos cadena no es
igual al ID de usuario actual. Además, usuario actual,
seguimiento de puntos es igual
al usuario actual, seguimiento de
puntos, filtro de puntos. Aquí obtenemos la función de flecha ID, y la cadena ID dos
no es igual a ID de usuario. Ahora podemos guardar ambos documentos, esperar al usuario para dejar de seguir punto c y esperar al usuario
actual punto C. Y aquí devolvemos respuesta punto objeto Json con propiedad de
mensaje, usuario dejó de
seguir con éxito Y hecho. Ahora podemos saborear
esta implementación. Entonces un cartero y aquí
duplicamos esta API de seguimiento. Cambiar el nombre para dejar de seguir API. Ahora cambiemos el
punto final a slash user,
slash ID, slash unfollow
y envíemos la solicitud y Ver, aquí obtenemos usuario de mensaje de
éxito, dejó seguirse con éxito Entonces así es como
implementamos seguidores, siguiendo solicitud
y rechazamos API. Se puede ver que es realmente sencillo. Necesitamos entender la lógica antes de
implementar nuevas funciones.
172. Sección 14: introducción: Bienvenido a la sección 14
del curso ultimate no JS. En esta sección,
implementaremos funciones relacionadas con la
publicación como publicar una nueva imagen o video, mostrar publicación, eliminar
la publicación completa. Además, agregaremos
me gusta y a diferencia redacción de un
nuevo comentario en la publicación, contestando los comentarios,
y muchas más cosas Esta es una sección importante, así que comencemos esta sección.
173. Crear modelo de publicación: Primero vamos a crear el esquema de post antes de crear APIs para post. En la carpeta models, creamos un nuevo archivo
llamado post dot js. Ahora ve al archivo del módulo del
usuario, copia todo el código de aquí y pégalo en
el archivo post modelo. Ahora, antes que nada, vamos a
eliminar este
objeto de esquema y Como necesitamos
cambiar algún nombre aquí. Se como este esquema de usuario
y renombrar esto por F para publicar el esquema y presionar Enter Ahora seleccione usuario, y para
seleccionar varias veces, presione Control más D o Comando más D y cámbielo para publicar. Ahora solo tenemos que
agregar el objeto Schema. En el post documento,
necesitamos un par de cosas. En primer lugar, necesitamos usuario, que es el ID de usuario que
publicó imagen o video. Así que escriba a Mongos punto esquema
punto Tipos punto ID de objeto, ref al usuario, y
requerido a true A continuación, necesitamos medios de comunicación. Puede ser imagen o
puede ser video. Además, puede ser uno
o más de uno. Así que agregamos aquí array, y en eso, agregamos object, first property name to object, type to string, and
required tou true. Y otra propiedad, media, type to object, type to string. Num a array, aquí agregamos imagen, o puede ser video. A medida que lo hacemos requerido para dibujar. Por este esquema, obtenemos una
comprensión adecuada sobre los medios de comunicación. A continuación, los usuarios pueden agregar
subtítulo con la publicación, escribir a cadena y soñar con true para
eliminar espacios en blanco, o también podemos eliminar
esta propiedad de stream. Los usuarios pueden agregar cualquier
tipo de subtítulos. Además, no lo estamos
haciendo obligatorio porque al usuario podría no
gustarle agregar ningún título. Después de eso, agregamos s, que es array, y también aquí nos quedamos la
referencia del usuario. Entonces copiamos esta propiedad tipo
y ref del campo de usuario
y la pegamos aquí. Bueno. Ahora agreguemos algunos campos
adicionales como textos, que también es array,
escriba a string. A continuación, también agregamos ubicación, tipo a cadena, y eso es todo. Actualmente, necesitamos estos rellenos. Si en el futuro, necesitamos
algunos otros rellenos, entonces lo agregaremos en
las próximas lecciones. Además, añadiremos comentarios
rellenados más adelante en esta sección. Así que no te preocupes por eso. Ahora déjame mostrarte una
cosa en el objeto de esquema. Anteriormente, recuerda que habíamos creado al rellenar nuestro proyecto. Pero en el esquema de Mongo, podemos agregar eso automáticamente Simplemente después de este objeto de esquema, tuvimos un segundo argumento en el método de
esquema, objeto, y aquí agregamos la
propiedad timestamp y la configuramos para drew Por esta propiedad,
obtendremos dos propiedades relacionadas con el tiempo, creado Ed y actualizado Esta es la
hora actual en que
se creó el documento y en ED actualizada, obtendremos fecha y
hora de la última actualización. No te preocupes, lo
veremos cuando creamos un nuevo post y
lo haremos en la siguiente lección.
174. Crea una publicación nueva: Vamos a crear una API
para crear una nueva publicación. En la carpeta rutas, creamos un nuevo archivo llamado post dot js. Aquí, necesitamos Router, Cost Express es igual
a requerir Express. Y después de eso, costo Router es igual a express dot Router. Al final, simplemente el módulo exportaciones de
punto es igual a Router. Ahora vamos a configurar este
router en nuestro archivo principal. Así que en el archivo js punto índice, agregamos costo post ruta
es igual a requerir. Aquí vamos a la carpeta rutas, y en ese post. Ahora en la parte inferior, app dot g, prefijo para barra diagonal API, y en el segundo
argumento, agrega rutas de publicación Guarde este archivo, y ahora
podemos agregar rutas de correos. Entonces en el archivo post,
agregamos Router, qué método usaremos, derecho. Vamos a utilizar router punto post. Aquí agregamos forward less
para crear nuevo post. Además, aquí necesitamos ware
ortomidal porque
queremos solo iniciar sesión los usuarios
deben crear un nuevo post Y después de eso, agregamos función de devolución de llamada
AC con
solicitud y respuesta Ahora lo que queremos hacer en esta API queremos simplemente
crear un nuevo post documento, y almacenar esas imágenes y
videos en nuestro servidor local. Entonces para eso, necesitamos configurar Multer igual que lo hemos
hecho anteriormente Así pluma hasta el terminal y
escribir y pm instalar Multer en el rojo
1.4 0.5 dash LTso Ocho, Enter. Bien, minimice esta terminal y vamos a
implementar Multer. Entonces en el proyecto anterior, agregamos la configuración de Multer
en el mismo archivo de ruta, pero eso parece poco poco
poco profesional Entonces en este proyecto,
podemos configurar Multer en otro lugar y luego
importarlo en este archivo ¿Bien? Entonces en la carpeta config, creamos un nuevo archivo
llamado MulteruLoad dot js Sabemos que implementar
Multer es realmente sencillo. Solo tenemos que establecer el nombre del
archivo y podemos establecer el filtro de archivos para evitar la subida de archivos
innecesarios. Costo, post upload es igual
a Multer y dentro de esto, necesitamos pasar objeto de
configuración Primero, pasamos el almacenamiento, que se encargará de la ruta del
archivo y el nombre del archivo. Así que en la parte superior, creamos separado el almacenamiento const variable
es igual al almacenamiento en disco Mltert Y en esto, también pasamos
objeto con propiedades. Además, necesitamos ingresar a
Multer en la parte superior. Por lo que Const Multer es igual
a exigir a Multer. Bueno. Ahora en este objeto, agregamos primera propiedad,
destino. Y aquí obtenemos request, file, y CB tiene parámetros, función de
error, y dentro de esto, simplemente
llamamos función CB. Y en la primera posición, tenemos que pasar
error, que es nulo. Y en el segundo argumento, pasamos el camino, destino
de nuestros archivos de correos. Digamos que sube post. A continuación tenemos nombre de archivo, nuevamente, función de flecha
con request, file y CB y dentro de este, definiremos nombre de archivo específico
y único, igual que lo hicimos anteriormente. También se puede ver el código
de ese proyecto. Está totalmente bien.
Entonces Const timestamp es igual al punto de fecha ahora Por esto, obtenemos la hora actual. Después de eso, vamos a eliminar algunos caracteres y espacios
del nombre del archivo. Así costo nombre original es igual
al archivo punto nombre original. Por esto, obtendremos el nombre original
del archivo subido. Ahora en el nombre del archivo, puede
haber algo de espacio, así que es mejor
que reemplacemos ese espacio con el guión. Hará que la URL del
nombre del archivo sea amigable. Añadimos el método de sustitución de puntos. Aquí, primero agregamos expresión
regular es una
sintaxis de expresión regular, que es doble
slash hacia adelante entre estos, escribimos hacia atrás slash a para el
espacio y más para uno
o más espacios en blanco Al final de la expresión
regular, una G para bandera global, que asegura que todas las coincidencias en la cadena sean reemplazadas,
no solo la primera. Ahora, aquí pasamos
guión en códigos únicos. Esto significa que todo el espacio
se reemplazará por guión. Ahora bien, ¿y si en el nombre del archivo, también
obtenemos los caracteres
especiales También tenemos que eliminarlos. Agregamos otro método de reemplazo. Primero, ¿qué pasaremos? Escribir expresión regular por doble para nuestra diagonal
entre estas, escribimos expresión regular para obtener los caracteres
espaciales Aquí agregamos A a Z. También A a Z cero a nueve guiones Ahora queremos conseguir
otros personajes que no forman parte
de estos personajes. Serán nuestros personajes
especiales. Entonces, para invertir esto,
lo envolvemos entre corchetes, y después del primer
corchete, agregaremos Garret para inverso, y al final, también
agregamos G para bandera global Ahora queremos sustituir estos
caracteres especiales por nada. Sólo queremos eliminarlos. Por lo que nos adherimos solo códigos
sin nada. Ahora al final, mezclaremos esta marca de
tiempo y nombre de archivo
original. CB primero, pasamos
nulo por error, y segundo, escribimos impuestos. Aquí, agregamos corchetes Cali, sello de
tiempo, corchetes de dólar
Cali, nombre
original y hecho. Definimos destino y también nombre de archivo para
nuestro archivo subido. Ahora podemos simplemente pasar esta variable de almacenamiento aquí
en la función múltiple. Ahora después del almacenamiento,
pasamos el filtro de archivos en el que filtraremos
los archivos por sus extensiones. Por lo tanto, el filtro de archivo de costo es igual a la función de error
con tres parámetros, request, file y CB. Aquí comprobaremos
mientras sea válido o no. Entonces Const tipos permitidos
es igual a array, y aquí agregamos tipos de archivo Ahora, en nuestra aplicación de
redes sociales, el usuario puede subir imágenes
y videos también. Agregamos aquí imagen barra diagonal
JPEG, otra imagen, PNG. A continuación, imagen GIF y para video, agregamos videos MP four. Y también video slash MOV. También puedes agregar otros
tipos si quisieras. Ahora podemos simplemente
poner aquí condición I archivo Mme tipo es
de estos tipos, sólo entonces lo vamos a permitir, de lo contrario lo rechazaremos Si los tipos permitidos punto
incluye archivo punto tipo Mme, es cierto, entonces llamamos a
esta función CB y primero, pasamos null por error, y luego pasamos a través
para aceptar el archivo Ahora bien, si el tipo MM es otra
cosa, entonces estos tipos, entonces nos adherimos a condición y llamamos
aquí a la función CB. Al error, pasamos nuevo error, y aquí pasamos el
mensaje de error, tipo de archivo no válido, solo JPEG, PNG, GIF, MP cuatro, y MOV están permitidos para rechazar este
archivo, adherimos pausa. Ahora podemos simplemente pasar este filtro de archivo en el objeto
Multi config. Además, en el multer, podemos especificar el
tamaño del archivo usando la propiedad Limits Para las redes sociales,
podemos establecer límite a 15 MB. Yo usuario quiere
subir algunos videos, entonces ellos también pueden hacer eso. Tamaño del archivo del objeto a 15
en 1024 en 1024. Por esto, obtenemos el valor de bytes. Este es el límite para cada expediente. Si lo usamos para
subir múltiples publicaciones, entonces cada archivo tiene un límite
máximo de 15 MB, no para el
límite combinado, y listo Aquí, nuestro
método de post upload está listo, así que podemos exportarlo desde aquí. Las exportaciones de punto del módulo
son iguales a la carga posterior. Guarda este archivo, y
en nuestro archivo de rutas, aquí después de este
middleware orth, agregamos post, upload, see auto input works dot porque queremos subir múltiples
imágenes en Ahora con la primera posición, escribimos el nombre de relleno de entrada. Pasemos aquí los medios de comunicación. Desde el front-end,
necesitamos tomar archivo en entrada con fill
name media como este. Después de eso, pasaremos el número
máximo de expedientes, digamos diez, y ya está. Ahora podemos escribir lógica API. En primer lugar, aquí comprobamos archivo subido por el
usuario o no
porque si no hay medios, entonces no queremos guardar
el post en nuestra base de datos. Solicito o archivos no
están disponibles, o solicitar archivos de punto
longitud de punto es igual a cero. Si alguna de estas
condiciones es verdadera, entonces devolvemos error, respuesta, estado de
punto, 400 para
una mejor solicitud. Y en el JSON, agregamos
objeto con propiedad desordenado. Se requiere al menos
un archivo multimedia. Ahora, si hay medios disponibles, entonces almacenamos ese post
en nuestra colección de publicaciones. Entonces costo, nuevo post es igual a nuevo post Excelente auto input funciona, y aquí necesitamos pasar rellenos. El primero es que el usuario solicite
el ID de guión bajo de punto de usuario de punto. A continuación, tenemos caption, que obtendremos del cuerpo de
la solicitud. Por encima de esto, con
desestructuramos el cuerpo de la solicitud, y aquí obtenemos subtítulo Además, el usuario puede agregar
texto y ubicación. Ahora, en nuestro post,
agregamos caption a caption, o también podemos eliminar este texto a texto y
ubicación a ubicación. Solo necesitamos un
campo que es media, y ese es array of object, y ese objeto tiene
dos propiedades, name, que es el nombre del
archivo y tipo de medio, que es image o video. Por eso, cuando mostramos
ese medio en el front-end, entonces podemos decidir fácilmente
qué etiqueta debemos usar. Así que aquí tenemos que crear
esa matriz de objeto. Es realmente simple
Cast media es igual a solicitar archivos de
puntos mapa de puntos. Aquí, obtenemos el
archivo único en el parámetro, función de
error, y aquí simplemente
queremos reten un objeto Aquí en los corchetes de Gully, estamos escritos objeto, nombre a archivo, nombre de archivo de punto, y para tipo de medio, aquí tenemos que pasar condición Archivo punto tipo mime, punto comienza con códigos
dobles, imagen Si es cierto, entonces
establecemos type a image, column, else, lo
configuramos a video. Este método, vamos a
obtener media array de objeto aquí en nuestro nuevo post, establecemos media a media. Después de eso, simplemente podemos
esperar nuevo post punto C. Luego devolvemos el estado del punto de
respuesta a 01 para crear nuevos datos. Objeto Dot Json con propiedad de
mensaje, publicación
cargada correctamente. A medida que volvemos un post a
nuevo post, y eso es todo. Probemos esta implementación. Guarde este archivo y abra cartero. Aquí, creamos una nueva carpeta llamada post, y dentro de esta, agregamos new request
upload a new post, cambiamos el método SDDP
a post y URL a SDDP Columna doble para
slash Host local, Columna 3,000 barra diagonal API barra
Publicar y enviar Ver, aquí obtenemos token requerido, vamos a la API de inicio de sesión y simplemente
generamos un nuevo token. Copia esto en nuestra nueva API, vamos a encabezado y
agregamos aquí nuevo encabezado, autorización al espacio de cerveza, y aquí pegamos nuestro token. Ahora envía la solicitud. Ver, aquí obtenemos al menos se requiere un archivo
multimedia. Ahora agreguemos también
archivo multimedia con esta solicitud. Recuerda desde qué
sección podemos enviar archivo, podemos enviar archivo desde
el cuerpo y los datos del formulario. Aquí en la clave, pasamos los medios
porque en nuestra API, definimos los medios aquí
en el método multer Ahora aquí seleccionamos archivo. Agregar un nuevo archivo desde
la máquina local. Enviemos dos
o tres imágenes cualquiera desde aquí y enviemos la solicitud. Ver, aquí obtenemos error, no hay tal archivo o
directorio AploadsPost Básicamente,
nos están diciendo que necesitamos
crear ruta de carpeta. En nuestro servidor, creamos una
nueva carpeta llamada uploads. Asegúrate de usar solo letras minúsculas porque
es sensible a mayúsculas y minúsculas. Ahora en esta carpeta de subidas, creamos otra
carpeta llamada Post Bueno. Ahora envía la solicitud. C, post subido correctamente. Aquí obtenemos nuevo
objeto post con usuario, Media también se ve muy bien
con nombre y tipo de medio, me gusta y etiquetas para
vaciar array y
también obtenemos marcas de tiempo creadas
en y subidas en Obtenemos esto tanto
porque en nuestro esquema, agregamos marcas de tiempo a true Así es como creamos un nuevo post. Ahora en la siguiente lección,
obtendremos post de la colección
post.
175. Obtén publicaciones de usuarios actuales: Ahora es el momento de
poco ejercicio. Aquí, tienes que
crear una nueva API para obtener todas las publicaciones del usuario iniciado sesión
actual. También en eso, hay que
implementar la función de paginación, igual que hicimos en el
proyecto anterior, API de productos Asegúrate de
mostrar primero las letras post y luego más antiguas. Sé que puedes hacer esto, probarlo y después de eso,
cuál es la solución. Ahora
veamos rápidamente la solución. Así que aquí en nuestra ruta post, añadimos otro router
punto GDNDPoEndpoint, digamos, recortamos Aquí, también agregamos Osmidalware y función
de devolución de
llamada ASN con solicitud y respuesta Osmidalware y función
de devolución de
llamada ASN con solicitud y respuesta. Aquí necesitamos obtener
para squary parámetros, que nos darán
página y límite El segundo objeto es igual
a solicitar consulta de punto. Y aquí obtenemos página y límite. Además, podemos establecer el valor predeterminado de
esta página y limitar. Entonces página a uno y
limitar a digamos diez. Si en el parámetro query, pasamos algo más, entonces reemplazará
estos valores. Además, como sabemos, cuando
obtenemos valores del parámetro
query, esos valores son string, por lo que necesitamos
convertirlos en enteros. Entonces aquí en el lugar de costo, escribimos let, y después de eso, page es igual a analizar integer, page, y después de eso, limit es igual a
parse integer, limit. Ahora podemos agregar consulta para post. Entonces const, post es igual
a esperar, post dot find. Aquí pasamos Usuario de objeto para solicitar usuario punto
punto subrayado ID Y aquí agregamos el método Skip. Esa página menos uno en límite, y también somos método limit, y pasamos aquí este límite, y también vamos a hacer esta línea. Y luego al final, simplemente devolvemos
respuesta dot Json y pasamos aquí este post. Ahora vamos a tasar esta
implementación. Guarde este archivo y abra cartero. Aquí, duplicamos esta solicitud, cambiamos su nombre para que se
inicie sesión en la publicación del usuario. También cambie el método
para obtener y URL a API post barra MI Post
y enviar la solicitud Ver, aquí tenemos el post. Actualmente,
solo tenemos un puesto, y por eso llegamos aquí
solo puesto, así que está funcionando. También, para mejorar esta
consulta, podemos hacer una cosa. Pase variable, que le dice a nuestro front-end allí siguiente
página disponible o no. Es realmente simple. Entonces aquí, después de que obtengamos nuestro post, creamos una nueva variable llamada una página siguiente es igual a aquí
pasamos condición si
esta longitud del punto de publicación es igual al límite actual, entonces es posible que
haya una página siguiente para post, así que pasamos aquí true si el tamaño actual del post
es menor que el límite, entonces en lo demás, pasamos false. Es una lógica realmente simple. Ahora en la respuesta Json, tenemos que pasar
objeto, post a post. Página a página, límite, a límite, y como
página siguiente a hass página siguiente Guarda los cambios
y echa un vistazo. Enviar de nuevo la solicitud. Ver, aquí obtenemos post, y si nos desplazamos hacia abajo, obtenemos una página siguiente a caídas porque el límite de
página actual no está lleno. Ahora en la siguiente lección,
veremos cómo
obtener publicaciones para nuestra página de inicio de redes
sociales.
176. Informaciones en casa: Vamos a crear API
para obtener post, que podemos mostrar en la pantalla de
inicio cuando el usuario
abra nuestra aplicación. Aquí agregamos otro
router punto GAD y punto a barra siguiente
porque en la página de inicio, usuario verá post quien
siguió por ella o él Aquí también necesitamos Osmidleware porque necesitamos que los usuarios
actuales sigan lista y también acando la función de
devolución de llamada con En primer lugar, en esta API, necesitamos encontrar la siguiente
lista de usuario actual. Segundos usuario es
igual a esperar usuario, punto fino por ID, y aquí pasamos solicitud
punto usuario punto subrayado ID Aquí solo queremos
siguiente relleno, así que seleccione punto, y pasamos
aquí siguiendo en códigos. Aquí obtenemos tres líneas, lo que significa que la
entrada automática no funcionó. Permítanme ingresar este
modelo de usuario en la parte superior. Costo usuario es igual a requerir. Aquí vamos una carpeta b
modelos y vamos a los usuarios. Bueno. Ahora para post consulta, podemos definir variable separada. Let query es igual a object. Dentro de esto, pasamos usuario, y aquí nuevamente
agregamos llaves. Ahora podemos usar el
operador Mongo Deb llamado $1 in, que se usa para verificar el valor
del ítem de la matriz Aquí pasamos usuario punto
siguiente, que es array. Básicamente, esto significa
así publicación de usuarios que están disponibles en el punto de
usuario siguiente matriz. Ahora a partir de esto,
simplemente podemos obtener post, así que Const, post es igual a esperar, publicar, dot find, y
aquí agregamos nuestra consulta Además, con esto, necesitamos
poblar al usuario que
subió esas publicaciones Entonces punto poblar y aquí
pasamos usuario relleno en
el segundo parámetro, pasamos qué campos queremos Así puntúa ID, nombre de usuario
y nombre de perfil. Si tenemos foto de perfil, entonces también podemos
poblar eso aquí A continuación, agregaremos short. Aquí pasamos objeto con
creado en propiedad, y los disparamos en orden
descendente, así que pasamos menos uno. Por estos, primero conseguimos nuevo post. Actualmente, no implementamos función de
paginación en esta
consulta, pero en el mundo real, necesitamos la función de paginación
porque en el mundo real, puede
haber cientos
o miles de publicaciones En ese momento, no podemos enviar
todos los correos en una sola solicitud. Hará que nuestro servidor sea lento. Así que aquí necesitamos la función de
consulta infinita en la parte superior, añadir objeto let es igual
a solicitar consulta de punto, y aquí desestructuramos la
página es igual a uno, y el límite es igual a diez Estos son valores predeterminados. Además, necesitamos
convertirlos en enteros. Página es igual a
analizar entero a página y límite es igual
a analizar entero, límite. Ahora en nuestra consulta, agregamos
Skip method y pasamos aquí la página menos el hueso al límite. Y también agregamos método limit, y pasamos aquí limit, y también al final, agregamos método len. Ahora, todo está genial, pero aquí hay poco
problema en esta API. Déjame explicarte
eso con el ejemplo. Supongamos que aquí tenemos 20 post y nuestro usuario envía API
solicitud para post. Nuestra API envía este
primer post de diez. Ahora cuando el usuario está
viendo esta publicación, posible que
cualquier usuario siguiente pueda agregar una nueva publicación
en la base de datos. Supongamos que cualquiera de los cinco siguientes
usuarios suben cinco nuevos post. Ahora cuando
el usuario actual quiere ver más post solicitud con el parámetro de consulta de la
página dos. En ese momento, nuestra consulta
omitirá los primeros diez datos de la base de datos porque la página
dos y mostrará este post. Aquí podemos ver duplicación de post porque este cinco
post agregó recientemente, y este es el tema. Ahora bien, ¿cuál es la solución aquí? Podemos usar aquí la paginación
basada en cursor. Déjame explicarte
con palabras sencillas. paginación basada en el cursor significa que obtendremos la publicación en
función de la hora Por ejemplo, aquí
está el usuario h él está en la página principal y envía
solicitudes para los primeros diez post. Ahora, desde el back end,
enviaremos diez posts y también enviaremos el último
post creado en el momento. Ahora cuando Harley quiera
otros diez post, entonces enviará ese
último post creado en el momento, que llamamos como cursor. Ahora podrías preguntar por qué
necesitamos este cursor. Usaremos este
cursor en nuestra consulta. Encuentra otros diez post cuyo tiempo de creación sea
menor que este tiempo de cursor. Por esto, no
obtenemos post duplicado, y además nuestra paginación
funcionará sin problemas Esta técnica se llama como paginación basada en
cursor. Esta técnica se usa
muy a menudo cuando los datos que queremos están agregando muy
rápidamente como las redes sociales. Ahora vamos a implementar
esto en nuestra consulta. En primer lugar,
devolveremos el cursor en la respuesta para que lo
entiendas correctamente. Aquí después de nuestra consulta, agregamos costo siguiente
cursor es igual a. Aquí pasamos condición, longitud del punto del
poste es
mayor que cero. Si es cierto, entonces volvemos el
último post creado en la Tate. Así poste, corchete, poste de longitud de punto menos uno. Por esto, obtenemos el último post, punto creado en, devolvemos nulo. Ahora al final, agregamos respuesta punto Json
aquí agregamos objeto, post a post, y siguiente
cursor al siguiente cursor. Bueno. Ahora,
agreguemos este cursor en nuestra consulta porque esa es la razón por la que estamos
enviando este cursor. Entonces, cuando enviemos este siguiente
cursor al front-end, nuestro front-end
enviará este siguiente cursor en la siguiente solicitud de publicación. Entonces en el parámetro body o
query, obtenemos el cursor
que envía front end. Y ahora simplemente agregamos
este cursor en nuestra consulta. Aquí la consulta creada en es
igual a los corchetes de Coli. Aquí pasamos Operador dólar LT, que es el menor que,
y pasamos aquí nueva fecha. Y aquí pasamos cursor. Ahora aquí tenemos que
manejar situación de quemadura. Solicitud de primer post, no
habrá cursor. Entonces pasamos aquí condición
si el cursor está disponible, sólo entonces agregamos esto
creado en la consulta. Entonces sin cursor, nuestra
consulta se verá así. Y con cursor, nuestra consulta se verá así,
simple como eso. También podemos pasar aquí
tiene propiedad de página siguiente. Así que copia esta línea de la API anterior y
pegarla en nuestra API. Y al final en objeto de
respuesta, agregamos hasNext page
to hass next Ahora, vamos a esta
implementación. Abra Cartero, duplique
esta última consulta. Cambiar su nombre a
conseguir siguiente, post. Además, cambiamos la URL a API post slash siguiente
y enviamos la solicitud Ver, aquí no obtenemos post porque nuestro usuario actual
ha subido el post, no ninguno de sus siguientes. Entonces aquí necesitamos agregar
otro token de usuario. Vaya a API de inicio de
sesión, inicie sesión con otra cuenta de
usuario. ¿Cuál es el nombre de usuario y
contraseña de otro usuario? Déjame recordar sí, es h001 y la contraseña
está establecida en 128 Sí, obtén este token, copia esto, y en nuestra
API actual en el encabezado, reemplazamos este token
y enviamos la solicitud. Aún así, no conseguimos post. Déjame comprobar quién sigue a quién. Oh, aquí, nadie sigue a nadie. Entonces para hacer este dic, copio este ID de usuario actual, cual loguimos y dits ID en los seguidores
del usuario anterior Y también copia este ID de usuario y d él en el
siguiente listado de usuario actual y actualízalo. Ahora, volvamos a enviar
esta solicitud. Mira aquí obtenemos post, y además obtenemos siguiente cursor, que es el creado a la fecha
del último post y tiene página
siguiente a caídas, esto quiere decir que está
funcionando correctamente.
177. Eliminar la publicación: Vamos a crear una API
para eliminar el post, así Router, dot delete, y aquí agregamos barra diagonal, columna, post ID, que
es el parámetro query Además, necesitamos middleware porque solo
los usuarios autorizados pueden eliminar su publicación Y por último, agregamos función de devolución de llamada
ASN con
solicitud y respuesta Bueno. Ahora, en primer
lugar, en esta función, obtenemos const post ID es igual a solicitar punto
PRM, punto post Además, obtenemos costo
userid es igual a solicitar punto usuario
punto subrayado Ahora aquí en esta API eliminada, advertimos que solo el usuario que creó la
publicación puede eliminar la publicación. Entonces para eso, necesitamos
encontrar al usuario de este post. Costo post es igual a
esperar post punto Fine By ID. Y aquí pasamos post ID. Pasamos condición I
post no está disponible, entonces devolvemos respuesta
con código de estado 404, y en Jason, Object, message property
two, post not found. Ahora bien, ¿y si encontramos post? Entonces tenemos que verificar el usuario de inicio de sesión
actual es el autor de
este post o no? Así que si post punto usuario, que es el objeto ID a sring no
es igual a ID de usuario, entonces volvemos a devolver
respuesta con código de
estado 403 por
error no autorizado en el Jason, agregamos objeto con propiedad de
mensaje no autorizado
para eliminar este post Ahora bien, ¿y si usuario y
autor también son iguales? En ese caso,
primero necesitamos eliminar las imágenes o videos
de esa publicación, y luego podemos eliminar
el post documento, ¿verdad? Así que aquí tenemos que correr para cada bucle porque
nuestro medio es array, supuesto punto media punto para cada uno. Aquí obtenemos un solo objeto de archivo, función de
flecha, y aquí
ejecutamos nuestra lógica para cada archivo. En primer lugar, necesitamos
la ruta del archivo de la imagen o video
porque por eso solo, podemos eliminar ese archivo.
Es realmente simple. Para path, necesitamos módulo path. Entonces Const path es igual
a requerir path, que es el
módulo incorporado del nodo Ahora en la parte inferior, la
ruta del archivo de costo es igual a la unión de puntos de ruta. Primero, agregamos subrayado
subrayado Dname y también coma
agregamos nombre de punto de archivo, que es una propiedad de nombre No estoy seguro de este camino. Así que vamos a consultar dot
log esta ruta de archivo. Y en la parte inferior, simplemente
devolvemos respuesta dot json, Object with mide
property, post, deleted successfully just
for checking this path. Guarde este archivo y abra cartero. Aquí duplicamos esta entrada de
usuarios
consiguiendo iniciar sesión porque en esa API, tenemos token del usuario
que creó esa publicación. Aquí, cambiamos el nombre de la
API para eliminar, la publicación, cambiar el método ,
eliminar, y en API endpoint, lo cambiamos a
API post ID. También copiemos el ID de publicación de la API anterior,
enviemos la solicitud, y aquí en la
parte inferior, obtenemos el ID, copiamos y lo pegamos
en nuestro punto final de API. Y enviar la solicitud. Ver, aquí conseguimos que la publicación
se elimine con éxito. Y si revisamos nuestro terminal, vea, aquí obtenemos la ruta del archivo. Ignorar el primer camino porque es subrayado
subrayado, querida Solo para ver aquí, obtenemos rutas de
barra diagonal nombre de archivo, que es nuestra ruta de
carpeta actual, pero no queremos agregar Entonces aquí entre Fecha
Nombre y nombre de archivo, agregamos códigos dobles,
periodo, periodo. Guarde este archivo y
enviemos la solicitud. En el terminal de código VS, C, se elimina la ruta. Ahora solo necesitamos agregar subidas de
barra diagonal porque
ese es un camino de nuestro post Antes de este nombre de archivo, agregamos publicación de cargas de barra diagonal, guardamos los cambios y volvemos
a enviar la solicitud Si revisamos nuestra terminal, vea aquí obtenemos nuestra ruta de archivo. Entonces así es como puedes probar
el código usando Console. Siempre hago eso
cuando estoy confundido. Yo solo comento la lógica
de la base y luego pruebo la API. De esa manera, no necesitamos crear y eliminar datos
de la base de datos. Así que llegamos aquí ruta de archivo. Ahora solo necesitamos eliminar
ese archivo usando el módulo de archivos. Ya lo hicimos en
nuestro proyecto anterior. Así que aquí, quita la
Consola y agrega aquí, prueba y captura el blog. Y en caché, añadimos error de punto de
consola en Batis pasamos error
en borrar archivo, dolares Coli corchetes, ruta de archivo, y además registramos este objeto de error Ahora en el drilog simplemente
esperamos fs punto desenlace y aquí
pasamos ruta de archivo Para usar esperar, necesitamos
hacer esta
función de devolución de llamada asíncrona, y también necesitamos importar
Fs desde el módulo incorporado Entonces Const Fs es igual a requerir promesas de
Fs porque eliminar
el archivo es una operación asíncrona Y después de eliminar el
archivo del servidor, podemos eliminar el post documento. Así que espera post punto Eliminar uno porque ya traemos
post en la parte superior. Y hecho. Guarde los genes y envíe nuevamente
la solicitud de eliminación. Ver aquí podemos publicar,
eliminarlo con éxito. Y si revisamos nuestros
archivos Bend en la carpeta post, también se eliminan las
imágenes.
178. Para comentar en la publicación o para diferenciarte: Vamos a crear API para
y a diferencia de la publicación. Es realmente simple. Si en la matriz, ID de
usuario no está disponible, entonces en eso agregamos el ID de usuario, lo que significa que nos gusta el post, y si el ID de usuario
ya está en la matriz L, entonces para a diferencia del post, solo
necesitamos eliminar el ID de
usuario de esa matriz. Agreguemos la página del punto del router. Aquí, agregamos endpoint
a slash column, post ID, slash L. Esta es la misma API que usaremos
para y a diferencia del Comma ORT es función de devolución de llamada
con solicitud y respuesta. Ahora, primero, obtenemos
post ID es igual a solicitar punto
PRM, punto post ID, y además obtenemos costo ID de
usuario es igual a solicitar punto usuario
punto subrayado Ahora, primero, nos encontramos con
el post, así Const, post es igual a esperar
post punto Fine By ID, y pasar post ID Después de eso, verificamos el estado. Si post no está disponible, entonces devolvemos respuesta
con código de estado 404, y en el Jason, pasamos objeto con propiedad de mensaje
para publicar no encontrado. Ahora, si la publicación está disponible, entonces verificamos al usuario ya
le gusta el post o no. Entonces Const ya me gustó es
igual a publicar me gusta de
punto, dot incluye, y
aquí pasamos ID de usuario Ahora en base a esto, podemos pasar
condición, costo, actualizado, post es igual a ocho, post dot fine By ID, y actualizar. Primero, pasamos el ID del post, y ¿me puedes decir qué
pasaremos en el
segundo argumento? Bien, pasamos las actualizaciones. Entonces aquí pasamos condición. Ya me gustó es verdad, entonces tenemos que quitar los similares. Entonces para eso, en objeto, usamos el operador Mongo Di Be, que es dólar pull to object Y aquí agregamos
likes al ID de usuario. Y si ya me gustó es falso, pasamos aquí a y
aquí en el objeto, agregamos otro método Mongoib, dólar en para establecer en objeto,
es al ID de usuario La razón que agregamos aquí en para establecer porque solo agregará
ID de usuario si no está disponible, no duplicará
el ID de usuario en s. Ahora en el tercer argumento, pasamos objeto con nuevo a true. Esto nos dará datos actualizados. Al final, simplemente devolvemos punto de
respuesta Json Object
con propiedad de mensaje. Aquí, comprobamos el estado. Ya me gustó es verdad,
entonces pasamos por aquí, post a diferencia de lo demás
pasamos post like y ademas podemos devolver likes a post
actualizado punto
likes dot Length. Puedes devolver cualquier valor que quieras devolver de API. Ahora vamos semanalmente tis esta API. Un cartero, primero, necesitamos
crear un nuevo post porque
en la lección anterior, borramos nuestro único
post Ir a crear post API
enviar la solicitud. Mira aquí obtenemos post error, así que tenemos que seleccionar
imágenes nuevamente. Y enviar la solicitud. Ver,
aquí conseguimos nuevo post, copia su DNI. Eso nos hace falta. Ahora en nuestra carpeta de correos, creamos una nueva solicitud
llamada L y a diferencia de la publicación. Cambiar el método a página, y punto final a SDDP, columna doble para nuestro host local de
slash, columna 3,000 slash
API slash post, y aquí pegamos También en el encabezado agregar clave de
autorización y valor al token de copia de espacio
portador desde la API de inicio de sesión y simplemente pegarlo en nuestra API
y enviar la solicitud. Mira, obtenemos post like
y me gusta cuentan hasta uno. Ahora vuelve a enviar la solicitud. Mira, obtenemos post like y likes cuentan a cero, así que está funcionando.
179. Implementa la función de comentarios: Hoy en día, en casi
todas las aplicaciones de redes sociales, hay características para
agregar comentarios en la publicación. Es la manera de involucrar a la
gente para ese puesto. También implementemos
funciones de comando para nuestra publicación. En primer lugar, la pregunta es, ¿dónde estamos a la orden? Necesitamos agregar comando
en el esquema. Así que en el archivo post modelo, y aquí en la parte inferior, añadir comandos, que es
la matriz de objeto. Ahora, en lugar de escribir
todo el esquema aquí, podemos crear un
esquema separado para los comandos, y luego aquí agregamos referencia. Por eso, no nos confundimos. Entonces antes de este esquema, agregamos const comment schema is equal to new
Mongoose dot schema, y aquí en el objeto, pasamos el esquema de
comentario único En primer lugar, necesitamos
aquí usuario para objetar, escribir a Mongos punto esquema punto tipo
punto punto ID de objeto, y hacemos referencia al usuario
y también se requiere a True A continuación, necesitamos texto para objetar, escribir a cadena, y también lo
hacemos requerido True. Después de eso, necesitamos creado en, que es el momento creó
ese
comando en particular. Así que escribe hasta la fecha y
por defecto hasta la fecha punto ahora. Ahora como sabemos, en redes sociales, el usuario puede responder al comando de
otros usuarios. ¿Deberíamos agregar esa respuesta
características en nuestro Linky fi o no? Hagámoslo también. Para las respuestas, agregamos otras respuestas rellenas, que es array, y
dentro de esta matriz, necesitamos definir el
esquema para cada respuesta. No te preocupes, es lo
mismo que este comando. Simplemente copie estas tres
propiedades y dentro de esta matriz, agregue objeto y péguelas aquí. Asegúrate de
agregarlo en el objeto, lo contrario, nos
dará error. Ahora tenemos esquema de comandos. Simplemente podemos agregarlo en la
parte inferior en el esquema ver, ahora podemos
ver fácilmente el esquema post sin confundirnos. Ahora vamos a crear API para agregar el nuevo
comando a la publicación. Es realmente simple. Así que aquí agregamos router punto post
y punto a slash columna, post ID, comandos slash Aquí, también necesitamos el ware
ortomiddal función
de devolución de llamada ASN con solicitud
y respuesta En primer lugar,
obtenemos costo post ID es igual a solicitar punto
PRMs punto post ID Además, obtenemos Cost
UserID es igual a solicitar punto usuario
punto guión bajo Entonces también obtenemos Const text es igual a solicitar
dot body dot text Antes de hacer nada, primero
verificamos si el texto no está disponible, luego simplemente devolvemos respuesta con estado 400 y yo Jason, pasamos objeto con propiedad de
mensaje para
comentar, se requiere texto. Ahora bien, si tenemos texto de comando, entonces necesitamos simplemente
crear un nuevo comando. Entonces costo, nuevo comentario
es igual a objeto, y dentro, tenemos que pasar usuario a ID de usuario y texto a texto. Entonces no necesitamos pasar la fecha de
creación porque
ya pasamos la fecha actual como valor
predeterminado en nuestro esquema. Ahora aquí necesitamos plantear este nuevo objeto comentario en
el array post commments. ¿Me puede decir qué
método vamos a utilizar? Sí, podemos usar aquí, multa por identificación y actualización. El costo de publicación es igual a esperar, publicar, punto, multa por
identificación y actualización. En la primera posición, agregamos post ID. En la segunda posición, tenemos que pasar lo que
queremos actualizar. Ahora para empujar el nuevo comando, utilizamos el método dollar push. Aquí le agregamos
corchetes Cully y en esos comandos a lo
que queremos empujar Wt este nuevo comando Y en el tercer argumento, pasamos objeto con nuevo a verdadero. Ahora bien, ¿me puede decir por qué
no usamos aquí en para establecer el método? Correcto, porque at para establecer
no permiten valores duplicados. Pero aquí, el comando
puede ser duplicado. Un usuario puede
atribuir comandos. No podemos negar eso,
y eso es todo. Al final, devolvemos respuesta
con código de estado 201. Nuevos datos, y devolvemos objeto
JSN con propiedad de mensaje para comentar agregado con éxito Y como podemos enviar comentario para publicar comandos de punto
en paquete cuadrado, publicar comandos punto
longitud menos uno, que es el último
comando que agregamos y hecho. Ahora, hagamos esta
implementación. Abre Cartero y duplica
esta API, cambia el nombre. Para crear un nuevo comando. Cambiar el método para publicar, y también apuntar a publicar
comandos ID y enviar la solicitud. Mira aquí obtenemos error
porque no pasamos texto. En el cuerpo, vamos a raw y aquí agregamos objeto
con propiedad de texto. ¿Qué debo comentar? Sí,
este es un gran producto. Aquí puedes agregar cualquier comando.
Ahora envía la solicitud. Mira aquí obtenemos comando, editamos con éxito, y aquí también
obtenemos letras comando. Ahora en la siguiente
lección, crearemos API para agregar respuesta
a este comando.
180. Agregar una respuesta a los comentarios: Ahora vamos a crear API para agregar respuesta a
un comando específico. Es
API muy similar a la anterior, así que router punto post,
barra diagonal, columna post ID, comandos slash, slash aquí también
necesitamos comentario ID porque en qué comando el usuario quiere agregar respuesta,
necesitamos encontrar Y después de eso, slash responde. Desplázate hacia arriba y copia toda
esta API con OT
y pegarla en nuestra API. Bueno. Ahora tenemos que
cambiar las pequeñas cosas aquí. En primer lugar, en los params, estamos recibiendo comentario ID también Vamos a desestructurar los parámetros de punto de
solicitud, y aquí obtenemos ID de comando Ahora en el lugar de nuevo comentario, nombramos esto a nueva
respuesta y en la parte inferior, cambiaremos el método
a uno fino y actualizaremos. Como usamos uno fino y
actualizamos, necesitamos pasar su objeto
condición en el primer argumento. Dentro de esto, pasamos ID de
guión bajo a ID de publicación. Y además le pasamos su
condición, códigos dobles, comentarios punto subrayado
ID para comentar ID Asegúrese de que escribimos el nombre de propiedad correcto
porque distingue entre mayúsculas y minúsculas. Además, podrías preguntar a
nuestros comentarios es array, y aquí estamos escribiendo comentarios punto subrayado
ID, ¿funcionará La respuesta es sí, funcionará
porque
en Mongo Di B,
utilizamos esta notación de puntos, utilizamos esta notación de puntos, lo que nos permite buscar a través de la
matriz de comentarios y encontrar
el primer objeto donde underscore
ID coincide con ID de comando Ahora en el método push
en el lugar de comandos agregamos
comentarios punto respuestas Aquí podemos usar comentarios punto dólar punto
rep. Ahora podría preguntarse, cuál es la diferencia entre comentarios punto respuestas y
comentarios punto dólar punto RPS Por lo tanto, el operador de dólar commens está optimizado para apuntar a un elemento específico
dentro de una matriz otro lado,
comentarios punto respuestas es para campo general. Déjame explicarte con ejemplo. Supongamos que este post
tiene diez comentarios, y queremos agregar respuesta
a este segundo comentario. Ahora bien, si usamos aquí
commens dot replies, entonces agregará reply
a todos los comandos No queremos eso,
por otro lado, si usas aquí comentarios
punto dólar punto respuestas, entonces agregará respuesta
solo al segundo comando,
y eso es lo que queremos. Recuerde siempre que si desea actualizar matrices anidadas elemento
específico, entonces necesita agregar
operador dólar entre ellos. Como commens dot
dollar dot respuestas. A este dólar se le llama
como operador posicional. Corto en Mongo DB, notación de
puntos funciona para buscar
y eliminar elementos, y se
necesita un operador posicional para modificar elementos de
matriz Ahora aquí en nuestro método de actualización, cambiamos este nuevo
comentario a nueva respuesta. Y también al final, cambiamos el mensaje para responder, editar con éxito, y
simplemente enviamos esa nueva
respuesta en nuestra respuesta. Entonces por encima de estos
agregamos el comentario de costo es igual a publicar comandos de punto,
que es la matriz. Ahora para obtener el comando
específico, necesitamos encontrar su índice. Entonces en vez de eso, en Mongoose, tenemos otro
método llamado dot ID Esto nos ayudará a encontrar un subdcument por su campo
ID de guión bajo dentro Solo tenemos que pasar
aquí comentario ID, pero asegúrate de agregar comentario
dot ID es método de mangos De lo contrario, en el futuro, te confundirás
al buscar este código. En la respuesta en el lugar
de mando, agregamos respuesta, y aquí pasamos
comando, respuestas de punto, corchete,
comando, respuestas de punto, longitud de
punto menos uno. Por esto, obtenemos la última
respuesta que acabamos de agregar. Guarda los cambios,
y probemos esta API de nuevo a Postman, y aquí duplicamos
este comentario API cambia su nombre para
agregar una nueva respuesta Ahora en endpoint, después de comandos
necesitamos agregar el ID de comentario. Vamos a copiar el ID de comentario de la API anterior y
pegarlo en nuestra API. Después de la identificación del comentario,
agregamos las respuestas de barra diagonal. Ahora cambiemos también el texto de
respuesta para agradecerles tanto y enviar la solicitud. Mira aquí obtenemos el mensaje de
éxito y también obtenemos la última respuesta. Para que veas lo sencillo que es.
181. Ejercicio: eliminar un comentario específico: Ahora es el momento de
poco ejercicio. En este ejercicio, hay
que crear una nueva API para eliminar el comando específico
de la publicación. Entonces nuestro APIURL se verá como este slash API
slash post ID, comandos slash, slash command ID, y tienes que eliminar este comando con este ID de
comando Además, asegúrese de que solo
el usuario que subió esa publicación o el usuario que agrega ese comando pueda
eliminar ese comando. No todos los usuarios pueden eliminar
comandos. Es realmente simple. Sé que puedes hacer eso, pruébalo y luego
ver la solución. Espero que resuelvas este ejercicio, y aunque te quedes atascado en alguna parte, no te preocupes, al menos intentas. Eso es lo que más importa. Ahora veamos rápidamente la
solución para este ejercicio. Aquí, simplemente duplicamos esta última API
porque es muy similar. En primer lugar, cambiamos
el método para eliminar. Además, desde el punto final, eliminamos las respuestas de barra diagonal
porque no las necesitamos. Ahora en la función, primero, no
necesitamos este texto. Además, no necesitamos
esta condición, y tampoco necesitamos
esta nueva variable de respuesta. En el método fino
y actualización, necesitamos agregar nuestra condición. Entonces primero es el ID de
subrayado para publicar ID, y ahora para encontrar el comando, y necesitamos asegurarnos de que usuario de inicio de sesión
actual debe
ser el autor de la publicación, o debería ser el
autor del comando Entonces aquí usamos
dólar u operador, y es una matriz de condición. Objeto, objeto. Aquí, nuestra primera condición debe escribir o la segunda
condición debe escribir. En primer lugar, comprobamos que usuario
actual es el autor
del post o no. Aquí agregamos
columna de usuario, ID de usuario, y para segunda condición, en otro objeto,
pasamos códigos, comms dot subrayado
ID para comentar ID,
códigos, commenst
user two user Lo que queremos hacer si alguna de
estas dos condiciones es cierta. Queremos extraer ese comando
de la matriz de comandos. Aquí en el lugar de empuje, utilizamos operador pull y de qué campo
queremos tirar. Sí, queremos
sacar de los comandos, y aquí pasamos la condición, qué artículo queremos sacar. Entonces en objeto, pasamos como
buen ID para comentar ID. Ahora no necesitamos esta
variable de comentario , y en la respuesta, simplemente devolvemos mensaje,
comentario, eliminado con éxito. Y también, devolvemos comandos para publicar comandos punto
y eso es todo. Aquí lo que creo que deberíamos
comprobar post se encuentra o no. De lo contrario, obtenemos directamente este mensaje sin
hacer ninguna eliminación. Entonces antes de esta respuesta, añadimos, publico no está disponible, luego devolvemos respuesta
con código de estado 403, y en el Jason,
pasamos mensaje a no autorizado o post
comentario no encontrado. Será útil. Guarde los cambios y probemos esta
implementación. Volver a Cartero. Y aquí, vamos a duplicar
esta prueba de API de respuesta, cambiar el nombre a eliminar un comando específico,
método, para eliminar. Y en el punto final, solo
necesitamos
eliminar estas respuestas
y enviar la solicitud. C comentarlo con éxito, y si volvemos a enviar
la misma solicitud,
vea, aquí nos sale el
error no encontrado, por lo que está funcionando Como puedes ver, crear
API no es difícil. Si la lógica es clara para ti, entonces puedes crear
cualquier tipo de API. Ahora hay muchas más
APIs para post y comentarios. No
los estamos creando todos porque como puedes ver, es repetitivo y si te
muestro todas las APIs una por una, entonces también te aburrirá Puedes definir APIs de acuerdo
a las necesidades de tu proyecto. Depende totalmente de ti.
182. Gestión de errores: Ahora actualmente en nuestro proyecto, no
agregamos manejo de errores. Así que abro aquí nuestro proyecto
anterior, Card Wish, y desde
el archivo js index dot, simplemente
copiamos esta variable
logger y también los dos manejadores de errores y en nuestra carpeta InkiFipject
in Config, creamos un nuevo archivo llamado logger dot js y
pise Ahora bien, en este archivo,
necesitamos este objeto Winston. Entonces en terminal, escribimos
NPM, instalamos Winston, a la tasa 3.17 0.0, y también necesitamos
Winston MongoDB,
a la tasa 6.0 0.0, a la tasa 6.0 Bueno. Ahora en la cima, costo, Winston es igual para
requerir a Winston Y también, necesitamos agregar requieren Winston Mongo DB para
iniciar sesión en la Ahora en nuestro registrador,
necesitamos cambiar esta cadena de base de datos para
procesar dot nw dot dB. Y al final, simplemente módulo de exportaciones de punto
es igual a logger. Podemos usar este registrador
en cualquiera de nuestros archivos. Entonces en el
archivo de perros índice en la parte superior, agregamos Const logger
es igual a requerir Vamos a la carpeta Config
y en ese logger. Ahora, del proyecto anterior, también
copiamos este
método de caché de Mongoose connect y simplemente
lo reemplazamos con nuestro método de caché Entonces desde el proyecto Cardwih, copiamos este middleware de
error personalizado para manejar errores en la solicitud de
API y lo pegamos en solicitud de
API y lo pegamos proyecto
Linky fi después de todas
nuestras Además, aquí podemos consolar error de
registro de puntos por simplicidad. Ahora podrías preguntar, no
necesitamos agregar esas funciones para manejar excepciones ungod y rechazos
UnhandlepMise Sí, aquí, no
necesitamos agregarlos en nuestro archivo index dogs porque cuando importamos
logger desde el archivo loggers, estos dos métodos
se
ejecutarán automáticamente porque se
configuran globalmente en este archivo Y por eso
llegamos aquí código limpio. Para que veas lo sencillo que es. Además, siempre agrego este archivo logger en
mi repositorio Github. Así que siempre que necesite este código de manejo de
errores, puedo obtenerlo directamente. Pero para entender
lo que hay dentro del código. Si lo sabes, entonces puedes usar cualquier código y hacerlo tuyo. Eso es todo para esta sección. En la siguiente sección,
aprenderemos características
muy interesantes en tiempo
real. Nos vemos en la siguiente sección.
183. Sección 15: Introducción: Bienvenido a la sección 15
del curso ultimate no JS. En esta sección, vamos a aprender sobre la comunicación en
tiempo real de nuestro back end a front end y también front end a back end. Esto va a ser divertido
porque también
probaremos nuestra implementación con
el front end así. Imagina que estos son dos usuarios
de diferentes computadoras y están conversando
entre ellos en nuestra aplicación inkifi Vea cómo funciona sin problemas. Nuestros dos usuarios están recibiendo mensajes en tiempo
real, y también cuando un usuario
está escribiendo mensaje, otro usuario obtiene
el indicador de mecanografía, lo que hace que la
experiencia del usuario sea una para chatear. Además,
implementaremos el chat grupal, y por eso, más de un
usuario puede chatear en grupos. Por lo que implementaremos
estas características en nuestro back end y
lo probaremos con el front end. Además, una cosa
que quiero aclarar es que
aquí no vamos a
crear front end desde cero. Es solo para degustación, para que puedas entender más sobre
estas características en tiempo real. Estoy muy emocionada por esta
sección y espero que tú también. Entonces comencemos.
184. Creación de chat: modelo de mensaje: Para crear la API Jet, primero, necesitamos crear la
colección o modelo Jet, quieras llamarlo. Así que aquí en nuestra carpeta de modelos, creamos un nuevo archivo
llamado chats punto js. Ahora, del modelo de usuario
anterior, copiamos todo el código
y lo pegamos aquí. Bueno. Ahora, primero, cambiamos el
nombre de la variable a esquema de chat. Además, eliminemos todo del objeto
de esquema y también cambiemos a este usuario
a chatear y listo. Ahora, definamos
el esquema de chat. Pero antes de eso, déjame
aclarar lo que es el chat aquí. El sombrero es como una habitación en la que dos o más usuarios pueden
comunicarse entre sí. En palabras sencillas en Instagram, ¿viste en el lado izquierdo, conseguimos que todos los chats se acorten
por el último mensaje Esos rellenos son chat. Pueden ser grupos o
pueden ser chats individuales. Lo que necesitamos para estas charlas. Actualmente, solo estamos
implementando chat uno a uno, así que no te preocupes por las funciones de chat
grupal. Solo piensa en uno a uno. Así que para el chat individual, podemos crear campo central, y también podemos crear campo
receptor. Y para ambos, agregamos tipo al esquema de puntos de
Mongos tipos de
punto, ID de objeto de punto, y ref al usuario Entonces supongamos que el usuario A envía
el mensaje al usuario B. Agregamos el usuario A como remitente
y el usuario B al receptor. Ahora aquí hay un gran problema. Supongamos que ahora el usuario B está
enviando mensaje al usuario A. Entonces el remitente será el usuario B
y el receptor será el usuario A. Esto creará un
nuevo documento de chat, y estos dos usuarios no
obtendrán el mismo chat por
hablar entre ellos. Ahora, ¿cuál es la solución aquí? Es realmente simple. Así que en el lugar de definir remitente y receptor
ambos por separado, podemos agregar un solo
campo para ellos. Como aquí, tuvimos participantes, que es la matriz y en eso almacenaremos el
ID de usuario de los participantes. Escriba los tipos de punto del
esquema de puntos de Mongos, ID de objeto de
punto y la referencia al usuario Si el usuario A envía un
mensaje al usuario B, entonces tenemos al usuario A y al usuario B, ambos ID en la matriz de
participantes, y si el usuario B envía un
mensaje al usuario
A, entonces también ambos ID están
disponibles en los participantes. De esta manera,
obtendremos un solo chat para que el usuario A envíe un
mensaje al usuario B, o el usuario B envía un
mensaje al usuario A. Este relleno de participantes se usa para buscar jets para un usuario específico Ahora, después de los participantes,
queremos fecha y hora. Para eso, simplemente podemos permitir marcas de tiempo sean verdaderas,
y eso es todo. Ahora podrías preguntar
¿qué pasa con los mensajes? Para los mensajes,
crearemos otro modelo. Así que copia este esquema, y en la carpeta models, creamos un nuevo archivo
llamado messages dot js y pegamos
aquí ese es schema. Ahora, primero, cambiamos el esquema de
chat a esquema de mensaje y
modelo de chat a mensaje. Bueno. Ahora definamos el
esquema para un solo mensaje. Entonces para el mensaje, primero, necesitamos su ID de chat. Así que escriba a Mongos esquema de
punto tipos de punto punto ID de objeto, y referencia a la colección de
chat, que acabamos de definir Ahora después de eso,
agregamos remitente que envió este mensaje y es tipo a ID de
objeto y referencia al usuario. Así que simplemente podemos cortarlo de los participantes y
pegarlo para el remitente. Ahora no necesitamos a
estos participantes. Después de eso, tenemos tipo de
contenido a cadena, y requerido a true. Este es el contenido del
mensaje o texto del mensaje que
los usuarios quieren enviar. Ahora después del contenido, lo que agregamos, sí, necesitamos estatus
de ese mensaje. Escriba a cadena um a matriz, y aquí definimos el
conjunto de valores como enviar, entregar y leer. Y por defecto,
establecemos el estado para enviar. En el futuro,
actualizaremos el estado cuando nuestro mensaje sea entregado o leído por otros usuarios,
y eso es todo. Además, para los mensajes, agregamos marcas de tiempo a true olvidando
la fecha y hora Ahora podrías preguntar por qué no
agregamos estos mensajes
en el modelo de chat. Podemos hacer mensajes para hacer arreglos y definir todos los mensajes
con su chat relacionado. Sí, podemos hacer eso, pero
una razón por la que no agregamos mensajes en el modelo de chat
porque en el modelo de mensajes, vamos a realizar agregar, actualizar y eliminar muchas veces. Agregamos mensajes en
el modelo de chat, entonces necesitamos tratar con datos
anidados realmente profundos, lo que puede confundirnos Y también, si agregamos
matriz de mensajes en el modelo de chat, entonces cuando
abrimos chat, tenemos que recuperar todos los
mensajes del back end, y eso es mucho más
datos en una sola solicitud Entonces, al separar los mensajes, solo
podemos enviar los últimos
diez o 15 mensajes, y luego si el usuario quiere
ver mensajes de chat más antiguos, solo entonces vamos a buscar otros mensajes usando la técnica de
Paginación Entonces por eso separamos
los mensajes del modelo de chat. Aquí en el modelo de chat, también
podemos agregar un relleno más. Último mensaje, que es escribir a esquema de punto
Mongos tipos de punto
punto ObjectID y ref
a Por esto, podemos mostrar
el último mensaje con chat y no necesitamos
encontrarlo de la colección de
mensajes. Ahora en la siguiente lección,
crearemos API para obtener la lista
de jet para usuario de inicio de sesión.
185. Cómo conseguir chats para usuarios: Vamos a crear API para obtener la lista de jet para usuario
conectado. Aquí en la carpeta rutas, creamos un nuevo archivo
llamado jets dot js. Ahora, primero, creamos Router, por lo que Cs Router es igual
a requerir Express. Esta expresión
devolverá Express Object, y aquí simplemente
obtenemos dot Router. Este es el código de una sola línea para estas dos líneas que
estamos usando hasta ahora. Al final, simplemente
exportamos esto con las exportaciones de
módulo es
igual a Router. Ahora lo que vamos a hacer,
también agregamos estas rutas
en el archivo de perros índice, presionamos Control más P y
vamos al archivo perros índice. Aquí agregamos costo rutas jet
es igual a requerir, vamos a la
carpeta rutas y dentro ella jets en la parte inferior, app dot U aquí agregamos prefijo API slash jets en
el segundo parámetro, agregamos rutas de jet y guardamos esto Ahora podemos definir nuestras APIs. Primero, queremos
conocer la lista de jets para usuario de inicio de sesión actual, router dot get endpoint
to forward slash, y aquí necesitamos Os Middleware porque solo los usuarios de login
pueden ver chats o Al final, agregamos la función de devolución de llamada
Asyn
con solicitud y respuesta Ahora dentro de esta
función de devolución de llamada, primero, obtenemos el ID de usuario de costo es igual
a solicitar ID de guión bajo de punto ID de usuario de
punto A continuación, podemos encontrar chat. El costo de los chats es igual
a esperar chat. Ver, auto input works
dot Encuentra y aquí
pasamos nuestra condición en
Participantes de objeto a ID de usuario. Aquí también podemos usar operadores de
Mongo Di Be, pero esto también funcionará Si no funciona,
entonces lo cambiaremos. ¿Cuál es el problema?
Ahora en la parte delantera, queremos mostrar
algo como esto. En primer lugar, el usuario que
recibe o envía mensajes. También el último mensaje, quiénes mandan el último mensaje, y en qué momento envían. Aquí necesitamos rellenar
los datos de usuario de los
participantes. Dot pueblar. En el primer argumento,
pasamos el nombre de relleno, que es los participantes, y el segundo argumento
es fill name, digamos, subrayado
ID y nombre de usuario Ahora también necesitamos la información
sobre los últimos mensajes. Nuevamente, poblar primero lo
que escribimos. Escribir, último mensaje, llenar nombre, y luego segundo, que llena necesitamos
del último mensaje. Primero, necesitamos remitente
que envió este mensaje. Siguiente contenido, el
texto del mensaje, y siguiente, se crea en. Aquí, si estás confundido
sobre el nombre de Phil, entonces también puedes ver Schema. Ahora aquí, un pequeño
reto para nosotros. Como podemos ver, estamos recibiendo remitente de
este último mensaje, pero también es ID,
no el nombre de usuario. Necesitamos el nombre de usuario de ese remitente. Entonces aquí podemos hacer así. Después de este método de poblar, agregamos otro método de poblar. Primero, agregamos el último mensaje dot sender
y el segundo argumento, agregamos fill name,
que es username. Ahora creo que esto parece
un poco confuso. Entonces hay otra manera de
escribir método de poblar anidado. Déjame mostrarte. Hasta
ahora en el método populate, pasamos dos argumentos En el primer argumento, pasamos el nombre de campo que queremos
poblar y en el segundo, pasamos las propiedades que queremos obtener
de la relación Esta es la primera forma. Para el método populatet
anidado,
podemos pasar aquí
el método podemos pasar aquí Ahora en vez de pasar
aquí los argumentos, podemos pasar objeto. Primero, en este objeto, pasamos la propiedad path. Esta ruta es un nombre de campo
que queremos rellenar, que es el último mensaje Y otra propiedad es selecta. Aquí, seleccionamos qué datos queremos obtener
de la relación. Digamos centrar el
contenido y creado en. Ahora aquí queremos volver a
rellenar los datos del remitente. Después de seleccionar, pasamos otra propiedad la
cual es poblar y aquí pasamos objeto con misma
ruta de dos propiedades y seleccionamos Camino a lo que agregamos
aquí, escribir remitente. No necesitamos escribir aquí
último mensaje punto Remitente porque ya estamos en el último mensaje
poblar método, y aquí pasamos
seleccionar a nombre de usuario Aquí, si quieres
ir más profundo, entonces también podemos pasar
otra propiedad poblar, por ahora no la necesitamos,
así que vamos a eliminar esto Ahora aquí, estos dos métodos de
poblar y este único
método de poblar anidado funcionan de la misma manera Me gusta este enfoque anidado porque es claro
y no confuso Si te gusta
primero, entonces ve a por ello. No te preocupes, depende
completamente de ti. Ahora después de poblar,
queremos mostrar jets en orden inverso
al último mensaje Pero aquí, ¿cómo podemos ordenar los jets? Es realmente simple. Ver
cuando alguien envía mensaje, como sabemos,
actualizaremos ese jet, propiedad del
último mensaje, y
cuando actualicemos esa propiedad, nuestros jets actualizados en la
propiedad se actualizan. Por lo que podemos abreviar por eso
actualizado en la propiedad. Entonces punto corto, y en objeto, pasamos actualizado a
valor a menos uno, y al final, devolvemos
respuesta dot json, Object con chats a estos
chats, y eso es todo. Actualmente, obtenemos la lista de
chat para usuario de inicio de sesión. Ahora, a continuación, cuando el usuario
abre un chat específico, entonces necesitamos mostrarles los
mensajes de ese chat. En la siguiente lección,
crearemos API para eso.
186. Recibir mensajes de chat específicos: Vamos a recibir mensajes de
un chat específico. Así punto exterior GT. Primero, necesitamos el
ID del chat, así que slash column, chat
ID, slash messages Además, necesitamos aquí o
middleware y por fin
está en función de devolución de llamada
con solicitud Ahora dentro de esta devolución de llamada, obtenemos costo chat ID es igual a, y desestructuramos
solicitud punto Después de eso,
los mensajes de costo es igual a esperar mensaje dot find. Simplemente aquí pasamos Identificador de
chat de objeto a ID de chat. Déjame comprobar que es
chat o chat ID. Sí, es ID de chat. Cuando estaba aprendiendo no
Jazz, esto me pasa a mí. Escribo mal
nombre de relleno en la consulta y paso casi un
día encontrando error, y por fin, verifico
el nombre de relleno. Así que asegúrate de que no te
pase a ti. Ahora aquí queremos poblar
estos datos. Así que el dardo pueblan. Y aquí queremos
rellenar remitente, y qué quieres obtener
subrayado ID, y nombre de usuario Ahora, después de eso,
queremos obtener los mensajes en orden
inverso porque así es como mostramos los mensajes
en el front-end. Así que ordenar aquí en objeto, pasamos creado en
a sí, menos uno. Ahora, esta consulta devolverá
todos los mensajes de este ID de chat. Pero en el mundo real, solo necesitamos los últimos diez a 20 mensajes porque nadie va a ver
mensajes desde el principio. Si alguien quiere
ver mensajes anteriores, entonces podemos buscarlo
después como paginación Entonces para la paginación, escribimos
aquí, vamos corchetes Ci, límite de coma de
página, es igual a desestructurar aquí
solicitar consulta Además, pasamos aquí ese valor predeterminado si front
end no pasará estos datos. Entonces página a uno y
limitar a digamos diez. Después de eso, necesitamos
convertirlos en enteros. Entonces página es igual a pasar
entero y pasar aquí página. Duplica esta línea con tamizar más Alt más flecha hacia abajo o Tamizar más Opción
más flecha hacia abajo. Y aquí cambiamos
esta página para limitar, y también aquí limitar. En nuestra consulta, simplemente agregamos el método
Skip, y dentro de él, página menos uno en limit, y también agregamos
método limit y pasamos aquí limit. Y también, al final, agregamos el método len. Creamos mucha API
con paginación, ¿verdad? Ahora también podemos agregar aquí
C tiene mensajes anteriores, es igual a aquí
pasamos condición, mensajes longitud de punto
es igual a límite. Si es verdad, entonces volvemos verdadero, no, devolvemos falso. Ahora al final, simplemente devolvemos mensajes de
respuesta punto JSunObject a los mensajes, tiene mensajes anteriores,
a mensajes anteriores, página a página, y
límite para limitar Y eso es todo. Por ahora, no
tenemos chats
y mensajes, por lo que probaremos estas API después de crear
chat y mensajes. En la siguiente lección, vamos
a crear enviando mensaje EPI
187. API para enviar mensajes: Ahora vamos a crear API
para enviar mensajes. Así que aquí agregamos router
punto post para endpoint, añadimos para nuestro slash
column jet ID, en qué jet queremos
enviar mensaje, slash message o mensajes, quieras llamarlo Además, agregamos Osmitalware y acing callback función
con En primer lugar,
obtendremos el ID de usuario de la solicitud punto usuario
punto subrayado ID A medida que obtenemos costo Calibakets chat ID es igual a solicitar
PRMs punto, ¿qué más necesitamos? Necesitamos contenido
del mensaje que
obtenemos del cuerpo. El contenido de Calibacket de costo es
igual al cuerpo del punto de solicitud. Ahora, antes de hacer nada, vamos a comprobar aquí condición. Si el contenido no está disponible, entonces devolvemos respuesta con código
Stata 400 y
en el método JSON, devolvemos objeto con
mensaje a contenido, o podemos decir mensaje, texto es st requerido. Ahora lo que queremos
hacer dentro de esta API, queremos simplemente almacenar
mensaje en la base de datos. Eso es. Aquí podemos hacer costo, nuevo mensaje es igual
a mensaje nuevo. Aquí en el objeto, pasamos jet ID a chat ID, remitente a lo que escribe, ID de
usuario, y luego
agregamos contenido al contenido. Después de eso, esperamos nuevo
mensaje punto c. Y al fin, simplemente devolvemos respuesta
con Status Code 201, y en Jason, pasamos Object, nuevo mensaje a nuevo mensaje. Ahora antes de probar esta API, podrías preguntar, no
creamos API para crear chat. Entonces, ¿cómo podemos pasar jet ID? Tu pregunta es correcta. Necesitamos crear Jet API
antes de guardar el mensaje. Aquí creamos una nueva API, router punto post, punto
a barra Crear chat Aquí, necesitamos middleware y también en función callback
con request En primer lugar,
obtenemos Cost user ID es igual a solicitar punto
usuario punto guión bajo ID También necesitamos la identificación del receptor, quien es el receptor u
otro usuario de este jet. ID del receptor de costo es igual a solicitar el ID del receptor del
punto del cuerpo del punto. Como estamos obteniendo este
ID de receptor del cuerpo del punto de solicitud, es una buena práctica validar. Así que el ID del receptor no
está disponible, entonces devolvemos respuesta con Código de
Estado 400 y en Jason, devolvemos objeto con mensaje
al receptor requerido. Ahora antes de crear un nuevo chat, es mejor encontrar que estos dos usuarios ya tienen chat
existente o no. Así que vamos a chatear es igual a
esperar chat punto Bien uno. Aquí en objeto, pasamos
participantes a objeto, y en eso agregamos
dólar o a array, ID de
usuario, ID de receptor de coma Ahora bien, esta consulta significa un jet en cuyos participantes
hay estos tanto ID de usuario como ID de receptor. Ahora bien, ¿y si es un jet grupal? Entonces podría ser posible que haya múltiples chorros en los que estos
dos ID estén disponibles. Aquí necesitamos asegurarnos de que solo el ID de usuario y el
ID del receptor deben estar disponibles. Para eso, podemos usar
aquí el tamaño del dólar a dos. Este es otro
operador útil de Mongo Dib. Hace poco me enteré de ello. Ahora bien, ¿y si realmente
no hay chat para usuario y receptor? Simplemente entonces para
crear un nuevo chat. Entonces si el chat no está disponible, entonces nosotros hacemos chat es
igual a New Jet. Aquí en el objeto, agregamos participantes
a la matriz de ID de usuario, coma, ID de receptor, y luego
podemos esperar chat punto c. Al final, simplemente devolvemos la respuesta que código de estado 201 En JSON, simplemente enviamos
este chat y ya está. Ahora tenemos crear Jet API, antes de crear un nuevo mensaje, primero
debemos verificar que el usuario
pase un ID de chat correcto o no y además sea el
participante del chat o no. Si no comprobamos
esta condición, entonces cualquiera puede enviar mensaje
a cualquier persona o grupo. Costo chat es igual a esperar
chat punto bien comprar ID, y aquí pasamos jaTiD Y después de eso, verificamos
si Jet no está disponible o jet
dot Participantes punto incluye ID de usuario. Si el remitente no está en
los participantes, pasamos sus signos de exclamación, y luego le devolvemos la respuesta
que el código de estado 403, y en el mensaje JSON
para acceder denegado Ahora verificamos jet. Ahora en el nuevo mensaje, reemplazamos este ID de chat para
chatear ID de guión bajo de punto Ahora bien, ¿qué más tenemos que hacer
cuando enviamos un nuevo mensaje? ¿Puedes adivinar? Bien, tenemos que actualizar la
propiedad del último mensaje del chat. Recuerde, después de
guardar el mensaje, escribimos chat punto
último mensaje es igual a nuevo mensaje
punto guión bajo ID Y después de eso, también
esperamos chat dot save. Y eso es todo. Ahora
por fin, T es esta API. Abre Cartero y aquí creamos una nueva carpeta llamada
chats y dentro de ella, agregamos nueva solicitud llamada
crear un nuevo chat Buen método para publicar. I punto final, agregamos SGDP, Columna doble
barra hacia adelante Host local,
Columna 3,000 barra diagonal API slashETS slash CreThat En primer lugar, tenemos que
pasar token en la cabecera. De vuelta a nuestra API de inicio de sesión y
aquí para la cuenta de Hari, buena copia este token y en nuestra
API de creación de chat en encabezados, teníamos autorización para error, ritmo ese token y
enviar la solicitud. Ver, aquí obtenemos error
interno del servidor es porque se requiere
ID del receptor. Entonces aquí en el
cuerpo, vamos a aw. Aquí, pasamos JSObject y pasamos aquí el ID del receptor a los códigos, volvemos a Mango Di
Becompass y aquí copio
este otro ID de usuario y
lo pego en el ID del Ahora envía la solicitud.
Mira aquí conseguimos nuevo jet, copia este jet ID. Como Prueba, enviar mensaje API. Asegúrate de guardar esta API con Control plus
o Command plus a, y luego duplica
esta solicitud de publicación. Cambiar el nombre de la solicitud
para enviar un nuevo mensaje. Además, noto en nuestra API, tenemos que pasar el ID de chat en el parámetro de solicitud y el
contenido en el cuerpo de la solicitud. Para que podamos hacer
algo así. Podemos cambiar nuestra API y
apuntar a solo enviar mensajes, y aquí obtenemos el ID de chat
en el cuerpo de la solicitud. Bueno. Guarde estos y
vuelva a Cartero Aquí, cambiamos nuestro punto final para cortar chats, cortar
enviar mensajes En cabecera,
ya tenemos token, así que solo necesitamos
pasar el cuerpo de solicitud. Aquí en el objeto, pasamos contenido para digamos que
este es el primer mensaje. También agregamos jet ID y
pegamos ese jet ID aquí. Ahora envía la
solicitud. Mira aquí obtenemos el nuevo
contenido del mensaje a nuestro mensaje, y en el remitente, es nuestro ID. Ahora es mejor que en
el lugar del remitente, podamos ver el ID y el nombre de usuario. Por eso, es fácil mostrar
nuevos mensajes en el front-end. Al final, definimos costo, poblar mensaje es igual
a esperar mensaje punto
encontrar bydNuevo mensaje punto guión bajo ID, punto Primero, agregamos remitente, y en el segundo argumento, agregamos
ID de guión bajo y usamos un nombre Y en la respuesta,
volvemos nuevo mensaje
para poblar mensaje Guarde los cambios y
enviemos otro mensaje. Este es el segundo mensaje,
y enviar la solicitud. Ver, en el remitente, obtenemos ID y nombre de usuario. Entonces aquí, nuestra
API de enviar mensaje está funcionando bien. Encantadora.
188. Qué son los sockets web: Entonces en las lecciones anteriores, creamos APIs para
enviar el mensaje, y también definimos API para obtener mensajes
de chat específico. Ahora imagina
que este es nuestro front-end, y tiene página de chat abierta para
dos usuarios Hurley y Mike Entonces esta es la pantalla de Hul y esta es la
pantalla de Mike Ambos están en la página de chat en la que ambos
son participantes, y ambos reciben dos mensajes
que son chat de historia. Ahora imagina aquí Harley escribe un nuevo mensaje
y haz clic en Enviar. Entonces en el botón Enviar, llamaremos a API para enviar
un nuevo mensaje, ¿verdad? Y como sabemos, esta API guardará este mensaje
en nuestra base de datos. Ahora el problema es cómo
Mike recibirá este mensaje porque Mike ya buscó todos los mensajes de este
jet y después de eso, Hurley envía el nuevo Una fue, Mike enviará la solicitud de recibir mensajes en cada 5
segundos para obtener nuevos mensajes. Es como Mike le pregunta al servidor, ¿hay algún mensaje nuevo para mí? servidor dice que no. De nuevo,
después de 5 segundos, Mike pregunta, ¿hay algún mensaje
nuevo para mí? Nuevamente, el servidor dice que no. Entonces si el servidor recibe nuevo mensaje, entonces en otros 5 segundos cuando Mike vuelva a
pedir el nuevo mensaje, en ese momento, el servidor le
enviará el mensaje. Ahora imagina que tenemos 10,000 o 100,000 usuarios en nuestro sitio web, y todos los usuarios están enviando solicitudes de
mensaje en
cada 5 segundos, lo que realmente no tiene sentido
porque solo
obtendremos nuevos datos cuando nuestro
servidor obtenga nuevos datos De lo contrario, nuestras solicitudes
solo van al servidor
y regresan. Esto definitivamente hará
que nuestro servidor sea lento o incluso se estrelle a veces. Entonces aquí no podemos confiar
en esta solución. Necesitamos algo que automáticamente le diga a
Mike si tiene nuevo mensaje y automáticamente lo
envía en la pantalla de los ratones. Y para resolver este problema,
tenemos socket web. Entonces, ¿qué son los sockets web? El socket web es una forma para que
nuestro front-end de sitio web y nuestro servidor backend
se comuniquen entre
sí en tiempo real Es como una conversación bidireccional. En palabras simples, los sockets web nos
ayudarán a construir una conversación en tiempo
real. De una
conexión web socket es como una llamada telefónica entre tu
navegador y el servidor. Una vez que se realiza la llamada, navegador puede
hablar con el servidor y servidor también puede
responder en cualquier momento. Ahora podría preguntarse, cuál es la diferencia entre
las API y los sockets web. Imagina que este es nuestro
front-end y este es nuestro servidor. Ahora supongamos que en el
front-end queremos obtener algunos datos, así que enviamos una solicitud API desde el front-end
a nuestro servidor. servidor procesará esa
solicitud y enviará respuesta a nuestro front-end aquí nuestra conexión
API está cerrada. Por ejemplo, desde el front-end, Harley envía un mensaje a
nuestro servidor usando post API. Ahora nuestro servidor
almacenará esos datos en la base de datos y luego devolverá el nuevo mensaje
al front-end. Aquí, nuestra conexión está cerrada. Esta es la forma de
conexión usando APIs SGDP. Ahora veamos cómo funciona el socket
web. Aquí tenemos front end, y este es nuestro servidor. Ahora, antes que nada, aquí
creamos conexión
usando socket web. Por esta conexión,
nuestro cliente puede enviar los nuevos datos de messet al
servidor sin ninguna llamada a la API Igual que el servidor también puede
devolver nuevos datos de messet. Después de que el servidor hiciera un
nuevo mensaje de datos, aún así esta conexión
permanece ahí. No cerrará hasta que cerremos nuestro sitio web o lo
cerremos manualmente con el código. Déjame explicarte con
el ejemplo del mundo real. Aquí está Harley, aquí está Mike, y aquí está nuestro servidor. Supongamos que Harley y
Mike construyen una conexión con nuestro
servidor usando sockets web. Ahora bien, si Halley envía
nuevo mensaje al servidor, servidor almacenará ese
mensaje en la base de datos, y luego
enviará ese mensaje al micrófono sin que Mike
envíe
la solicitud API Ahora, si Mike envía
mensaje al servidor, el servidor también almacenará ese
mensaje en la base de datos, y luego enviará ese
nuevo mensaje a Harley. Ahora bien, si nuestro servidor va a recibir otro mensaje para Mike
de otro usuario, entonces también Mike
recibirá ese mensaje, pero esto solo
sucederá si Mike construye una conexión con el servidor
usando socket web. Si Harley está conectada
con servidor, pero Mike no está conectado
al servidor usando socket web, entonces el nuevo mensaje se
almacenará en la base de datos, pero no
llegará al micrófono. Así es como funciona el socket web. Los enchufes web se
utilizan para construir comunicación en tiempo
real entre el
front-end y el back-end. No te preocupes,
es realmente sencillo. Entiende todo esto cuando
aplicamos enchufes web en nuestro back end y
lo probamos con el front end.
189. Conexión del zócalo: Ahora en la lección anterior, vemos que si queremos
enviar y recibir datos en tiempo real, entonces tenemos que conectarnos con web socket para tratar
con web socket, usaremos la
biblioteca socket punto IO más popular. Esta biblioteca es utilizada por
muchas plataformas populares, por lo que definitivamente podemos usarla. Abrir terminal,
y aquí escribimos NPM instalar socket punto
IO a la velocidad 4.8 0.1 Entra. Bien,
minimice este terminal, y agreguemos socket en
nuestra aplicación backend En el archivo JS punto índice, ingresamos costo Coli Brackets, servidor es igual a
requerir socket punto IO. Y en la parte inferior, podemos agregar costo AO es igual a nuevo servidor. Ahora en este servidor, tenemos que
pasar nuestro servidor SGDP. Sin servidor SGDP, el socket no recibirá solicitud de
conexión Para ello, necesitamos
crear un servidor SDDP. Costo SDDP es igual
a requerir SDP. Este es el
módulo SGDP incorporado en la parte inferior, agregamos Const server es igual
a SDP punto Ahora podemos pasar este
servidor en nuestro socket. Bueno. Ahora aquí hay una pregunta en qué placa escuchará el
servidor socket. Porque aquí para la app Express, definimos puerto 3,000
y al final, escuchamos con ese puerto. En nuestra implementación actual, si agregamos socket dot
Listen a 5,000, entonces nuestras API se ejecutarán en el puerto 3,000 y nuestro socket
se ejecutará en el puerto 5,000. Esto no es lo que queremos. Queremos que nuestras APIs y socket
funcionen ambos en la misma placa. Entonces para eso, aquí en
el servidor de creación, tenemos que pasar
esta app Express. Por esto, este módulo SGTP creará servidor
con esta app express, y ese mismo servidor que estamos usando para inicializar socket También en la parte inferior, necesitamos cambiar
esta app dot Escuchar con server dot Lisen De lo contrario, esto
no funcionará correctamente. Guarde estos cambios
y reiniciemos nuestra aplicación para
asegurarnos de que se está ejecutando
correctamente o no. Ver aquí obtenemos servidor
se está ejecutando en B 3,000, y también obtenemos
Mongo Db conectado Eso significa que está
funcionando correctamente. Así que para recapitular rápidamente para inicializar socket
en nuestro back-end, primero
necesitamos crear
servidor y pasar Express app InDee entonces podremos usar este servidor para
crear servidor socket, y al final, tenemos que
también servidor punto
LISN a también servidor punto
LISN Así que aquí
inicializamos exitosamente socket
en nuestra aplicación Ahora desde la parte frontal, cualquiera puede conectarse
a este zócalo. Pero, ¿qué queremos hacer cuando
alguien se conecta al zócalo? Tenemos que añadir esa lógica.
Es realmente simple. Aquí, después de estas rutas de aplicaciones, agregamos IO que es la instancia de
socket punto on, y en el primer argumento, pasamos conexión, y
en el segundo argumento, aquí pasamos la
función de devolución de llamada y lo que hacemos cuando alguien se
conecta a nuestro socket Por ahora, simplemente
consola dot log. Usuario conectado. Siempre que desde el front-end, alguien se conecte a nuestro socket, entonces esta
función de devolución de llamada se ejecutará Ahora bien, ¿cómo podemos saborear
esta implementación? Para probar eso,
creé una aplicación ficticia, SGML
simple y
JavaScript. No te preocupes. Si
no sabes nada de front end, te lo
explicaré. Además si no
quieres probarlo, entonces puedes ver esta degustación. También te ayudará a entender el flujo
de trabajo del socket. En la carpeta de recursos, tenemos la
carpeta Project three, y en ella, tenemos LinkFi testing app, copiamos esa carpeta y nos movemos
a nuestra carpeta de proyectos Aquí pegamos esa carpeta. Ahora abre esta
carpeta en el código Vas. Bueno. Aquí, primero usamos
esta sencilla carpeta de chat. La razón por la que uso aquí aplicación
front-end porque
con front end real, aprendizaje socket va a ser divertido, y además despejará flujo de trabajo
completo de socket. No te preocupes, no necesitas
escribir ningún código aquí. Sólo haz lo que yo hago. Entonces, para ejecutar este front-end, rastrea este sencillo archivo GML de punto de
chat en el navegador y
ábrelo en la nueva pestaña Ver, aquí obtenemos este
tipo de interfaz. Ahora volvamos al código vis front
end y abre este sencillo archivo de puntos de chat. En la parte superior, se puede ver socket de
escritura es igual
a AO y por dentro, pasamos nuestro backend Link, que es Local
host columna 3,000 Esta expresión significa que
queremos conectarnos con socket, que se inicializa
en este pot Además, podrías preguntarte cómo
estamos obteniendo este método Ao. Estamos obteniendo este método Ao porque agregué
socket con Dan Link. Mira, aquí está, y
por eso, estamos llegando hasta aquí Aomthod Guarda esta página y
vuelve a nuestro front end. Comprobemos nuestra Consola, así que haga clic derecho en la
página y vaya a Inspec. Consulta aquí obtenemos este error de
curso para la columna host
local
3,000 slash socket Ahora podrías preguntar, ya
habilitamos curso en
esta app express, ¿por qué seguimos recibiendo
este error de curso? La razón es que solo
configuramos curso para
nuestra app express, pero también tenemos que configurar course para nuestro servidor socket. Es realmente simple. Aquí en el método del servidor, en el segundo
argumento, podemos pasar las opciones para
el servidor socket. Me opongo, pasamos curso
aquí también objeto, primer origen de propiedad a estrella, lo que significa que se permite cualquier puerto. Además, si queremos pasar
solo nuestro front-end, entonces aquí podemos pasar esa URL. Pero por ahora, nos quedamos con estrella. Puede copiar o portar desde
el navegador front-end. Ahora después del origen,
podemos pasar métodos, que es array y
pasamos aquí, Get y post. Este método de sol especifica qué métodos
SGDP están permitidos
durante el socket web ndSac Ahora podrías preguntar qué
es websocket Hensak. Cuando un cliente se conecta a
un socket o di servidor, entonces comienza con la
solicitud SDP. El apretón de manos Si tiene éxito,
entonces se
actualizará a una conexión de
socket web. Durante este apretón de manos,
el servidor comprueba si el
método SDDP entrante está permitido o no Es importante agregar estos
métodos porque con eso, nuestra conexión se establecerá. Si no especificamos
los métodos correctos, entonces el navegador podría bloquear la conexión debido
a un error del curso. Guarde esto y
actualicemos nuestro front-end. Ver, aquí no
obtenemos ningún error, y si comprobamos nuestro back
end en el terminal,
obtenemos el mensaje de Consola de
un usuario conectado. Y además actualizamos nuestra
aplicación una vez más. Entonces en nuestro back end, mira, aquí nuevamente conseguimos que un
usuario esté conectado, lo que significa que nuestro usuario
front-end está conectado exitosamente con nuestro
back end usando socket. Entonces, para recapitular rápido, después inicializar socket,
en nuestro back-end, agregamos ao punto en la conexión,
y en el segundo argumento,
pasamos la función de devolución de llamada Entonces cada vez que un nuevo usuario se
conecte con nuestro socket, entonces esta
función de devolución de llamada se ejecutará Y también dentro de esta función
callback, escribiremos toda nuestra
lógica para socket Así inicializamos y manejamos la
conexión de socket
190. Emisión del zócalo y métodos: Se podría pensar que escribir un
código relacionado con socket es difícil. Tiene muchos métodos
y funciones. ¿Cómo podemos aprenderlos? Si tienes este tipo de
ecuaciones, entonces no te preocupes. Por primera vez, también
creo que el socket es muy difícil. Pero cuando en realidad lo
aplico en mi proyecto, es realmente sencillo. Socket tiene principalmente dos métodos, socket dot d y socket dot on. 90% de tiempo, vamos a utilizar
estos dos métodos, y créeme,
son realmente simples. Entonces, como sabemos, el
socket se utiliza para la conversación en tiempo
real entre el
front-end y el back end. Básicamente, significa que en cualquier momento
nuestro servidor o back end puede enviar y recibir datos desde el front-end sin
ninguna llamada a la API, y también funciona a la inversa. front-end también puede enviar y recibir datos
desde el back-end. Supongamos que desde nuestro front end, Harley quiere mandar un mensaje a back end como este
es el nuevo mensaje. Ahora la cosa es, ¿cómo podemos enviar datos desde el front-end? Entonces para eso, usamos socket
punto E enviar mensaje. Este es el nombre del evento, y en el segundo argumento, podemos agregar nuestros datos. En inglés sencillo,
emit significa enviar. Entonces le estamos diciendo a nuestro socket, emitir los datos, o en
palabras simples, enviar los datos. Por esto, enviamos mensaje
desde el front-end, pero en el back end,
necesitamos
escribir también la lógica para
manejar ese evento. Y para eso, usamos socket
dot en enviar mensaje. Este es el mismo nombre del evento que enviamos desde
el front-end. Y en el segundo parámetro, pasaremos la función de devolución de llamada, que se ejecutará cuando
consigamos enviar evento de mensaje Entonces escribiremos toda nuestra lógica
en esta función de devolución de llamada. Ya sea que queramos
almacenar el mensaje en la base de datos o queremos enviarlos
directamente
a otros usuarios. En palabras simples, solo
recuerda cuando queremos enviar datos de front end a back end o back
end a front end, usaremos el
método socket dot con nombre de evento, y cuando queramos recibir datos desde el back end o
desde el front end, entonces usaremos socket dot on, y aquí escribimos el mismo nombre de evento
y función callback Implementemos esto
en nuestra aplicación. Entonces en front end dab primero, aquí agregué enviar evento para nuestro formulario en el que
tenemos entrada de mensaje
y botón de enviar Y aquí obtenemos mensaje de entrada y usamos un nombre rellenado
en estas dos variables. Entonces todo está listo. Tenemos que enviar
mensaje usando socket. Entonces aquí, qué
método de socket usamos para
enviar el mensaje. Bien, usaremos socket punto
m. en el primer argumento, escribimos el nombre del evento, digamos, enviar mensaje. Y en el segundo argumento, podemos pasar los datos que queremos
enviar con este evento. Digamos que pasamos aquí objeto
con remitente a objeto bajo ID
cuadrado para digamos 123 y usamos un nombre para nombre de
usuario valor de punto. Y otro
contenido de propiedad para ingresar valor de punto, que es nuestro texto de mensaje. También, enviamos creado
en a nueva fecha, y también pasamos estado
para enviar. Y eso es todo. Aquí, agregamos rellenos como
definimos en la base de datos. Aquí, por este código, enviamos los datos del mensaje
cuando enviamos un formulario. Ahora, veamos si estamos obteniendo estos datos en nuestro backend o no Entonces dime qué método de socket usaremos para obtener
los datos del evento. Correcto, usamos socket dot on. Aprendes bastante rápido, encantador. En nuestro back end
en el ao dot on, nosotros en socket dot on. En el primer argumento,
¿qué pasamos? Correcto, pasamos el nombre del evento
que queremos manejar, que es enviar mensaje. Asegúrate de escribir el mismo nombre a medida que pasamos
desde el front-end. De lo contrario, no funcionará, y además es sensible a mayúsculas y minúsculas. Ahora en el segundo argumento, pasamos la función de devolución de llamada, que se ejecutará cuando alguien desde el front-end envíe este evento
send message En el parámetro
de esta función, obtenemos los datos, y por ahora, simplemente
consolamos log new
message from front end, y adherimos estos datos Estos datos son el objeto de mensaje que pasamos desde
el front-end. Ahora podrías preguntar,
¿cómo podemos conseguir socket en este
punto o en callback Simplemente llegamos aquí
desde el parámetro. Usando este socket, podemos
agregar métodos emit y on. Guarde estos cambios y enviemos un mensaje
desde el front-end. Refresca la página aquí mismo, nombre de
usuario y aquí mismo, mensaje, primer mensaje
y haz clic en Onsent Aquí, no pasa nada. Y si revisamos nuestro back
end, revisa nuestro terminal. Mira aquí conseguimos que el usuario se conecte, y luego obtenemos ese objeto de
mensaje, lo que significa que
obtenemos con éxito el mensaje
desde el front-end. Eso es muy sencillo de enviar
y obtener datos usando socket. Solo tenemos que recordar socket dot y socket
dot on método. Ahora aquí nos llega el mensaje
desde el front-end. A continuación, qué queremos
hacer con ese mensaje. Obviamente, queremos almacenar ese mensaje en la
base de datos y luego devolver ese mensaje al front-end nuestro front end puede mostrar
ese mensaje en la pantalla. Por ahora, no te
preocupes por la lógica de la base de datos, implementaremos más adelante. Por ahora, solo queremos mandar
este mensaje al front-end. Dime qué método
usaremos para enviar los datos de
back end a front end. Sí, usamos socket dot, y en el primer
argumento, pasamos evento. Obtener mensaje. Se le puede
dar cualquier nombre. No importa. Ahora, ¿qué queremos enviar
con este evento? Quiere enviar los mismos datos. En el mundo real, enviaremos nuevo objeto de mensaje que
almacenamos en la base de datos. Ahora guarda este archivo,
y en el front-end, necesitamos manejar
este evento de mensaje G, y ya sabes
qué método tenemos que
usar para manejar el evento
u obtener el evento. Correcto, vamos a escribir
aquí socket dot on. Primero, pasamos el nombre del evento, Get message, y en
el segundo argumento, pasamos la función callback, y en esa callback, en el
parámetro, obtenemos esos datos ¿Qué queremos hacer
con este mensaje? Simplemente, queremos mostrar ese
mensaje en el navegador. Entonces para mostrar el mensaje, creé esta función de
mensaje de visualización. Simplemente llame a esto y
pase los datos que contiene. Esta función creará mensaje y
lo mostrará en nuestro navegador. Además, aquí puedes ver
esa lógica si quieres. Guarde esto, y probemos
esta implementación. Asegúrese de actualizar la página después de hacer cualquier cambio
en el código de front-end. De lo contrario,
no obtendrá estas actualizaciones. Ahora usamos un nombre para Hurley y mensaje para primer mensaje
y mandamos el mensaje Mira, aquí nos sale el mensaje en el front end dentro de un
segundo o se pone en segundo. Entonces, para recapitular rápido, socket
tiene principalmente dos métodos, socket dot m y socket dot on Socket dot se utiliza para
enviar o emitir los datos. Y con socket dot on, podemos manejar ese evento enviado
o podemos ver el evento. Si entiendes estos dos
métodos, entonces felicidades. Usted 90% socket está hecho.
Es así de simple.
191. Recibir mensajes para ambos usuarios: En la implementación actual, la probamos con un solo usuario. Ahora probémoslo
con dos usuarios
al mismo tiempo como Haley y Mike están platicando
entre sí Así que abre otra
pestaña privada del navegador, o también puedes usar otro navegador y abrir
el mismo archivo S DML Ahora supongamos que la primera pantalla es Halley spec y
la segunda pantalla es Mike spec. Están
platicando entre ellos. Entonces aquí Halley manda mensaje, y aquí recibe este mensaje, pero Mike no está
recibiendo el mensaje Como aqui desde el back end, estamos enviando
mensaje con socket, como esta funcionando para Halley
y no funcionando para Mike El motivo está aquí
desde el back end, usamos socket punto m.
Este método enviará evento solo a ese usuario que
emita el evento send message, y es por eso que Halley está
recibiendo este mensaje, pero Mike no está recibiendo Ahora bien, ¿cuál es la solución aquí? Porque queremos nuestro mensaje, también lo
enviaremos a otros
usuarios. Simplemente en el lugar
del punto socket, utilizaremos este método ao dot. Usando ao dot, podemos enviar mensaje a todos los usuarios que
estén conectados con socket. Guarde este archivo y
probemos esta implementación. Refresca ambas páginas. Bueno. Además, aquí
escribimos nombre de usuario para ambos usuarios y desde el Hal
escribimos mensaje y lo enviamos. Ver, ahora Mike también
recibe este mensaje. Y si enviamos
mensaje de Mike, mira, Él también lo consigue. Y así es como funciona
el chatear en tiempo real. Al usar socket dot
desde el back end, solo
podemos enviar eventos a
los usuarios que emitan ese evento. Y si usamos ao dot, entonces nuestro socket
enviará ese evento a todos los usuarios que estén
conectados usando socket.
192. Lógica de la participación en una sala de chat: En la
lección anterior, estamos recibiendo mensajes instantáneamente
en ambos usuarios. ¿Y si agregamos otra ventana
y vemos qué pasará? Así que agreguemos otra ventana
privada y abramos el mismo archivo HTML. Ahora escribe aquí, nombre de usuario y desde la primera ventana,
enviamos mensaje. Consulta aquí para ambos usuarios,
nos sale el mensaje. Y si algún otro
usuario envía mensaje, entonces también otros usuarios están
recibiendo ese mensaje, lo que significa que nuestro
socket está enviando el mensaje a todos los usuarios que
están conectados al socket. Es como si organizaras
una gran fiesta. Aquí, la gente está charlando
en todas partes sin habitaciones, y por eso, toda
conversación se mezclaría. Es como el usuario A
hablando con el usuario B, pero el usuario C escucha todo, así que no habría conversación
privada Qué gracioso es que todos estén
sutando por toda la casa en lugar de
hablar gentilmente en una habitación Aquí también tenemos
la misma situación. Nuestra implementación actual es el envío de mensajes a todos los usuarios. Entonces, ¿cuál es la solución aquí? Necesitamos implementar salas. Por lo que las habitaciones en socket pueden resolver este problema al permitirnos agrupar
a los usuarios. Cada grupo o habitación es un espacio
privado donde solo los miembros de esa sala pueden
enviar y recibir mensajes. En palabras simples,
room in socket son espacios
virtuales donde
los usuarios pueden unirse y vivir. En eso se puede
transmitir mensaje a todos en una habitación sin
molestar a los demás. Supongamos que Halley y Mike's
quieren platicar entre ellos. Cuando Halley abre un chat, Halley se une a
una habitación que tiene un nombre único como chat
HM Halley, Ahora Mike abre jet page
para platicar con Halley. Mike también se unió a la
misma sala llamada JathM. Ahora ambos usuarios están
conectados en una misma habitación. Entonces, si Halley envía
mensaje en esa habitación, entonces solo Mike recibirá este mensaje, no
la tercera persona Yo Hola cierro la pestaña, luego Halley perdió
la conexión con el socket y cuando el
socket se desconecta, luego socket dot IO
elimina automáticamente Halley de Room jet hm Por esta implementación,
nuestros jets no se harán públicos y también esto funciona
en el chat grupal también. Supongamos que el usuario A, el usuario B y el usuario C son miembros del grupo, y todos están conectados
a un chat de sala específico ABC. Ahora cualquiera de ellos
está mandando mensaje. Otros dos recibirán este mensaje porque están
conectados en la misma habitación. Entenderás
esto correctamente cuando implementemos y
probemos esta característica, y lo haremos
en la siguiente lección.
193. Implementación de la unión a una sala de chat: Ahora implementemos la
función de sala en nuestra aplicación inkifi. Pero antes de eso, permítanme recapitular
rápidamente el flujo de trabajo. Entonces, cuando el usuario abre un chat, se unen a la sala
con su ID de chat. Solo los usuarios de la misma sala pueden enviar y recibir
los mensajes. Y por fin, cuando el usuario
sale o cierra ese chat, entonces los retiramos
de la habitación. Entonces, antes que nada, cuando
el usuario abre un chat, luego desde el front-end, un evento debe activar la
llamada unirse a la sala con ID de chat. Después de eso, desde el back-end, agregamos ese usuario en esa sala, y cuando alguien envíe mensaje, enviaremos ese mensaje
solo a los usuarios que
se unan a esa sala. Aquí en nuestro back end, manejamos otro evento, socket dot on, y qué evento queremos manejar
sí, es join room. Ahora aquí obtenemos datos, o podemos decir desde
el front-end,
enviaremos el ID de chat, la función de
flecha, y
ahora para unirnos a Room, simplemente escribimos socket dot join, y aquí pasamos
nombre de la sala, que es nuestro ID de chat, y para asegurarnos también de
consola dot log in backticks, user dollar Cali Brackets, socket dot ID, que es el ID único
de usuario actual proporcionado por socket. Unirse a la habitación dólar CL
brackets chat ID. Ahora en el enviar mensaje, queremos enviar mensaje
solo a aquellos usuarios que
actualmente se encuentran en esa sala. Por lo que comentamos este método
anterior del EIT, para que puedas verlo más tarde Y aquí escribimos
ao dot mensaje MIG, y pasamos aquí los datos Ahora para enviar este evento solo
a sala separada, aquí agregamos ao punto dos, y dentro de él, necesitamos pasar ese nombre de sala que
configuramos para ID de chat. Ahora la pregunta es, ¿cómo
podemos obtener el ID de chat? Bien, podemos pasar el
ID de chat desde el front-end. Entonces ID de chat de datos, y eso es todo. Nos unimos al usuario en la sala, y luego enviamos el
evento get message solo a esa sala. Ahora para probar esta implementación, necesitamos usar
otro archivo SDML Entonces en la carpeta testing, obtendrás otra carpeta
llamada Romjat y dentro de ella, obtendrás el archivo
llamado Rojatt También, en su archivo JS, primero, conectamos usuario con socket, y luego estamos
pidiendo nombre de sala en prompt. Después de obtener el nombre de la sala, enviamos este evento de unirse a la sala. Esto nos ayudará
a unirnos a una habitación, y luego el resto
del código de front-end es el mismo que antes. Justo en el evento de enviar mensaje, también
enviamos jet ID porque lo necesitamos
en el mensaje de envío. Ahora vamos a ejecutar este archivo. Excava este archivo y
ábrelo en tu navegador. En primer lugar,
preguntará por el nombre de la habitación. Aquí, para degustación, estamos
pasando cualquier ID de jet aleatorio. Digamos chat subrayado
uno, dos, tres. Bien. A medida que escribimos usa un nombre. Sin ella, podríamos obtener error. Escribe usa un nombre, y
si en nuestro back-end, abrimos Consola vemos aquí
podemos ver usuario conectado, y luego usuario socket
ID, unirse a la sala, y aquí obtenemos nuestro nombre de sala, chat, subrayado,
uno, dos, tres Genial. Ahora abramos
otra pestaña y hagamos lo mismo. Escribe aquí el nombre de la sala,
charla, subrayado uno, dos, tres, porque queremos unirnos
a la misma sala Ahora aquí escribimos nombre de usuario. Y luego escribir
mensaje y enviarlo. Ver, para ambos usuarios, estamos recibiendo este mensaje, así que está funcionando bastante bien. Ahora, vamos a abrir otra ventana
y unirnos a una habitación diferente. Hablemos, subrayemos 45, seis. Bueno. Ahora bien, si enviamos
mensaje de este usuario, estos dos usuarios
no recibirán este mensaje. Y si alguno de estos dos usuarios está
enviando el mismo mensaje, entonces este tercer usuario
no está recibiendo este mensaje. Entonces esto también está funcionando. Entonces así de sencillo
es unirse a room y enviar mensaje
a esas salas. Como te dije anteriormente, el socket es muy sencillo. Solo necesitas
entender la lógica.
194. Ejercicio: indicador de tipeo: Ahora es el momento de hacer
poco ejercicio de socket. En este ejercicio,
hay que implementar show typing indicator cuando
alguien está escribiendo el mensaje. La lógica es cuando los usuarios
empiezan a escribir en la entrada, activamos un evento de
socket escribiendo. Y desde el back-end,
enviaremos datos quién está escribiendo y en qué
habitación está escribiendo. Ahora después de implementar
eso como un bono, cuando nuestro usuario no
escribe durante 2 segundos, entonces activaremos otro
evento llamado Stop typing, que simplemente eliminará indicador de
mecanografía
del front-end. te preocupes, si no
conoces el código de front-end, solo escribe código para backend, maneja el evento y envía a ese usuario que está escribiendo
o cualquier mensaje En el front end
también, agregué código, que funcionará cuando escribamos
algo en el cuadro de entrada. Y también agregué comandos donde tienes que
emitir los eventos y también el código
que tienes que
escribir cuando
manejas esos eventos. El objetivo de este ejercicio es
pensar en términos de eventos. Entonces intenta implementarlo y
luego cuál es la solución. Ahora, veamos la
solución de este ejercicio. Entonces antes que nada,
en nuestro back end, tenemos que manejar evento,
digamos mecanografía. Entonces socket punto al escribir. Y desde el front-end, enviaremos objeto con
jet ID y nombre de usuario. Entonces podemos
desestructurarlo aquí y obtener jet ID, y también obtenemos el
nombre de usuario, la función de flecha Y aquí enviamos este mensaje a otros usuarios que se encuentran
en la misma habitación. Entonces o punto dos aquí
pasamos el ID de chat, y después de eso,
punto, mostrar mecanografía. Y aquí pasamos mensaje en BTI dólar nombre de usuario está escribiendo. Y eso es todo. Después de eso, también
necesitamos manejar evento, dejar de escribir, así socket
punto encendido, dejar de escribir. Y aquí también obtenemos objeto
con ID de chat y nombre de usuario. Y en la función de error, simplemente
Iot a chatd
punto m, Ocultar mecanografía Aquí le pasamos el nombre de usuario que dejan de escribir, y eso es todo. No necesitamos otra
cosa en la parte de atrás. En este ejercicio, si
confundes con el front-end, entonces no te preocupes por eso Acabo de agregar front
end para degustación. También puedes saltarte esa parte de
degustación tan pronto como sepas escribir lógica de
socket y evento. Ahora, veamos rápidamente
esta parte de degustación. Como te dije en la
lección anterior, aquí en la parte inferior, agregué este código, que se ejecutará cuando escribamos
algo en este cuadro de entrada. Aquí, si el
valor de entrada no está vacío, solo entonces hacemos socket punto
m y qué evento
emitimos, enviaremos evento de escritura, y en la segunda posición, agregamos objeto con ID de
chat a ID de chat, y luego también enviamos
nombre de usuario al valor de usuario. En este tiempo de escritura de espera, que se ejecutará después cada 2 segundos cuando
escribamos algo en el cuadro de entrada cuando por dos segundos el usuario no
escribió nada, luego enviamos otro
evento llamado stop typing. Aquí duplicamos este método
emit y
lo pasamos aquí y cambiamos este
evento para dejar de escribir. Fuera de este oyente de eventos, necesitamos manejar dos eventos que emitimos desde el back-end Enchufe punto encendido, mostrar mecanografía. Aquí, pasamos la función de devolución de llamada, y aquí obtenemos el mensaje, el usuario está escribiendo en
esta función de flecha, nuestro front-end
escribirá su lógica Por ahora, simplemente agregamos aquí esta lógica que agregué en
la parte inferior con comando. Ahora después de eso, agregamos
otro punto socket encendido. Dejar de escribir aquí también función de
devolución de llamada. Aquí llegamos a usar un nombre
si quieres usarlo. Y aquí movemos esta segunda
lógica para dejar de escribir. Guarda los cambios
y echa un vistazo, actualiza la página, Ingresa chat, ID, chat, subraya uno, dos, tres, y escribe
usa un nombre, Ali Ahora en otra ventana, también refrescamos la página. Entrar chat, D, chat,
subrayado uno, dos, tres, y escribimos
usar un nombre para micrófono Ahora escribamos
algo de Mike. Consulta aquí para Hola, estamos recibiendo el mensaje de
mecanografía. Mike está escribiendo. Pero aquí podemos ver que
Mike está recibiendo, Mike está escribiendo. Esto
es lo que queremos. Queremos que nuestro back end, solo envíe el evento de mecanografía de espectáculos a los usuarios que estén
en la sala de chat, pero no para el remitente. Para eso, aquí en el
lugar de ao punto dos, necesitamos hacer socket punto dos y
aquí socket dt dos ,
primeros eventos de mecanografía Te voy a explicar esto
en solo un segundo, ver los cambios, y vamos a
probarlo una vez más. Refresca la página,
escribe jet ID, para chatear, subrayar uno, dos, tres y escribir un nombre de usuario, Harley Y también para Mike,
refrescamos la página. Ingresa jet ID, para
chatear, subrayar uno,
dos, tres y escribir el nombre de
usuario, Mike Ahora escribe algo mira ahora solo Harley está
recibiendo Mike está escribiendo, y después de 2 segundos, este mensaje sigue aquí. Déjame revisar el evento. Manejamos aquí dejar de escribir desde el front-end y qué evento estamos emitiendo
desde el back-end. Oh, es alto tecleando. Entonces, en nuestro front end, cambiamos
este evento para ocultar la escritura. Guarda los cambios y
probémoslo una vez más. Refresca la página. Escribe
ID de chat para chatear subrayado uno, dos, tres, y
aquí mismo, usa un nombre Entonces para Mike,
reprimimos la página, Ingresa ID de chat para
chatear subrayado uno, dos, tres, y
aquí mismo, usa un Ahora escribe mensaje desde aquí y si te
detienes por 2 segundos, entonces ese mensaje se ha ido. Entonces esto está funcionando bien. Ahora aquí hay una cosita. ver cuando mandamos el mensaje, entonces por
poco, estamos consiguiendo Mike esté escribiendo. Eso
no queremos. Por lo que también emitiremos el evento stop typing cuando
enviemos el mensaje. Así que copia este socket
punto m para Dejar escribir y pegarlo al
final de nuestro formulario enviar. Guarda los inges y déjame
probarlo una vez más. Refresca la página, escribe ID de
chat y nombre. También, hacemos esa misma represión, escribimos ID de chat y nombre Ahora escribimos su
mensaje y lo enviamos. Mira, ahora no estamos
consiguiendo esa mecanografía. Hay cuatro variación de
métodos en socket ao dot, socket dot I ao
dot two room dot M y socket dot two room dot m. déjame explicarte
cada uno con palabras simples. Así ao punto mostrar mecanografía. Esto enviará
evento de mecanografía de espectáculos a todos los usuarios conectados, ya sea que se unan a una sala o no. Se enviará el evento show
typing a todos los usuarios que estén
conectados con socket. A continuación, tenemos socket
punto m, Mostrar mecanografía. Esto enviará el
evento Show typing solo al remitente. A continuación, tenemos ao punto dos,
room dot show typing. Esto enviará evento de
mecanografía a todos los usuarios que se unan a esta
sala, incluido el remitente. Nuestro caso, son
Halley y mic ambos. Es por eso que anteriormente, obtenemos show typing event para ambos usuarios. Por fin, tenemos socket dot
two room dot show typing. Esto enviará evento de
mecanografía a todos los usuarios que se unan a esta
sala excepto al remitente. Yo Hal está escribiendo, entonces Haley no obtendrá
este evento de mecanografía del espectáculo Esta es la diferencia básica
entre estos métodos. Podemos utilizarlos de
acuerdo a nuestras necesidades. No hay reglas sobre
usar solo esto o aquello. Usaremos lo que más
se adapte a nuestra lógica.
195. Aplicación de un código de mensaje de envío real: Ahora actualmente en
nuestra aplicación, cuando el usuario envía mensaje, simplemente
enviamos ese mensaje a todos los usuarios que se unan a
esa sala de chat. Pero en el mundo real, también
necesitamos
guardar esos mensajes
en nuestra base de datos. Entonces, aunque el usuario
saliera de la habitación, podrá ver esos nuevos mensajes y también el historial
de los mensajes. Guardemos nuestro mensaje
en la base de datos. En primer lugar, quiero
aclarar una cosa. Cuando desde el
front-end, enviamos mensaje, debe
haber un chat ya
creado entre usuarios. Por ejemplo, si
Hurley quiere enviar mensaje a los ratones y si nunca
conversaron entre ellos, lo que significa que no se
crea chat entre ellos. En ese caso, cuando Harley
envía el primer mensaje, llamamos a API separada que
es nuestra API de creación de chat, y cuando Harley tiene et ID, entonces emitiremos el
evento send message con el ID de chat. Esto ya lo sabemos, ¿verdad? Recuerda, en el inicio
de esta sección, creamos enviar mensaje API. Sí, necesitamos esa misma lógica aquí en el evento send message. Entonces copiemos ese código. Y en nuestro evento de enviar mensaje, simplemente lo
pegamos aquí. Ahora, antes que nada,
necesitamos hacer esta función de devolución de llamada asíncrona Bueno. Ahora aquí estamos obteniendo ID de
chat y contenido
del cuerpo de la solicitud. Pero en socket, no
tenemos cuerpo de solicitud, así que tenemos que obtener el ID de chat y el contenido del parámetro
function. Entonces aquí desestructuramos estos datos y obtenemos aquí ID de
chat y contenido Ahora bien, ¿qué más necesitamos? Correcto, necesitamos el ID de usuario también, así que también lo obtenemos en estos datos. Y ahora no necesitamos esta línea. También, en la parte inferior, estamos enviando datos
en la respuesta. Pero como sabemos, en socket, no
obtenemos respuesta, así que simplemente podemos eliminar eso y del socket
en el lugar de los datos, enviamos este mensaje de poblar A en el punto o dos, solo en chat ID en el
lugar de datos punto Jet ID. Ahora vamos a comprobar también dónde
usamos nuestra respuesta. Sí, en el error de devolución, y también aquí usamos respuesta. En el lugar de enviar
error a través de respuesta, aquí podemos enviar
mensaje de error a través del evento socket. Pero la pregunta es
¿a quién queremos enviar
este mensaje de error? ¿Deberíamos enviarlo a todos
los usuarios activos en esa sala? No, queremos enviar este
mensaje de error solo al remitente y decirme qué método de socket
usamos para enviar solo el evento
al usuario actual. Correcto, usamos
socket punto m. vamos a enviar evento llamado
error en enviar mensaje, y simplemente enviamos
mensaje de error acceso denegado. Ahora aquí, nuestro
código inferior seguirá funcionando. Entonces para dejar de ejecutarlo, simplemente
podemos agregar aquí, volver. Aquí, también emitimos el mismo motor de eventos de error
este mensaje a este mensaje. El texto del mensaje de contenido es
obligatorio maestro, y después de eso simplemente
agregamos return, que saldrá
de nuestro código de ejecutar este
resto del código. Además, eliminemos este código. Ahora nuestro front-end puede manejar este evento de error como
quieran, ya sea que muestren Alert, o muestren
notificaciones de brindis. Entonces aquí necesitamos importar
estos modelos de chat y mensaje. En la parte superior, antes de estas
rutas, agregamos costo, chat es igual a
requerir modelos de periodo, slash chats y
otro mensaje de costo es igual a requerir modelos de
periodo, mensajes de
slash, y hecho Guarde los cambios, y
probemos esta implementación. En el front end, archivo de puntos de
roomchat, podemos checar enviar mensaje estamos enviando los datos o no Sí, antes que nada, aquí
en el lugar del remitente, necesitamos enviar ID de usuario. Por ahora, agregamos aquí
nombre de usuario valor punto. Entonces en nuestra entrada de nombre de usuario, tenemos que pasar ID de usuario. Después de eso, contenido
a valor de entrada. Aquí, no necesitamos esto
creado en y estado porque generará automáticamente por
mangos, y eso es todo Guarde esto y
reformulemos la página. Aquí, necesitamos jet ID, así copiamos el jet ID
del Mongo D venimos
pasar y pegarlo aquí Ahora tenemos que escribir
aquí ID de usuario en el lugar de nombre de usuario
porque en caso de
que, establecemos ID de usuario como este
nombre de usuario punto Valor. Copiamos un ID de usuario de la colección de
usuarios de Mongo Divi Compass y lo
pegamos aquí como remitente.
Ahora escribe un mensaje. Digamos que el socket es fácil. Mira, obtenemos el mensaje y
si revisamos nuestra base de datos, y en la parte inferior, este
nuevo mensaje también está parado, nuestro evento send message
está funcionando correctamente.
196. Autenticar al usuario en Socket: Ahora actualmente en
nuestra implementación, estamos obteniendo el
ID de usuario actual desde el front-end. Pero en el mundo real, no podemos obtener ID de
usuario directamente
desde el front-end. Obviamente, por
razones de seguridad porque cualquiera puede tomar cualquier
ID de usuario y enviar el mensaje. Entonces tenemos que hacerlo
un poco más seguro. Y para eso,
usaremos middleware socket. Es el mismo concepto que
aplicamos middleware en nuestras Como nuestro middleware orth se ejecuta antes de cada solicitud de
devolución de llamada igual que el middleware socket se ejecutará antes de que nuestro Déjame mostrarte prácticamente. Aquí antes de este método
ao punto on, definimos nuestro
middleware socket usando ao dot U. Ahora en este método,
pasamos la función callback, que se ejecutará antes de que nuestro
usuario se conecte al Por ahora, simplemente agregamos aquí consola dot log, ejecutando
socket middleware Guarde los chanes y
refresquemos nuestro front-end. Aquí chat, ID, chat
subrayado uno, dos, tres. Ahora bien, si revisamos nuestro terminal de
back end, vea, aquí primero conseguimos ejecutar socket middleware.
Pero, ¿qué es esto? No conseguimos que un usuario se conecte. Así que aquí en nuestro middleware
socket, nuestro código se detiene Tenemos que moverlo en
la siguiente función, igual que hicimos en nuestro
Express o middleware En esta función de devolución de llamada, en la primera posición, obtenemos el objeto socket, que se utiliza para obtener
información sobre ese socket Y en el segundo
parámetro, obtenemos next, que funciona igual siguiente función en middleware
express Ahora, después de esta consola, simplemente
llamamos a esta
siguiente función. Guarda los cambios y
reprime la página. Ingresa aquí jet ID, y ahora en nuestro terminal, C, primero conseguimos ejecutar
socket middleware, y luego nos conectamos al usuario Por esto, está claro que el middleware socket se está ejecutando antes de que nuestro cliente se
conecte al Ahora en este middleware socket, podemos hacer autenticación de
usuario, y ¿cómo podemos hacer eso? Lo hicimos antes en
nuestro middleware de autenticación. Derecha. Para la autenticación,
utilizamos JWT Entonces en este middleware,
comprobamos, usuario pasa
el token JWT Es válido o no. Si es válido, sólo entonces el usuario
puede conectarse al socket. Y si token no es válido, entonces no vamos a permitir
usuario porque para jet, necesitamos iniciar sesión usuario. Ahora podría preguntarse,
¿cómo podemos obtener token en esta función de
middleware Entonces aquí usaremos
el objeto socket. Entonces Const token es igual
a socket dot Hensig. Aquí obtenemos datos que pasamos con nuestra conexión
socket. Nuestra planeación es obtener datos en objeto OT y dentro de
él, pasamos token. Aquí escribimos socket
dot hensgtth dot token. Después de esto, simplemente
pasamos aquí condición. Si el token no está disponible, ¿
entonces qué hacemos? Simplemente rechazamos la conexión. Para rechazar la conexión, volvemos aquí siguiente función, y dentro de ella, tenemos que
pasar nuevo error Aquí, pasamos mensaje de error a error de
autenticación,
token requerido. Ahora bien, ¿y si el token de paso de usuario? Simplemente, verificamos ese token, y para eso, necesitamos JWT Entonces, en la parte superior, costo, JWT es igual al token web
JSON requerido Bueno. Ahora en la base de datos, agregamos JWT dot verify En el primer argumento,
pasamos token, y en el segundo argumento, pasamos nuestra
clave secreta process dot
Env dot JWT underscore Permítanme verificar el nombre de
esta variable. Sí, es clave JWT. Ahora bien, si este token
se verifica con éxito, entonces aquí llegamos a los datos del usuario, que pasamos con token Lo almacenamos en la
variable llamada usuario, y luego simplemente podemos hacer socket punto usuario es igual a este usuario. Además, quiero que sepas que el objeto socket es
diferente para todos los usuarios. Entonces, cuando nuestro usuario se
conecte al socket, nuestro socket
les asignará este objeto, y por eso, es
individual para todos los usuarios. Este usuario de socket tiene nuestros datos
actuales de usuarios registrados. Entonces para ver eso,
simplemente consola dot log, socket user, y adherimos
socket dot user, y luego tenemos siguiente función. Ahora bien, ¿y si este
token no se verificó? Tenemos
que manejar ese caso también. Así que aquí agregamos try and cache blog y simplemente movemos estas cuatro
líneas en el blog Try. Entonces cualquier cosa sale mal
en estas cuatro líneas, nuestro método de caché se ejecutará. Entonces en caché, lo que hacemos bien, simplemente
rechazamos la conexión. Entonces copiemos esta
siguiente función con el error y péguela aquí. Además, en nuestro front-end de
degustación actual, necesitamos enviar los datos de
usuario de socket dot desde el back end. Así que aquí simplemente agrego socket
punto evento de datos de usuario, y simplemente pasamos
socket punto usuario. Por este evento, nuestro front end obtendrá los datos de los usuarios registrados. De lo contrario, necesitamos ingresar manualmente el ID de
usuario para la degustación. Ahora vamos a esta implementación. Para eso, necesitamos ejecutar
nuestro archivo de prueba final. Honestamente, este es el
último archivo de prueba. No te preocupes. En nuestra carpeta
front-end, obtenemos una carpeta llamada prueba
final. Y aquí, como sabemos, tenemos que ejecutar este archivo SDML Pero antes de eso, veamos qué hacía en el archivo
JavaScript. En primer lugar,
pido un token en el que tengamos que ingresar a
Jason Web token. Si ingresamos token, entonces solo
conectaremos usuario al socket. Pero espera en este
sentido, lo que
hice, agrego aquí objeto que
enviamos al socket
y en ese objeto, pasamos OT y también
token a nuestro token. Este objeto lo estamos recibiendo
en nuestro back end en el socket dot hang dot th
dot Tgon Ahora bien, si se verifica este token, entonces nuestra conexión
será exitosa. Y si este token no está
verificado o caducado, entonces en el
punto socket en el error Connect, obtenemos el error de
middleware socket Y también, cuando
obtenemos evento de datos de usuario, simplemente
configuro esos datos
en esta variable de usuario. También todo el código relacionado con socket, agregamos aquí en
esta condición if. A ver que está funcionando o no. Así que abre este archivo SDML en
las pestañas de cierre del navegador. Ahora, antes que nada,
va a pedir token. Pasemos aquí uno, dos, tres, y como sabemos, este token no
será verificado
por nuestro back end. Veamos qué obtenemos. Golpea Bien. Ver aquí obtenemos
error de autenticación, token requerido. Abra cartero y simplemente abra API de inicio de
sesión y envíe la
solicitud y obtenga el token Copia esto y simplemente
pégalo en nuestro archivo SDML. Verás, no obtenemos el error, y si comprobamos
nuestro terminal Bend, obtenemos aquí socket user
al detalle de nuestros usuarios con ID y nombre de usuario y
también conseguimos que un usuario se conecte, lo que significa que nuestro middleware
está funcionando bastante bien Ahora, usamos este
usuario socket dot en nuestro evento socket. En el evento send message, elimine este ID de usuario del
parámetro, y en la parte superior, agregamos cost user ID es igual al socket dot user,
y un Score ID. Asegúrate de verificar el nombre de la
propiedad ID y también en el evento de tipado en el lugar de obtener el nombre de usuario
desde el front-end, podemos pasar aquí socket
dot user, dot user name, y hacemos lo mismo en
el evento stop typing, socket dot user, dot user name. Ahora también, eliminamos el
parámetro de nombre de usuario para ambos eventos. Ahora, volvamos a probar
este mensaje de envío. Así que reprime la página
y basa el token. Ahora aquí necesitamos el ID de chat, así que copia eso también del
MongoiVCMPass Y pégalo en el
ID de chat y da clic en Unirse a la sala. Sin unirnos a la habitación, no
podemos mandar mensaje. Ahora bien, si enviamos el
mensaje desde aquí, digamos que este es el primer mensaje de
degustación final. Mira, aquí nos sale
el nuevo mensaje, y si revisamos nuestro back end, entonces también se está
almacenando en la base de datos con los datos de usuario
adecuados. Entonces, para recapitular rápidamente en nuestro socket, no
deberíamos obtener datos de usuario directamente desde el
front-end. No será seguro. Así que creamos este
middleware socket y preguntamos token
JWT antes de conectar al
usuario a Después de eso, verificamos
ese token y simplemente configuramos los datos del token
en el usuario socket dot. Así que aquí podemos usar este usuario socket dot en toda
nuestra lógica socket. Además, como sabemos,
el usuario socket dot es individual para
todos los usuarios de socket. Así es como aplicamos y aseguramos nuestro socket
usando JSON Web Token. Aquí, como nuestros
conceptos anteriores son claros, es realmente fácil entender temas
avanzados como
el middleware socket Y por eso te estoy explicando socket paso a paso para que
puedas entenderlo correctamente.
197. Cómo marcar usuarios como en línea y sin conexión: Cómo sabes, en
muchas aplicaciones de chat, obtenemos usuario activo
o marca en línea. ¿Crees cómo
aplican esa característica? No te preocupes en esta lección, marcaremos a los usuarios como
online y offline. En primer lugar, ¿qué
opinas cuando un usuario está en línea? Piénsalo en
el lenguaje humano. Nuestro usuario está en línea
cuando se conecta a socket, y cuando el usuario está desconectado, escribe, cuando el usuario dejó
tu aplicación, o podemos decir que se
desconectan a socket
simple como eso. Aquí antes de estos métodos IO, declaramos un nuevo
costo variable usuarios en línea es igual a nuevo mapa. Ahora, algunos de ustedes podrían
preguntarse, ¿qué es este mapa? El mapa es un
verson avanzado de nuestro objeto. También es colección
del par de valor clave. El mapa tiene
más entidades que objeto. Entonces como sabemos, en
objeto, la clave es la primavera. En valor, podemos
fijarlo a cualquier cosa. Pero en el mapa, podemos establecer
cualquier cosa cadena, número, lingotes, objeto,
matriz, función, cualquier tipo puede ser clave En resumen, para los removedores de
adiciones frecuentes, mapa es generalmente más
eficiente que el uso de objetos Está diseñado para manejar pares de valores
clave de manera
más eficiente. En este mapa, cada vez que el usuario se une, podemos agregar ese ID de usuario como clave y su ID de
punto de socket como valor. Entonces aquí en el
punto io en la conexión, simplemente escribimos usuarios
en línea conjunto de puntos. En el primer argumento, pasamos socket dot
user dot score ID, que es la clave en
el segundo argumento, pasamos socket dot ID,
que es nuestro valor. Ahora solo necesitamos eliminar al usuario cuando se perderá su
conexión, lo que simplemente significa que
este usuario está desconectado. Entonces en la parte inferior, agregamos socket dot on. Aquí, pasamos la desconexión, y luego pasamos la función de
devolución El método de desconexión se ejecutará cuando conexión de socket de
los usuarios dure. En ese momento, este método de
desconexión se ejecutará automáticamente. Además, cuando el usuario cierra
la pestaña del navegador, entonces también este
método de desconexión se ejecutará automáticamente. Por lo que no necesitamos preocuparnos un método
de desconexión desde el front-end. Aquí simplemente agregamos usuarios
en línea dot delete, socket dot user
dot underscore ID, que es el ID de
usuario actual Ver, en el mapa,
podemos usar directamente el método
set and delete para agregar
y eliminar pares de valores clave. Ahora veamos que
está funcionando o no. Por lo tanto, simplemente adherimos el registro de puntos de la
consola , los usuarios en
línea y
los usuarios en línea. Así que vamos a copiar esta
consola y pegarla cuando agreguemos usuario en este
mapa. Ahora, probemos esto. Así que p el archivo SDML
en la nueva pestaña, pega aquí tu token Y si revisamos
nuestro terminal Bend, vea aquí podemos ver
la clave de usuarios en línea para el ID de usuario y el ID de
socket como valor. Y si cerramos nuestra pestaña, entonces aquí podemos ver que nuestro usuario
en línea está vacío. Entonces es que es fácil. Puedes enviar a estos
usuarios en línea a tu front-end y mostrar indicadores como
punto verde o algo más.
198. Zócalos múltiples para un usuario único: Aquí hay una cosa en nuestra implementación
actual. Como sabemos, nuestra aplicación se
utilizará en el navegador o nuestro backend se
puede utilizar en aplicaciones Si nuestro usuario se conectó
en una pestaña, entonces el ID de usuario y el
ID de socket se agregarán en
los usuarios en línea. Ahora, si abre una nueva pestaña
y se conecta a socket, entonces en nuestros usuarios en línea, obtenemos otra clave como ID de usuario. Pero aquí, la
clave anterior y la clave actual es la misma por eso,
esta ID de socket será
reemplazada por una nueva ID de punto de socket. Ahora imagina que cierra
sólo la segunda pestaña. También eliminará ese valor de clave de usuario y
marcará a nuestro usuario como offline. Pero aquí sigue en línea. Sigue en línea
en la primera pestaña. Entonces aquí tenemos que resolver
este problema de duplicación. Entonces, ¿cuál es la solución aquí? Podemos agregar ID de usuario como
clave, igual que antes. Pero en el lugar de establecer el ID de
socket directamente, podemos agregar array o
conjunto de identificadores de socket, lo que significa que dos pestañas
tienen dos identificadores de socket. Tenemos ambos en esta matriz, y si el usuario cierra solo una pestaña, entonces podemos eliminar solo ese ID de socket
en particular de la matriz. Se puede ver lo
avanzado que vamos. Es broma. Implementemos
esto en nuestra aplicación. En primer lugar, antes de esto, añadimos costo ID de usuario es igual a socket punto usuario
punto subrayado ID Ahora aquí en el conjunto de puntos de
usuarios en línea, primero tenemos ID de usuario, y en el segundo
lugar como valor, pasamos Nuevo Set. Podrías preguntar qué es lo que está establecido. Set es la
versión avanzada de arreglos. No te preocupes.
Son realmente simples. La razón por la que usamos aquí establecido
en el lugar de la matriz es porque podemos agregar y
eliminar fácilmente los ID
de socket del socket. Esta línea significa que creamos un nuevo par de valores clave
en los usuarios en línea. La clave es el ID de usuario, y el valor se establece que está vacío. Aquí queremos crear
un nuevo par de valores clave si nuestro ID de usuario no está ya
disponible en usuarios en línea. Entonces aquí pasamos condición. Si los usuarios en línea tienen ID de usuario, si esto es falso, pasamos exclamación Mg. Sólo entonces
creamos un nuevo par de valores clave. Así que mueve esta línea aquí. Ahora después agregamos nuevo par, o incluso si el ID de usuario
ya está disponible, entonces
¿qué queremos hacer? Bien, simplemente queremos agregar el ID de punto de
socket en el valor. Entonces escribimos usuarios en línea punto
G, ¿qué queremos obtener? Escribe UserID como clave, y para agregar un valor en set, usamos el método dot add y
pasamos aquí socket dot Y por esta línea, agregamos valor de ID de punto de
socket en conjunto donde la clave es
ID de usuario, simple como eso. Así que aquí en el lugar de socket punto usuario
punto subrayado ID, pasamos ID de usuario Ahora en la desconexión, queremos quitar el ID de toma de
corriente. Así usuarios en línea punto gt userid
punto Dili, socket dot ID. Esto eliminará el ID de punto de socket del conjunto donde la
clave es el ID de usuario. Ahora bien, ¿y si nuestro usuario
no tiene ID de socket en el valor? En ese caso, también queremos
eliminar ID de usuario como par. Por eso, podemos marcar a
nuestro usuario fuera de línea. Por lo que pasamos tu condición
si los usuarios en línea puntan GET userid el tamaño del punto
es igual a cero Entonces simplemente
los usuarios en línea punteamos Dilate UserID. Entonces, como puedes ver, podemos agregar y eliminar
fácilmente
artículos del conjunto. En lugar de usar array
donde tenemos que encontrar índice de ese elemento y
luego eliminar ese elemento, podemos agregar y
eliminar fácilmente elementos del conjunto. A ver que está funcionando o no. Así que reprime la página, página aquí, nuestro token Ahora en la terminal, obtenemos map, que tiene un valor clave, ID de
usuario y socket. Ahora en el navegador,
abrimos otra pestaña. Aquí abrimos nuestro archivo DML, y nuevamente, déjame
pegar el mismo token Bien, y vamos a
revisar la terminal. Mira aquí tenemos un ID de usuario, y tiene dos valores, que es nuestro conjunto de identificadores de socket. Ahora intentemos cerrar
esta segunda conexión. Nuevamente, revisa el terminal. Mira que el último ID de socket
se elimina de aquí, pero nuestro usuario sigue en línea. Ahora si también cerramos la
primera pestaña, revisa el terminal. Ver, nuestro usuario es
eliminado del mapa, lo que significa que ahora nuestro
usuario está desconectado. Entonces así de sencillo es
marcar a los usuarios en línea y fuera de línea. Sé que esta sección
es un poco larga, pero puedes ver cómo está funcionando
esta
aplicación en tiempo real. Y si aprendes
esto, entonces puedes crear muchos tipos de aplicaciones en tiempo
real. Ahora aquí, puedes
tomarte un pequeño descanso, beber un poco de agua,
estirar tu cuerpo, o escuchar algo de música. Aquí también estoy tomando un pequeño descanso y nos
reuniremos en la siguiente lección.
199. Actualizar los mensajes entregados: Veamos cómo podemos actualizar el estado del mensaje a entregado. En primer lugar,
descubramos la lógica de la misma
para que obtengas una comprensión
clara cuando escribas el código. Así que el estado a entregado significa mensaje alcanzado
al dispositivo receptor. Ahora hay dos situaciones. Imagine remitente
envía el mensaje. Primero, almacenamos ese mensaje en la base de datos con
estado a enviar. Ahora, en ese momento, si
el destinatario está en línea, lo cual sabremos por nuestros usuarios
en línea variable. Entonces, si el destinatario está en línea, inmediatamente marcamos
ese mensaje como entregado. Esta es la primera situación. Ahora otra situación es que
nuestro destinatario está fuera de línea, lo que también conoceremos
por usuarios en línea variable. Entonces, si el ID del destinatario no está
disponible en los usuarios en línea, significa que está desconectado. Entonces, si el destinatario está desconectado, inicialmente nuestro
estado del mensaje está en envío. Ahora cada vez que el destinatario se conecta al socket, en su momento, recogemos todos los mensajes
no entregados
y los marcamos como Esta es la segunda situación. Vamos a aplicarlos uno por uno. Nuestra primera situación, nuestro
destinatario está en línea. Si él o ella está en línea, entonces simplemente marcamos el mensaje como entregado cuando el remitente
envía el mensaje. En el evento de enviar mensaje, aquí en el nuevo mensaje, necesitamos verificar que el destinatario de
este chat esté en línea o no. Consors a los usuarios en línea punto, y aquí tenemos que pasar el ID del destinatario. Pero,
¿cómo podemos conseguirlo? Bien, los obtendremos
de los participantes, pero es una matriz
con ID de remitente también. Entonces a partir de esa matriz,
tenemos que filtrar el ID del remitente. Entonces aquí,
los destinatarios const es igual a en punto participantes filtro de
punto Aquí, obtenemos cada función de flecha
ID y simplemente pasamos aquí condición ID punto dos cadena no
debe ser igual a ID de usuario. Aquí obtenemos array con ID único porque solo tenemos dos
usuarios en nuestros participantes. Por eso aquí
en el método He, pasamos los destinatarios paquete
cuadrado, índice cero, que es el primer elemento y
es Mongo DiBid, necesitamos
convertirlo en cadena Por lo tanto, agregamos
punto dos cadena. Ahora, ¿qué queremos hacer
si nuestro destinatario está en línea? Simplemente, devolvemos
el estado a entregado. Si esto no es cierto, entonces en lo demás volvemos enviado. Eso es. Esta es
nuestra primera situación. Ahora nuestra segunda situación es que
nuestro destinatario está fuera de línea. Entonces, cuando el destinatario abre la
aplicación y se conecta con socket, entonces obtenemos todos los mensajes
no entregados y simplemente
los marcamos como Aquí en socket, escuchamos
otro evento socket punto encendido, Marcar mensajes como entregados. Emitiremos este evento
desde el front-end cuando nuestro usuario inicie sesión y se
conecte con el socket. Ahora dentro de esto,
tenemos que hacer algunos pasos. Asegúrese de escribir estos
pasos en el comando. De lo contrario,
te confundirás. Primero, tenemos que encontrar todos los mensajes de chat en los
que nuestro usuario está disponible. Por lo tanto, el costo de los mensajes no entregados es igual a esperar mensaje dot find Además, hacemos esta llamada función
web asincrónica. Bueno. Como sabemos en
la primera posición, aquí pasamos objeto
con condición. Entonces primero, el estado a enviar y también el remitente
no debe ser el usuario actual. Remitente en objeto, usamos dólar N para no iguales y
pasamos aquí ID de usuario. Entonces no necesitamos todos los
campos de los mensajes. Entonces agregamos aquí
método select, y dentro de él, pasamos un ID de puntaje, ID de
chat y remitente. Ahora, esta consulta
encontrará todos los mensajes cuyo estado se envía y su remitente no es
nuestro usuario conectado, pero no
comprobará que nuestro
usuario conectado es participante
en el chat o no. Aquí también necesitamos
pasar ID de chat. Entonces, antes de esta consulta, necesitamos encontrar todos los jets en que nuestro
usuario conectado está disponible. Entonces Const chat IDs es igual
a esperar chat dot find. Aquí, pasamos Objeto con
participantes a ID de usuario. Esto nos dará una
charla así. Pero aquí solo queremos identificaciones de chat porque ese ID lo
pasaremos en nuestra consulta de actualización. Entonces, para distraer a los únicos ID de los datos en Mongo Di B, tenemos otro método llamado
distins y en los códigos, pasamos fill name que
queremos distraer,
que que Así que anteriormente, sin método
distinto, obtenemos datos como este. Ahora con disting obtenemos
nuestros datos así. Así que simplemente podemos pasar estos ID de
chat en nuestra consulta fina. Así chat ID dos calibracet
dólar en para chatear IDs. Por lo que ahora,
solo encontrará aquellos mensajes en que esté disponible nuestro
usuario bloqueado. Genial. Ahora necesitamos
actualizar solo estos mensajes. Entonces aquí pasamos
condición I
mensajes no entregados longitud de punto,
mayor que cero Sólo entonces queremos
actualizar el estado de los mensajes. En este calibracket esperan
mensaje punto actualizar muchos. Al principio, pasamos objeto para encontrar esos mensajes
no entregados Entonces pasamos subrayado
ID a objetar. Aquí, usamos dólar en, y como sabemos aquí, tenemos que pasar matriz de ID de mensaje. ¿Cómo
podemos conseguir eso? Los obtenemos de mensajes
no entregados, que es la matriz de IDs Escribimos
mensajes no entregados mapa de puntos. Aquí, obtenemos cada función de flecha de
mensaje, y simplemente devolvemos ID de subrayado de punto de
mensaje Por esta expresión,
obtenemos la matriz de ID de mensajes
no entregados porque método
map devuelve una matriz Además, podemos pasar directamente mensajes
no entregados aquí. Pero por ahora, me quedo con esto. Si quieres hacer
eso por separado, entonces también puedes hacerlo. Ahora, ¿qué quieres actualizar? Para eso, pasamos otro corchetes Cali
y pasamos aquí dólar fijado a objetar,
estado a entregado. Asegúrate de escribir la ortografía correcta que
escribes en el esquema del mensaje. Por lo que
actualizamos con éxito los mensajes. Ahora aquí viene una parte divertida. ¿Qué opinas? ¿Qué
debemos hacer después de esto? Entonces, para explicar esto con mayor claridad, imagina que Hale y
Mike tienen una charla. Actualmente, Mike está desconectado
y Hali envió tres mensajes. Como sabemos, por defecto, se enviará
su estado. Aquí, nuestro destinatario no
está en línea. La lógica en el evento de envío de mensaje no
hará nada. El estado permanecerá como enviado. Ahora, igual que Halley, John también envía dos
mensajes a Mike Su estado
también se establecerá como enviado. Ahora, después de algún tiempo, Mike entra en línea y se conecta
con el socket. En el momento en que actualicemos
esos tres mensajes de Halley y dos
mensajes del John, lo que significa que para
un total de cinco mensajes, actualizaremos el
estado como entregados Ahora bien, ¿qué deberían obtener Halley y John de la parte de atrás? Simplemente podemos enviar ID de tres mensajes de
Halley a Halley y ID de dos mensajes de John a John y decirles mensajes
cuyos ID son estos,
estos mensajes se
actualizan como entregados Entonces nuestro front-end actualizará la parte de
la interfaz de usuario usando esos ID, lo que significa que el front-end puede
mostrar iconos de verificación doble. Tan simple como eso. Ahora
aquí hay una cosa. Imagina que Halley envía 100 mensajes y Mike está desconectado
por un año Y cuando se pone en línea, después de la actualización debemos enviar los cien mensajes
IDs a Halley, puede aumentar la carga de datos Entonces lo que creo es que en lugar
de pasar todos los mensajes ID, podemos enviar jet ID qué títulos se actualizan para entregar, y ese ID de chat único
cubrirá todos esos mensajes
dentro de ese chat Así que no necesitamos
pasar todos los mensajes ID. Entonces aquí, nuestra
conclusión es que vamos a crear un objeto donde el nombre de
propiedad es el ID de usuario, y como valor, almacenamos una matriz de ID de chat
que se actualizan. La razón por la que usamos aquí matriz de ID de chat porque también
funcionará para el chat grupal. Para un solo usuario, puede haber varios ID de chat cuyos mensajes
se actualizan según se entregan. Ahora, después de obtener este objeto, elegiremos este ID de usuario, encontraremos el ID de socket de
nuestro mapa de usuarios en línea y simplemente emitiremos mensaje de evento entregado y enviaremos
esos ID de chat. Actualmente, no pienses en cómo front-end actualizará
los chats. Se puede gestionar. Aquí nuestro enfoque principal es
crear este objeto y enviar mensaje de evento
entregado a cada remitente. Resto del trabajo
realizado por front end. Nuestro front-end también actualizará
todos esos mensajes en la lista de chat y la lista
de mensajes la lista de chat y la lista
de mensajes o simplemente
redirigirá los datos. Vamos a implementar esta parte. Iremos paso a paso. La primera es que necesitamos
crear ese objeto que tenga ID de
usuario como propiedad y
matriz de ID de chat como valor. Const agrupados
ID de chat es igual a mensajes
no entregados dot reduce aquí tenemos dos parámetros,
AEC, que es el acumulador,
acumulador es acumulador A medida que obtenemos el mensaje que es
el objeto de mensaje único, función de
flecha, y en
el segundo argumento, podemos pasar el
valor predeterminado de este acumulador Entonces pasamos aquí objeto vacío. En primer lugar, lo comprobaremos. El remitente del mensaje ya está disponible en nuestro objeto
SC o no. I AC corchete
para acceder a la clave del objeto y pasar
aquí mensaje punto remitente. Si en acumulador, mensaje
punto remitente no está disponible, por lo que agregamos aquí signo de exclamación Entonces dentro de esto, creamos una propiedad por su
nombre acumulador, corchete,
mensaje punto remitente es igual a matriz vacía Después de eso, simplemente podemos agregar
ese jet ID en esta matriz. Acumulador, paquete cuadrado, remitente de punto de
mensaje, mensaje push de
punto, ID de chat de punto Este mensaje JetD es Object ID, así que tenemos que
convertirlo en cadena Al final, simplemente
regresamos acumulador. Esto asegura que el acumulador siga
creciendo con nuevos mensajes. Ahora en este código,
hay un pequeño problema. Si un remitente tiene varios
mensajes en el jet, entonces duplicaremos
estos ID de jet en la matriz, pero no queremos enviar ID de jet
duplicados en la matriz. Así que en el lugar de esta
matriz, podemos usar set. Set no agregará valores
duplicados. Entonces en el lugar de
esta matriz vacía, agregamos nuevo conjunto, y en el lugar de
usar el método dot push, usamos el método dot Ed para set. Los ID de chat de grupo
devolverán un objeto con el remitente como propiedad y establecerán
los ID de chat como valor. Ahora también al final, necesitamos valores en array, así que tenemos que convertir
set a array. Para eso, usamos
aquí para loop const, remitente en ID de chat grupal En ese bucle,
simplemente agrupamos los ID de chat, el remitente de
corchetes es igual a matriz
vacía y dentro de ella se
extendió operador y
simplemente agregamos ID de chat de grupo remitente de corchete
cuadrado. Ahora tenemos nuestro
objeto con ID de usuario como propiedad y matriz
de ID de chat como valor. Ahora tenemos que simplemente emitir
al remitente y pasar
jet IDs array como datos. Aquí nuevamente usamos for loop, const sender ID, jets agrupados El ID del remitente es la clave de
nuestro objeto ID de chat grupal. Ahora en este bucle,
tenemos que encontrar el ID del remitente está en línea o no. Entonces Const sockets es igual a los usuarios
en línea punto Obtener ID de remitente Si tenemos sockets, que ya
sabemos que puede ser array y usamos
sockets dot para cada uno. Aquí obtenemos ID de socket
individual, función de
flecha, y dentro de él, simplemente ioda dos
socketd.it En el segundo parámetro, pasamos ID de objeto de datos a
ID de chat de grupo, ID de remitente de paquete
cuadrado. Esto enviará todos los
ID CAT a este remitente. Entonces, si quieres, podemos
declararlo por separado. Entonces, los ID de chat de costo
son iguales a los ID de chat de grupo, corchete,
ID de remitente, y en la parte inferior, pasamos ID de
chat a ID de chat y listo. Ahora vamos a esta
implementación. Entonces los cambios, abrir navegador. En primera ventana, inicio sesión con
el token de Hal. Y en la segunda ventana, me conecté con
otra cuenta. Genera un nuevo token
para otra cuenta. Y pégalo en nuestro sitio web. Ahora, unámonos a Room. Así que copia el ID de chat de la brújula Mongo Dew y
pégala y únete a la habitación
desde la cuenta Hi Ahora envío mensaje. Esto es probar para primera situación de
entrega y enviarlo. Ver, aquí nos entregan. Esta es nuestra primera implementación cuando nuestro destinatario está en línea. Ahora, probemos cuando nuestro
destinatario está desconectado. Así que vamos a cerrar esta
segunda ventana y otra vez, enviar el mensaje de Hola esto está probando para segunda situación de
entrega. Mira aquí no recibimos
mensaje entregado. Si verificamos nuestra base de datos, recolección de
mensajes, actualizamos la colección,
y por fin, obtenemos nuestro
estado de mensaje es enviado, lo que significa que no se entrega. Ahora, cuando nuestro segundo
usuario se conecte, estado de
este mensaje
debería actualizarse y Hardy también obtiene los ID de chat
cuyos mensajes están actualizados Vamos a abrir la página SDML
en la segunda ventana. Inicia sesión con el token de segunda
cuenta, dónde está esto, copia esto
y agrégalo en token. Ahora, en el momento en que golpeamos Bien, S en la primera ventana, obtenemos el
icono de notificación en esta pestaña, y cuando nos movemos a esa ventana, obtenemos que se entreguen tus
mensajes de envío. Esto significa que nuestra implementación
está funcionando bien, y también en la consola, obtendrá los ID de jet
que se actualizan. Es parte muy interesante
de la aplicación de chat. Incluso cambiar el estado
a escena no es tan
difícil ya que este
estado de actualización se entrega. Si estás confundido, entonces
puedes volver a ver esta lección, entender la lógica
y con eso, comparar la lógica con tu código. De esta manera, tus todas tus
dudas se aclararán. Ahora en la siguiente lección,
implementaremos actualizar el estado de
los mensajes como se ve.
200. Actualizar el estado del mensaje para que se vea: Veamos cómo podemos actualizar
el estado del mensaje a escena. Estado visto significa que nuestro
destinatario vio ese mensaje. Entonces aquí también tenemos
dos situaciones. Vamos a
entenderlos con el ejemplo. Imagina que Harley tiene cuatro mensajes
inéditos de Mike. Se entrega el
estado de todos estos cuatro mensajes. Ahora, en el momento en que Halley
abre el chat de Mike en ese momento actualizamos
el estado de
estos cuatro
mensajes entregados a escena Por lo que tenemos que buscar
los mensajes entregados y
actualizarlos como se ve cuando nuestro
usuario abre el chat Esta es nuestra primera situación. Ahora imagina que Harley
ya está disponible en
el chat o sala, y Mike envía un mensaje. En ese momento, también, necesitamos marcar el nuevo mensaje Setters a escena porque Hurley ya
está disponible
en la sala de chat Esta es nuestra segunda situación. Vamos a implementarlos uno por uno. Así que en la primera situación, tenemos que actualizar las estadísticas cuando nuestro usuario se une a la
sala de chat ID. Así que aquí escuchamos
un evento más, call socket dot on, Marcamos los mensajes como se ve y
pasamos aquí la función callback En primer lugar, volveremos a encontrar todos los mensajes que
no son vistos por nuestro usuario actual Entonces const
mensajes no vistos es igual a esperar mensaje punto encontrar, y aquí pasamos objeto de
comparación primero ID de
chat a ID de chat, y obtendremos ID de chat desde el front-end
en este parámetro A hagamos esta
función asíncrona. Volver a nuestro objeto de comparación, ID de
chat a ID de chat, remitente a corchetes Cully, dólar NE no es igual a ID de usuario, que es el ID de usuario actual
que estamos obteniendo
del middleware socket y A medida que
pasamos estado Ahora aquí también, queremos
obtener solo rellenos seleccionados, así que seleccione punto y
ascore ID y remitente Ahora después de esta consulta fina, adherimos condición si los mensajes
no vistos la longitud del punto
es mayor que cero, solo entonces ejecutamos la consulta de actualización Entonces en esta condición, escribimos esperar mensaje, actualización de punto, muchos. Al principio, necesitamos el
mismo objeto condición. Así que copia este objeto
del método find
y pégala aquí. Bueno. Ahora en el
segundo argumento, necesitamos pasar objeto, set de dólares
mojados, Objeto,
estado, a escena. Déjame comprobar que pasamos ese
valor en nuestro esquema o no. Oh, aquí pasamos leer. Así que mancha esto a la escena porque esto es
más fácil de usar. Guarda esto y vuelve a nuestro evento. Ahora, de nuevo, la pregunta es la misma. ¿Qué queremos hacer después de
actualizar los mensajes como se ve? Derecho, informaremos a cada remitente cuyos mensajes
se actualicen a SN. Entonces aquí solo necesitamos el ID de remitentes porque nuestro jet ID es fijo, que obtenemos del front-end Debido a esto, es mucho más fácil que el evento
entregado. Así que los ID
de remitente de costo son iguales para decirme qué método usamos para extraer la nueva matriz
de la matriz existente. Correcto, utilizamos
mensajes no vistos dot Map. Aquí obtenemos la función de flecha de
mensaje único y simplemente devolvemos el remitente del punto del
mensaje. Este remitente es ID de objeto, por lo que necesitamos
convertirlo en cadena. Ahora, como sabemos, este método de
mapa recopila todos los ID de chat de
los mensajes no vistos, por lo que podríamos obtener ID de
remitente duplicados en esta matriz Podemos resolver eso usando set. Envolvemos este método de mapa con paréntesis y
aquí mismo, nuevo conjunto Crearemos set, y ahora para
convertir este conjunto en array, simplemente lo envolvemos con
corchetes y
extendemos el conjunto aquí. Este método de mapa
nos dará matriz con ID de remitente
duplicados. Por eso lo
convertimos en set. Yo establecí, no llegamos
a duplicar valores, y después de eso, volvemos a
convertirlo en simple array. Ahora tenemos ID de remitente, por lo que simplemente podemos hacer
for loop const sender, que es el ID de
remitente individual de los ID de remitente Asegúrate de que aquí usas not in porque usamos in para
obtener claves de objeto, y usamos de olvidar el
valor de array. Anteriormente, nuestros ID de
chat grupal son objeto. Es por eso que usamos en. Pero aquí, los
ID de remitente son array. Por eso usamos aquí fuera. Cometí este error antes y es realmente
frustrante porque no
me sale el error y aun así el código no funciona de
la manera que quiero Así que asegúrate de recordar eso. En este bucle,
volvemos a hacer sockets de costo es igual a
los usuarios en línea dot get Sender. Aquí, hacemos lo mismo que antes. Si hay enchufes disponibles, entonces enchufes punto fe. Aquí obtenemos ID de socket único, función de
flecha, y dentro de él, hacemos Iot dos, ID de
socket, escena de mensaje de punto m. Como datos, enviamos
el ID de chat a ID de chat, y también enviamos el
ID de usuario que envía esos mensajes. Visto por dos
ID de usuario, y eso es todo. Se puede ver lo sencillo que es. Esta es nuestra primera situación. Ahora vamos a implementar
segunda situación. En eso, nuestro usuario ya está
disponible en esa sala. Necesitamos actualizar el estado cuando otro usuario envíe un nuevo
mensaje en esa misma habitación. Así que en lugar de escribir lógica en enviar mensaje incluso podemos emitir los mismos mensajes de marca
como evento visto desde el front-end cuando el usuario recibe el nuevo mensaje
en la sala unida. Por lo que nuestra implementación final relacionada con la escena de estado
está completa aquí. Ahora simplemente probemos
esta implementación. Entonces en el front end, a medida que nos
unimos a una sala, después de eso, emitimos aquí este evento, marcamos los mensajes como se ven y
pasamos aquí el valor de ID de chat. También tenemos que emitir el mismo evento cuando
recibimos el nuevo mensaje. En el evento GET message, agregamos si condition
data dot sender dot guión bajo ID no es igual
al ID de guión bajo de punto de usuario Este es el ID de usuario de
nuestro usuario que ha iniciado sesión. Si esto es cierto, entonces
hacemos socket dot, Marcar los mensajes como se ve. En el segundo argumento, pasamos a valor de punto d. Ver los cambios y echar un vistazo. Refresquemos esta ventana y
pasemos aquí el token de Harley. Y también únete al jet. Y desde abajo,
enviamos el mensaje. Esto es para el
estado de la escena de degustación y enviarlo. Ahora, si en nuestra base de datos, revisamos nuestro último mensaje, vea su estado para enviar. Y ahora si abrimos una nueva ventana, e iniciamos sesión con mi
primer token de cuenta. Ahora, nuevamente, si comprobamos el estado de
nuestro mensaje, veremos que está actualizado para entregarlo. Ahora, copio este ID de chat, y de otro usuario,
me uno a esta sala. Ahora volvamos a revisar nuestra
base de datos y actualizar los datos. Mira aquí obtenemos mensaje a
escena y también ese usuario obtendrá datos con chat actualizado y quien vio
ese mensaje es. Entonces así es como actualizamos el
estado como se ve usando socket.
201. Agregar campos de grupo en Esquema: Ahora agreguemos algunas
características en nuestra aplicación. Actualmente, en nuestro chat, estamos implementados
solo uno a uno chat. Ahora agreguemos
también el chat grupal y no necesitamos
hacer mucho en él. En primer lugar, agregaremos algunos campos relacionados con grupos
en nuestro esquema de chat. Aquí en los participantes, podemos agregar múltiples usuarios
que forman parte de este grupo. Después de eso, también necesitamos último
mensaje, y después de eso, pasamos este grupo
y lo configuramos para que
escriba a Bullion y
default a false Aquí podemos agregar
comandos para grupos. Entonces, cuando implementamos características de
grupo, podemos recordar qué
campos necesitamos manejar. Ahora, después de eso, el
grupo tiene admin, entonces administradores, que pueden ser
uno o más de uno Simplemente copiamos la
matriz de participantes con
ID de objeto y ref al usuario. Agrégalo aquí. A continuación, ¿qué necesitamos? Sí, necesitamos nombre de grupo, que es tipo a cadena, y también el usuario puede agregar icono de
grupo o imagen de grupo, que también es tipo a cadena. Creo que esto es suficiente
para el chat grupal. También, aquí, asegúrese de no agregar requerido
a true para los rellenos de grupo porque
si el chat es uno a uno, entonces requerido a true para rellenos de
grupo puede
darnos un error de esquema. Ahora veamos qué tenemos que
hacer en el esquema del mensaje. Aquí para grupo, no
necesitamos agregar muchas cosas. Solo necesitamos estatus
para todos los miembros del grupo. En mensaje de grupo, el
estado no será suficiente. Entonces aquí simplemente agregamos el estado de entrega
archivado, que es array, y en el interior, almacenaremos objetos para el estado de
cada participante. Entonces primero, usuario en tipo de
objeto mongs esquema de punto Tipos de
punto punto ID de objeto Ref al usuario. Esta es la ID de usuario de cada
participante. También, para ese usuario,
agregamos estado, así que copia este mismo objeto desde aquí y pegarlo dentro de este. Ahora, después de eso, también necesitamos tiempo cuando nuestro mensaje
sea entregado, entregado en tipo a la fecha, y también necesitamos verlo en y
también escribir a la fecha y hecho, no
necesitamos más campos. Si en el futuro necesitamos, entonces definitivamente podemos
agregarlos aquí.
202. Crear una nueva API de grupo: Ahora vamos a crear API para
crear un nuevo grupo. Aquí, no necesitamos
usar socket para eso. En la ruta de chat,
simplemente podemos copiar esta API de creación de
chat y
pegarla en la parte inferior. Bueno. Ahora cambia el
punto final para crear grupo. Y en esta función,
tenemos que hacer pequeños cambios. Primero, en el lugar del receptor, obtenemos la matriz de participantes, que son los
ID de usuario de los participantes. Además, obtenemos el nombre de su grupo. Para la imagen de grupo, podemos agregar
por separado otra API. Y aquí necesitamos
desestructurar el órgano de solicitud. A continuación, también, cambiamos
la condición. Si los participantes
no están disponibles, entonces devolvemos mensaje de error, se requieren
participantes. Ahora aquí no
necesitamos encontrar ningún chat porque los mismos participantes
pueden tener múltiples grupos. Simplemente eliminamos esta
variable de chat y como
esta condición si. Y aquí agregamos const chat. Dentro del objeto, agregamos
participantes a participantes. Pero aquí también necesitamos agregar el ID de usuario
actual en la matriz de
participantes. Aquí agregamos array
y adherimos ID de usuario. A continuación, nombre de grupo a nombre de grupo. A es group a true, y pasamos administradores a array, y dentro de él,
pasamos el ID de usuario actual Si en el futuro, necesitamos agregar más participantes o queremos
eliminar participantes, o queremos agregar nuevos administradores
o actualizar el nombre del grupo, actualizar la imagen del grupo Por todo eso, podemos
crear APIs separadas. Por ahora, no los
necesitamos porque nuestro enfoque principal es aprender funciones de chat en tiempo
real. Así que vamos a probar esta API. Para eso, abrimos Cartero. Necesitamos otro usuario para
agregarlos en grupo. Así que abre registrar una nueva API de usuario. Aquí, pasamos otro nombre de usuario. John subrayado 24, correo electrónico
a john en red gml.com,
y contraseña, me quedo igual
de uno Sabes por qué Porque
olvidé las contraseñas. Buen usuario nuevo creado. Ahora vamos a duplicar la solicitud de
crear chat y cambiarle el nombre para crear un nuevo grupo y apuntar a cortar API HATS
slash Crear También en el encabezado, ya
tenemos token y
en el cuerpo en el objeto, primero tuvimos participantes para hacer
arreglos aquí agregamos todos los usuarios. De la base de datos, simplemente
copiamos la identificación de otras dos personas. Asegúrate de no copiar el ID de objeto de tu cuenta
corriente, que token
pasas en el encabezado. Bueno. Ahora, después de los participantes, pasamos el nombre del grupo, y ¿cómo debemos
nombrar al grupo? Digamos ninjas de nodo. Este es el nombre de la escuela, ¿verdad?
Sí, y envía la solicitud. Ver, aquí me sale error
interno del servidor. Déjame revisar lo que está mal. En una terminal, obtenemos
error en los participantes. Oh, aquí paso directamente
array dentro de array. Entonces difundimos la matriz de
participantes, guardamos los cambios y volvamos
a enviar la solicitud. Ver, aquí creamos
un nuevo jet grupal.
203. Cómo agregar la lógica del chat de grupo en los eventos de socket: Apliquemos la
lógica de chat grupal en nuestros eventos de socket. En primer lugar, comenzaremos
con enviar mensaje evento. Imagínese aquí, usuario envía un
nuevo mensaje en un grupo. Ahora, en ambos casos,
si el usuario envía un mensaje
uno a uno o el usuario envía un mensaje grupal
desde el front-end, solo
necesitamos pasar el contenido
del mensaje y
también el ID de chat. Entonces en nuestro chat grupal, también, comprobamos que el contenido
se pasa o no. También, encontramos el jet por su identificación. A continuación, también creamos un nuevo
mensaje con el mismo objeto, pero en el mensaje de grupo, tenemos que adherir
el estado de entrega, seleccionar el estado de entrega, y después de eso, pasamos condición
si el grupo jette es verdadero, entonces necesitamos crear una matriz de objeto que se vea así Entonces para eso, utilizamos el estado de
entrega es igual al jet dot participantes punto Mapa. Aquí, obtenemos la función de
flecha de usuario, y dentro de ella,
simplemente devolvemos Object. Ahora en el objeto, usuario a usuario, y estado a aquí,
pasamos condición. Los usuarios en línea doth usuario. Si esto es cierto, entonces
agregamos estado ha entregado. Según lo enviado. Además, agregamos entregado
a las dos aquí, también
necesitamos la misma condición, por lo que podemos agregar variable
antes de esta devolución. El costo en línea es igual al punto de los usuarios
en línea como usuario. Ahora en el lugar
de esta condición, pasamos en línea y en
el entregado en también, si el usuario es verdadero, entonces pasamos nueva fecha, lo contrario, pasamos nulo. Ahora aquí hay una cosa.
En estos participantes, también
obtenemos el ID
del remitente y
no queremos agregar
ID de remitente en el estado de entrega. Aquí tenemos destinatarios, que es la
versión filtrante de los participantes. Entonces en el lugar de los participantes de
jet dot, agregamos destinatarios dot Map. Por esto, no necesitamos actualizar el estado explícitamente en la parte inferior. Después de eso, también actualizamos
el último estado en el chat. Ahora aquí rellenamos los datos de
Sendar y emitimos el evento get message
para el ID de chat Ahora también rellenamos los datos, pero aquí también
necesitamos rellenar estado de
entrega del usuario
porque en uno a uno, solo
usamos nuestro estado global, pero en el chat grupal, tenemos que
mostrar cada tiempo de usuario Aquí agregamos otro método de
poblar. Al principio, el
estado de entrega punto usuario, y ¿qué
quieres rellenar Escribir subrayado
ID y nombre de usuario. Ahora veamos qué
tenemos que hacer en Marcar los mensajes como evento
entregado. Entonces, como sabemos, hacer que el estado de
entrega del usuario de
inicio de sesión en el mensaje de grupo
sea poco confuso. Entonces, en lugar de usar
el mismo evento, es mejor que creamos un
evento separado para el mensaje grupal. Por lo que estos mensajes de marca, como evento entregado es para un
solo chat uno a uno. También, en eso, necesitamos
hacer pequeños cambios. Como sabemos, estos ID de
chat son todos
los ID de chat en los que
nuestro usuario está disponible, pero esto también
incluirá chats grupales. Entonces aquí en el método de búsqueda de chat, pasamos una condición más. Grupo a falso, lo
que significa que
devolverá solo uno a un
jet, y eso es todo. No necesitamos cambiar
ninguna otra cosa. Ahora, vamos a crear un nuevo evento. Así socket punto en
evento, digamos, Marcar los mensajes de grupo
como entregados, y pasamos aquí una
SynclWCFunction Llamará a este evento cuando nuestro usuario inicie sesión en el front-end, igual que emitimos
los mensajes de marca como evento entregado. Ahora, antes que nada, necesitamos todos los ID de jet de grupo en los
que esté disponible nuestro usuario. Jet IDs es igual a
esperar chat dot find. En comparación Objeto, pasamos
participantes a ID de usuario. Es el grupo a la verdad. Y aquí solo queremos identificaciones. Entonces qué método
usaremos, derecho, usamos punto distinto y
pasamos aquí subrayado ID Ahora, después de eso, necesitamos encontrar mensajes
no entregados
en este grupo IDs cuyo estado se envía Así mismo que antes, const mensajes
no entregados es igual a esperar
mensaje punto encontrar Objeto, pasamos ID de
chat a objeto, dólar en ID de chat. También remitente a objeto, dólar N para nada
equivale a ID de usuario,
que es el ID de usuario que ha iniciado sesión Ahora necesitamos
encontrar también aquellos mensajes que no se entregan al usuario conectado
actual. Entonces aquí pasamos estado de entrega. Para objetar, y como sabemos, estado de
entrega es una matriz de objeto con el usuario y su estado. Necesitamos verificar usuario como nuestro ID de usuario y el estado
está configurado para enviar. Para ello, necesitamos
especificar la condición que debe coincidir dentro de
los elementos individuales de una matriz. En nuestro caso, es
usuario y estado. No te confundas, mira esto. Podemos usar aquí otro
Mongoiboperator, dólar Aleem,
match to object, y aquí
pasamos usuario a ID de usuario, y el estado del usuario se debe enviar Entonces por esta imagen, podemos especificar condición incluso
en la matriz de objetos. Además, no necesitamos
mensajes ni información, por lo que simplemente agregamos la selección de puntos, y pasamos aquí ID de subrayado, ID jet, remitente y
entregamos datos. Genial. Ahora, después de esto,
pasamos si condición mensajes
no entregados esa
longitud es mayor que cero Sólo entonces queremos
ejecutar la consulta de actualización. En este registro, usamos cuatro bucles, const de mensajes
no entregados Y dentro de este bucle de cuatro, simplemente
ponderamos
el mensaje punto actualizar uno. Primero, pasamos el objeto de
comparación, guión bajo al ID del guión bajo del
punto del mensaje,
y en los códigos, el
estado de la entrega punto usuario a usuario ID y en los códigos, el
estado de la entrega punto usuario a usuario En el segundo argumento, pasamos Object with dollar
set to object first in codes, delivery status dot dollar
dot status, dos entregados. Aquí, este
estado de punto dólar nos ayudará a actualizar solo ese relleno
cuyo usuario es ID de usuario. Ahora, también, queremos agregar
entregado a tiempo, en códigos, estado de
entrega dólar
punto entregado en, y pasamos aquí nueva fecha. Y hecho. Este
bucle for actualizará el estado a entregado para todos
estos mensajes no entregados Ahora bien, ¿qué queremos hacer
después de actualizar los mensajes? Bien, queremos enviar los ID del jet cuyo
estado se actualiza. Entonces, a partir de nuestros
mensajes de marca anteriores como evento entregado, simplemente
podemos copiar toda
esta lógica después de
este método de actualización. Y pégalo después
del loop de otoño y también asegúrate de que
también esté en el blog I. primer lugar, en este blog, estamos creando objeto
para remitentes y como valor,
obtenemos el conjunto de
ID de chat que se actualizan La razón por la que usamos aquí set
es porque eliminará todos los ID de chat duplicados y nos
dará ID de chat únicos. Después de eso, convertimos
eso en matriz, y por fin, ejecutamos este bucle de otoño para su
remitente desde los ID de jet de grupo. Y en este bucle,
encontramos los identificadores de socket de esos remitentes y simplemente emitimos el
estado del mensaje de evento actualizado, y pasamos esos ID de jet
a su remitente relacionado Entonces no necesitamos cambiar
nada en esta lógica. Se puede ver lo sencillo que es. Sólo tenemos que aclarar
lo que queremos hacer. Ahora pasemos al último evento, que es marcar los mensajes como se ve. Aquí también, creamos un evento separado para Marcar mensajes de
grupo como se ve. Punto de socket en Marcar mensajes de
grupo como se ve. Y aquí pasamos la función de
devolución de llamada ASN, y en el parámetro
de esta función, necesitamos Jet ID de ese grupo Ahora copiamos la consulta de
mensajes no entregados del evento
entregado por grupo y la pegamos aquí Ahora aquí cambiamos no entregados
a mensajes no vistos, chat, ID de chat, remitente a objeto, dólar NI para no es igual a
ID de usuario, estado de entrega,
imagen, ID de usuario a usuario, y el estado es objeto,
dólar, no es igual a escena Ahora podemos pasar la condición I si los mensajes
no vistos la longitud del punto
es mayor que cero, entonces queremos
ejecutar la consulta de actualización Nuevamente, copiamos este bucle
cuatro
del evento grupal entregado y lo
pegamos en nuestro evento visto. Ahora aquí cambiamos estos mensajes no entregados
a mensajes no vistos, y en el dólar de actualización establecido
en el lugar de entregado, comercializamos SN y también en
el lugar de entregado en, actualizamos SN Asegúrate de no obtener errores en ninguno de
estos brackets cli Ten cuidado con eso.
Ahora, ¿qué quieres hacer después de que actualicemos
los mensajes como se ve? Simplemente, copiamos la lógica
del simple evento de escena. Y pegarlo después de
nuestra consulta de actualización. Básicamente, aquí nos enfrentamos al remitente sary de
estos mensajes, y usando for loop, simplemente
emitimos
mensaje en evento con ID de
chat y visto
por, y eso es todo Ahora vamos a probar esta
implementación. Aquí, abrimos el
archivo SDML final en el navegador, pase token para el usuario Bueno. Ahora necesitamos
unirnos al chat grupal. Desde el Mongo Di brújula
en la colección de chat, simplemente
copiamos nuestro ID de chat grupal
y lo pegamos en el ID de chat
, y nos unimos a la sala Ahora vamos a mandar el
mensaje en este grupo. Hola, esto es
chat grupal y envíalo. Bueno. Si revisamos nuestra base de datos,
actualizamos la colección, y en la parte inferior, C obtenemos mensaje, y
en estado de entrega, obtenemos matriz vacía. Déjame ver qué está mal. Muévete a nuestro evento de envío de mensajes. Aquí en el nuevo mensaje, olvidamos agregar estado
de entrega. Así que el estado de
la entrega al estado de entrega, guarda los cambios, y volvamos a probar
o implementar. Actualizar el navegador,
pasar token de usuario. Copia el ID de chat de la colección de chat y pégalo en el
ID de chat y únete a la sala. Ahora volvamos a
enviar el mensaje. Hola, esto es chat grupal
y envía este mensaje. Ahora si nuevamente
revisamos nuestra base de datos, actualizamos la colección
en la parte inferior, obtenemos nuevo mensaje y
en el estado de entrega, ahora obtenemos estado para
cada participante. Genial. Ahora agreguemos
otra ventana abierta de nuevo sdmlfle aquí agrego un token
de Y en el momento en que golpeo Enter, vea en nuestra primera ventana, obtenemos notificación de su mensaje de
envío es entregado, lo que significa que nuestro evento de marcar grupo como evento entregado está funcionando. Refresco la base de datos, veo en el estado de
entrega del mensaje, ese estado de usuario se entrega, y también nos llega aquí
entregado en el momento. Bueno. Ahora déjame
unirme al mismo chat. Así que ve con este jet ID. Y pegarlo aquí
y unirse a la sala. Ver, en primera ventana, obtenemos notificación tu
mensaje es visto por este usuario. Si nuevamente revisamos la base de datos, actualizamos la colección,
y en la parte inferior, vemos para ese usuario, actualizamos nuestro estado tal y como se ve y también obtenemos
la escena en el momento. Esto significa que nuestros mensajes de
grupo de marca como evento de escena también
están funcionando correctamente. Es tan sencillo
y no confuso porque separamos la lógica
en diferentes eventos grupales. Entonces así es como implementamos el chat
grupal en el socket.
204. Sección 16: Opciones de despliegue: Bienvenido a la última sección del curso de pelo de
nodo definitivo. En esta sección, veremos el proceso de
despliegue de aplicaciones de
nodo. Por lo que actualmente, nuestra aplicación se está ejecutando en nuestra máquina local. Ahora para usar nuestra aplicación a nivel global, necesitamos implementarla. Es cosa realmente fácil.
No te preocupes por eso. Por lo que hay dos formas de
implementar aplicaciones de nodo. Podemos usar pass, lo que significa
plataforma como servicio, o podemos usar Docker Ahora podríamos preguntar qué
es pasar y Docker. Así que pasar o plataforma
como servicio significa que
podemos usar una plataforma que nos
ayude a implementar
nuestra aplicación. PAS, contamos con Render, Eoco, Google Cloud Platform, AWS, Microsoft, Azure, etcétera Estas plataformas proporcionan
variedad de funcionalidades, por lo que no necesitamos preocuparnos mucho
por el proceso de implementación. Es como, imagina que
quieres abrir un puesto de comida. Ahora, en lugar de
preocuparse por comprar una estufa, configurar la electricidad y obtener conexiones de agua, simplemente alquila una cocina totalmente
equipada. Aquí solo necesitas
traer tus ingredientes, cocinar tu comida
y empezar a vender. Eso es exactamente lo que
hace PAS por los desarrolladores. Con PA, no tenemos que
preocuparnos por configurar servidores, bases de datos, redes
o esquiar. Estas plataformas se
encargan de todo eso por nosotros. Simplemente escribimos nuestro código JS de nota, lo
implementamos y se
ejecuta. Tan simple como eso. otro lado, si quieres Por otro lado, si quieres
controlar tu implementación o si quieres implementar aplicación de nodo
en
tu propio servidor web, entonces Docker es una gran opción Con Docker, podemos
crear una imagen de nuestra aplicación e implementar esa imagen en cualquier
computadora del mundo Como adivina, usar Docker
es un proceso un poco complejo. Por ahora, no tenemos que
preocuparnos por eso. Entonces, si no
quieres preocuparte por servidores, balanceadores de carga,
infraestructura o reiniciar tu
aplicación en caso de caída,
entonces la plataforma como
servicio es una buena opción Por lo que en esta sección,
utilizaremos render para desplegar nuestra aplicación de nodo
porque tiene la forma más sencilla de
desplegar la aplicación de nodo, y además proporciona
unas excelentes características. diferentes personas les gusta
diferentes plataformas, pero creo que el render
es una gran manera de desplegarse y también
tiene llanta libre. Por lo que podemos implementar
nuestra aplicación de forma gratuita y sin
ningún dato de tarjeta.
205. Simplificar el código: Antes de implementar
nuestra aplicación, hagamos que nuestro
archivo index dot js sea más limpio y legible. Creará una buena
impresión en nuestro equipo y también
a todos nos gusta trabajar en código limpio. Hagamos que esto suceda. Aquí, creamos un
archivo separado para cosas separadas, como para la
conexión de base de datos, un archivo separado. Para rutas,
tenemos otro archivo, y para socket, también tenemos archivo
separado como ese. Es realmente simple.
Hagamos esto uno por uno. En primer lugar, separamos la conexión
a la base de datos. Aquí en nuestro proyecto, creamos una nueva carpeta
llamada startups. Dentro de esto, creamos un
nuevo archivo llamado DIBTJs. Ahora en este archivo, queremos
agregar código para la conexión a la
base de datos. Aquí, del archivo JS de punto
índice, corte el método Mongoose
dot Connect Y pegarlo en nuestro nuevo cinco. Ahora aquí necesitamos un
par de cosas. Primero, necesitamos que los
mangos succionado mangosta sea igual a Además, necesitamos este logger, sconct logger es
igual a requerir, vamos una carpeta arriba,
vamos a config, aquí
importamos Ahora, una pregunta que podrías hacer, ¿cómo podemos agregar este código
en nuestro archivo JS de punto índice? Es realmente simple. No te
confundas. Déjame mostrarte. Aquí en la parte inferior, simplemente módulo de
exportaciones de punto es igual a. Aquí agregamos función
dentro de esta función, simplemente
movemos este método Mangoose
dot Connect Volver al índice punto JS archivo. Dime ¿cómo podemos introducir algo desde el archivo
db dot js? Utilizamos las startups de
slash forward requeridas DV. Esta expresión, devuelve
lo que exportemos de este archivo DB y qué función
exportamos. Podemos almacenar eso en la
variable llamada const DB, y luego podemos
llamar a esta función En lugar de hacer
esto en dos líneas, simplemente
podemos
hacerlo en una línea. Aropris de almacenar esa
función en DB variable, simplemente
podemos llamarla aquí. Cuando llamamos a esa función, se ejecutará el código de
conexión,
y eso es lo que queremos. Entonces aquí se hace nuestro primer paso. Ahora separemos todas estas
rutas de implementación. En la carpeta de inicio,
creamos un nuevo archivo llamado routes dot js. Además, igual que antes, exportamos el módulo dot export es igual a funcionar
dentro de esta función, agregamos todas nuestras rutas. Así que corta estas rutas de todas las apps
con app middleware así curso express dot Json y
también middleware de error global Ellos y pegarlos
en nuestro archivo de rutas. Ahora aquí necesitamos un
par de cosas. En primer lugar, necesitamos esta app y ¿cómo
podemos conseguir esta app? ¿Deberíamos crear una nueva app en
este archivo y luego usarla? No, no podemos hacer eso porque eso creará una nueva aplicación
Express. Pero aquí queremos usar
nuestra misma aplicación. ¿Cuál es la solución aquí? La solución es realmente simple. Aquí, desde el
archivo js índice, después de este DB, habíamos requerido periodo, inicio de
barra, rutas de barra oblicua,
que es nuestra función Llamamos a esta función y
simplemente pasamos app como argumento. En nuestra función de rutas, simplemente
obtenemos app como parámetro. A continuación, ¿qué queremos? curso y cómo podemos obtener sí, podemos usar de la misma manera. Pero como sabemos, por supuesto
es nuestro paquete, y podemos usar paquete en
cualquier archivo simplemente por entrada. Con app, no podemos hacer eso, solo por eso
obtenemos app como parámetro. Entonces en la parte superior, el curso de Costo es
igual a requerir Cos. También, necesitamos express, que también
podemos importar aquí. Costo Express es igual
a requerir express. Ahora después de eso, también necesitamos
logger, sconct, logger, es igual a requerir, vamos uno más completo arriba,
config, Ahora, a continuación, necesitamos estas rutas, seconstUser rutas,
es igual a requerir Aquí, también movemos una
carpeta hacia arriba enruta a los usuarios. Ahora duplica esta línea dos
veces más usando alter plus tamizar, más flecha hacia abajo o opción
punto Tamizar más flecha abajo. Aquí primero, cambiamos
el nombre de la variable para publicar rutas y archivo para publicar. A continuación, cambiamos la
variable a rutas de chat y archivo a chats y eso es todo.
Terminamos con el Paso dos. Ahora separemos
nuestra lógica de socket. De esta variable de usuarios en línea, seleccionamos nuestro código hasta que
obtengamos el punto del servidor LISN Cortamos esta la carpeta de inicio, creamos un nuevo archivo
llamado socket dot js. En este archivo, nuevamente el módulo exportaciones de
punto es
igual a la función. En esta función,
agregamos nuestro código. Ahora, antes que nada, aquí
necesitamos este método AO. Dime, ¿deberíamos
crear un nuevo objeto Ao? Necesitamos usar ese
mismo objeto Ao que creamos usando server. En el archivo index dot js, habíamos requerido socket de
startups de periodo. Y aquí llamamos a esta función y simplemente
pasamos aquí Ao Object. En el archivo socket dot js, aquí obtenemos el objeto Io un
parámetro. Tan simple como eso. Ahora en esta lógica, tenemos
que importar muchas cosas, así que no trates de prisa. Vamos línea por línea. Ver, en este ous, necesitamos este JWT En la const superior, JWT es igual a
requerir el token web JSON.
A continuación, lo que necesitamos. Sí, necesitamos este modelo de chat, y también necesitamos
este modelo de mensaje. Entonces en la parte superior, costo
chat es igual a requerir aquí vamos una
carpeta b modelos chats. Además, si te
confundes al importar archivo, entonces déjame mostrarte mi trigonometría
cuando estoy importando archivo Aquí queremos
importar modelo de mensaje. Mensaje de costo es igual a
requerir, en primer lugar, contrajo todas las carpetas
usando este botón, y luego simplemente abro la
carpeta en la que estoy trabajando. Es startup, y también abrir carpeta desde la que
quiero importar. Eso son modelos. Actualmente,
estamos en la carpeta Stu Tenemos que salir
de esa carpeta,
así que agregamos período, barra hacia adelante de
período Entonces queremos ir
en la carpeta Modelos, e importamos del modelo de
mensajes. Ver, es así de simple. Ahora déjame ver
qué más necesitamos importar. Creo que eso es todo lo que necesitamos. Si nos perdemos algo,
entonces obtenemos error. No te preocupes por
eso. Ahora veamos cómo se
ve nuestro índice Dsi ver, ya está claro, pero vamos a dejarlo más claro. Aquí tenemos una gran cantidad de
entradas no utilizadas. Podemos eliminarlos. Primero, eliminamos la línea de entrada de
código, así que presione Control más X o Comando más X para
eliminar toda esa línea. Por lo que eliminamos a Mongos y eliminamos todas las importaciones realizadas las
cuales no se utilizan todas Ver, ahora nuestro código
se ve más limpio, fácil de escalar, y a todos
nos encanta trabajar con este tipo de aplicaciones
limpias. Así es como
debería verse el código de
desarrolladores profesionales .
206. Preparación de la aplicación Node para la producción: Ahora, antes de comenzar el proceso de
implementación, es mejor que preparemos nuestra aplicación de nodo
para la producción. Entonces para eso, necesitamos algunos paquetes como
el primero es casco. Ya usamos eso en
nuestro proyecto anterior. Básicamente, el casco se utiliza para la seguridad de nuestra aplicación. Es una excelente
opción para mejorar la seguridad de nuestra app
con una configuración mínima. Además, protege nuestra aplicación de vulnerabilidades web
comunes configurando automáticamente los encabezados STDP
adecuados En nuestro terminal NPM instalar casco y si quieres
usar el mismo erson que el mío, entonces puedes usar a la
tasa 8.1 0.0 y golpear Enter Ahora otro paquete
es la compresión. Este también es un
paquete muy útil para aplicaciones de nodo. Como sabemos, a veces tenemos que
enviar datos de big size
a muchos usuarios. Por ejemplo, lista de post
o lista de mensajes. Este paquete comprimirá esos datos de gran tamaño y reducirá la
carga de envío de big data. Entonces NPM instala Compresson en
el d 1.8 0.0 y pulsa Enter. Bueno. Ahora, vamos a implementar estos paquetes en
nuestra aplicación. No te preocupes, son solo
dos líneas de núcleo. Así que aquí en la carpeta de inicio, creamos un nuevo archivo
llamado prod dot js. En este archivo, importamos
estos dos paquetes. Entonces const, casco es igual a
requerir casco y const, compresión es igual
a requerir Igual que antes, exportamos
la función de este módulo. Entonces módulo dot export es igual a aquí
exportamos función. Aquí obtenemos app como parámetro, y dentro de ella, queremos
implementar este medio era. App dot U casco cual es
la función, nosotros lo llamamos. Por esto solo se
aplica casco en nuestra aplicación. También agregamos compresión app.us, y también lo llamamos y hecho Por estas dos líneas de código, aplicamos estos paquetes
en nuestra aplicación. Además, puede agregar este
código en el archivo route dot js. No hay nada de
malo en eso. Ahora aquí solo necesitamos importar este módulo en nuestro archivo principal
index dot js. Aquí antes de estas rutas, simplemente
requerimos period databsPD que
devolverá esa función Entonces tenemos
que llamar a esa función y simplemente pasar tu
app como argumento. Asegúrese de que se agregue
antes de importar esta ruta. Entonces nuestro casco y compresión aplican para todas las rutas,
y eso es todo. Al usar esas dos líneas, podemos hacer que nuestra
aplicación sea un poco mejor.
207. Descripción del proceso de implementación: Veamos la descripción general
del proceso de implementación para que no
nos confundamos. Actualmente, nuestro código está
disponible en nuestra máquina local, o podemos decir en nuestra computadora. Ahora para hacer que nuestra aplicación
viva en Internet,
utilizamos la plataforma de renderizado. En primer lugar,
subiremos nuestro código en Github, y luego conectaremos nuestro repositorio Github
con nuestro servicio, que es render. No
te preocupes por eso. Es realmente simple.
Te explicaré todos los pasos de manera sencilla
y fácil. Además, veremos cómo actualizar nuestro código después de
implementar nuestra aplicación. Empecemos con la carga de la aplicación de
nodo en Github.
208. Cómo subir una aplicación Node en Github: Veamos cómo podemos subir
nuestro proyecto en Github. Si no conoces
Github, en definitiva, es un sitio web que permite a
los desarrolladores almacenar, compartir y colaborar en
código con otros desarrolladores. Además, Github permite
a los desarrolladores crear repositorios o podemos llamar a repositorios donde pueden almacenar su código y realizar un seguimiento de
los cambios a lo largo del tiempo Esta es la mejor y más fácil
manera para que los equipos trabajen juntos en un mismo proyecto sin sobrescribir el código del
otro Entonces hay muchas formas de
subir nuestro código en Github, pero veremos la forma más fácil
y sencilla,
que es mediante el uso de la aplicación de
escritorio Github. Dirígete a Navegador y busca aplicación
Github Dektop
y abre este primer enlace Ahora da clic en el botón
Descargar. Esto llevará algún tiempo. Y después de completar
esta descarga, abra la configuración y se inicia
nuestro proceso de instalación. Bueno. Ahora, si abres esta
aplicación por primera vez, entonces tienes que iniciar sesión
con tu cuenta de Github. Entonces para mostrarte esto, elimino mi cuenta de Github de la aplicación de escritorio
Gitub Ahora para iniciar sesión, vaya
a archivo y abra Opciones y haga clic en este
signo en forgitub.com Continuar con el navegador. Esto nos redirigirá en el sitio web de
Gituboficial, llenará su nombre de usuario y contraseña de su cuenta de Gitub
y Tengo que verificar mi
cuenta y listo. Y ahora da click en esta aplicación de escritorio Open
Github. Automáticamente
nos redirigirá en nuestra aplicación. No te preocupes, solo necesitas
configurarlo por primera vez. Ahora verifiquemos que
iniciamos sesión o no. Así que de nuevo, vamos a
archivo
y Opciones, y en las cuentas, podemos
ver que tenemos nuestras cuentas. Ve a la opción Git,
y desde aquí, podemos establecer nuestro nombre y
correo electrónico para nuestro Github. Entonces, cuando empujemos
código en el Github, otros miembros del equipo
verán este nombre y correo electrónico. También asegúrate de seleccionar tu correo electrónico oficial
aquí y haz clic en Guardar. Ahora, antes de seguir
adelante, como sabemos, en nuestro proyecto, tenemos carpeta de módulos de
nodo. No queremos publicar esto en
Github porque en cualquier momento, podemos generar la carpeta
Node Module usando el comando NPM install. Entonces es inútil, subimos
toda la carpeta de módulos de nodo, que tiene muchos archivos. Entonces tenemos que ignorar esa carpeta para que no se suba en Github. Para eso, en nuestro
proyecto en la raíz, creamos un nuevo archivo
llamado dot git ignore. Asegúrate de no cometer
ningún tipo de errata en este nombre de archivo. Debe ser punto gitignore. Ahora en este archivo,
podemos agregar qué archivos y carpetas queremos
ignorar o en palabras simples, qué archivos y carpeta, no
queremos
subir en Github. Supongamos que queremos ignorar
esta carpeta de módulos de nodo, por lo que escribimos módulos de
subrayado de nodo, que es el
nombre de la carpeta y la diagonal hacia adelante, lo que indica que esta es Del mismo modo, queremos
ignorar la carpeta de registros. Entonces, ¿qué escribimos? Escribir registros hacia adelante barra diagonal.
Ahora aquí hay una cosa. Cuando subamos nuestro código
en Github, como sabemos, este código se hará público y todos podrán
ver nuestro proyecto. Ahora supongamos que subimos
nuestro proyecto y este donVfle también se
suba Por eso, nuestra información toda
secreta se
hará pública y
cualquiera puede hacer un mal uso de ella. Entonces tenemos que añadir también este archivo
punto NV y gitignore. Déjame mostrarte cud corto para
obtener el archivo Gate Ignorar. Simplemente vaya a su navegador y
busque, Get Ignore, Github. Abre este primer enlace, y aquí obtenemos todas las plantillas para diferentes tipos
de aplicación. Tener Android Git Ignorar. Además, tienes C plus, C, y muchos más archivos. Ahora busca en la parte superior, nodo gitignore y
abre Ver, aquí obtenemos el contenido
del archivo GetI Nur. Simplemente copie este código y agregue ese código en
nuestro archivo GetI Nur Guarde los cambios, y
tenemos nuestro archivo GetI Nur. Fresco. Ahora por fin vamos a
subir nuestro código en Github. Para agregar nuestro código
al repositorio, vaya a Archivo y seleccione
Agregar repositorio local. Y aquí seleccionamos nuestro camino
de nuestra aplicación inkifi. Ahora aquí dice que tenemos que
crear un nuevo repositorio, así que da clic en ese enlace. Y aquí tenemos que pasar
nuestro nombre de repositorio. También, podemos escribir
aquí descripción. Esta es la aplicación de
redes sociales y haz clic en Crear repositorio. Ahora verifiquemos que
teníamos el camino correcto o no. Así que da clic en mostrar en Explorer y vea aquí
obtenemos nuestra carpeta Linky five, así que ciérrela, y simplemente haga clic
en Repositorio publicado Aquí podemos cambiar el nombre y descripción del
repositorio, y también podemos seleccionar
la privacidad del código. Además, puedes hacerlo privado, pero quiero
darte este código. Por eso lo hago público
y hago clic en Publicar. Tomará algún tiempo y listo. Vamos a verlo en Github, así que da clic en ver en Github y vea aquí
obtenemos nuestra aplicación. Encantadora. Puedes ver lo
sencillo que es subir
código en Github. Ahora en la siguiente lección,
configuraremos nuestra cuenta de render.
209. Implementación de una aplicación de nodo en el procesamiento: Implementemos nuestra
aplicación backend en Render. Así que dirígete a render.com, y antes que nada,
registraremos nuestra cuenta aquí Podemos usar Google o Github para el registro o simplemente podemos
usar el correo electrónico y la contraseña, y obtuvimos este dashboard.
No te preocupes por eso. Simplemente haga clic en el botón Nuevo, y aquí seleccionamos servicio web. Ahora aquí necesitamos conectar
nuestra cuenta de Github. Entonces Glicon conecta Github e inicia sesión con tu cuenta de
Github Asegúrate de usar la misma cuenta de Github en la que publicamos
nuestro código backend Desde esta página, podemos seleccionar qué repositorio queremos
agregar en nuestra cuenta de render. También puedes agregar todos los repositorios, pero en mi sugerencia, seleccionar solo la opción de repositorio seleccionada. Desde aquí, podemos
seleccionar repositorio, así podemos seleccionar nuestra aplicación
inkifi Ahora, esto
nos redirigirá al dashboard home. Ver, ahora tenemos aquí
nuestro repositorio. Simplemente, da clic en
este repositorio, y aquí obtenemos nuestro formulario. Ahora, antes que nada, aquí
agregamos nuestro nombre de aplicación, que es nuestro Linkifi Obtendremos este nombre como nuestra URL
base de nuestra aplicación. A continuación, tenemos entorno que se establece en nodo.
No cambies eso. A continuación, podemos seleccionar la sucursal de nuestro repositorio Github
que es principal o master. También, podemos seleccionar región. Ahora para el directorio raíz, agregamos period, y
para el comando build, escribimos NPM install. Para el comando start, simplemente
agregamos node index dot js. Básicamente, mediante este comando, render ejecutará nuestra aplicación. Desde abajo, seleccionamos nuestro tipo de servicio que
seleccionamos de forma gratuita. Ahora da click en este
desplegable Avanzado y seleccionamos Agregar Archivo Secreto y dale un nombre punto y V. Ahora volvemos
a nuestro proyecto vagón, y en eso abrimos DotyNVFle en el que tenemos Simplemente copie todo el código
y en el sitio web de Render, haga clic en Contenidos y
pegue nuestro código aquí. Ahora basta con hacer clic en
Crear servicio web y ver que se inicia nuestro
proceso de implementación. Tomará algún tiempo
como de cinco a 10 minutos. C, construir con éxito. Ahora se está desplegando
y después de eso, me sale un error en una
conexión B golosa. Déjame revisar esto. Es error relacionado con
la variable DB. Creo que me
equivoqué al agregar archivo secreto. Entonces aquí vamos a la pestaña de
medio ambiente, y aquí, déjame revisar el contenido del
archivo. Es bueno. Oh, aquí entro
mal nombre de archivo. Debería ser DotNV. Intencionalmente creo
este error porque quiero mostrarte cómo
verificar el entorno de un autobús. S los cambios, y de
vuelta a Logstb. Aquí, volverá a iniciar
el proceso de despliegue. Y vea aquí nuevamente obtenemos
error en la conexión a la base de datos. ¿Por qué? Por lo que actualmente, nuestra
base de datos es base de datos local, lo
que significa que está funcionando
en nuestra máquina local. Ahora cuando implementamos la aplicación de
nodo, no
podemos acceder a la base de datos local. Entonces en ese momento, tenemos que
agregar base de datos Cloud, y lo haremos
en la siguiente lección.
210. Cómo agregar MongoDB Cloud: Actualmente en nuestro back end, tenemos la base de datos local de Mongo
Debe,
por lo que tenemos que crear nuestra base por lo que tenemos que crear nuestra Mongo Dibe
en la Nube Por eso, todos los usuarios
utilizarán la misma base de datos. Así que dirígete a mongotib.com y simplemente regístrate Solo tardará 1
minuto en configurarlo. Ya me inscribo, así que aquí trato de iniciar
sesión con mi cuenta. Gracias a Dios, está abierto. Ahora en la esquina superior izquierda, aquí obtenemos nuevo botón de Proyecto. Da click en eso y aquí
escribimos nuestro nombre de proyecto, que es nuestro Linky fi
y damos click en siguiente Ahora desde aquí, podemos agregar miembros
del equipo a nuestro proyecto. Simplemente haga clic en Crear proyecto. Ahora haga clic en el botón Crear. Aquí, seleccionamos plan, simplemente vaya a la versión gratuita y
haga clic en Crear implementación. Y vea aquí obtenemos nuestro nombre de usuario y contraseña
para nuestra base de datos. Entonces copio el primer nombre de usuario y
en nota pagada, lo pego aquí. Después de eso, copia también esta contraseña aleatoria
y pégala también. Este es el paso más importante. Podemos guardar este nombre de usuario y contraseña como respaldo
de nuestra base de datos. Ahora haga clic en Crear base de datos. A continuación, hacemos clic en, escogemos un método de conexión. Seleccione aquí Brújula. Ver, aquí obtenemos la URL de
conexión de Mangaib para Cloud. te preocupes, simplemente
copie este enlace de base y en nuestro archivo ENV en el lugar de esta tinta Mangaibi
local, pegamos nuestro Además, aquí olvidé agregar un nombre de base de datos
al final de esta URL. Así que asegúrate de
agregarlo así. ¿Bien? Ahora vamos a continuar. Tenemos que dar acceso
a una red que pueda leer y escribir
datos en nuestra base de datos. Desde cualquier lugar, el usuario puede acceder a nuestra base de datos y
obtener post de ella. En el lado izquierdo,
vaya a Red Xs. Aquí tenemos nuestra dirección
actual. Haga clic en Editar y simplemente haga clic en Permitir
acceso desde cualquier lugar. Usted establece nuestra dirección en 0.0.0.0, que es el ases para cada
uno y da clic en Esto tomará poco tiempo
y verá que está activo. Bueno. Además, si quieres verificar la
configuración relacionada con el acceso a la base de datos como editar
contraseña o algo así, entonces puedes hacerlo
desde este paso. Ahora, verifiquemos que
esté conectado o no. Así que abre terminal
y escribe nodo, index dot js, y presiona Enter. Esto llevará algún
tiempo y nos
vamos a conectar
con éxito, por lo que está funcionando. Ahora tenemos que actualizar
nuestro código desplegado. ¿Cómo podemos hacer eso? Simplemente, solo necesitamos empujar nuestro código
a Github y render detectará automáticamente
esos cambios, y es por eso que
no agregamos ningún proyecto a Github. Ahora aquí hay una cosa.
Sabemos que ignoramos este archivo Dotty y V para que no se
cargue en Github Para actualizar los valores de las
variables de entorno, necesitamos ir
al sitio web de render. Aquí seleccionamos variables de
entorno. Da click en editar y
simplemente desde aquí, podemos editar nuestros valores. Sustituyo la URL de la base de datos a la Nube. Aquí también, tienes que agregar tu nombre de base de datos
al final de esta URL. Ahora, haga clic en, guarde, reconstruya e despliegue. Bueno. Si revisamos nuestros registros, después de algún tiempo,
volveremos a implementar el registro. Y mira aquí conseguimos que Mongo a
B se conecten con éxito. Encantadora. Ahora, probemos que nuestra aplicación
en realidad está funcionando o no. Así que aquí copiamos la URL
de Cspace de nuestra aplicación desplegada. Ahora abierto cartero, y en esto, duplicamos esta creación nueva API de usuario porque solo
creamos la base de datos fresca, por lo que no tenemos nuestros datos
anteriores en ella Ahora cambiemos la URL del host
local con la URL nuestra aplicación
implementada y enviemos la solicitud. Mira, aquí obtenemos JWT Token, lo que significa que nuestra API está
funcionando. Vamos a verificar eso. En el sitio web de
Mongo Deb, ve a nuestra app Linkify aquí obtenemos Browse Colection y vemos, aquí obtenemos todas nuestras colecciones,
y yo comprobamos y yo Ver, aquí conseguimos el nuevo usuario. Encantadora. Pero espera, mientras estoy llegando aquí
sabor nombre de base de datos. Creo que se me olvidó agregar el nombre de la
base de datos en
la URL de la colección. Vaya a
variables de entorno, haga clic en Editar. Y sí, después de esta URL, agrego forward slas y
aquí agrego nombre de base de datos Digamos, nuestro Linky fi y simplemente haga clic en Guardar,
reconstruir e implementar Reconstruirá nuestra aplicación, y al final, nos conectamos
con nuestra base de datos. Déjame probar de nuevo la API, enviar la nueva solicitud de usuario, y aquí me sale nuevo token. Bueno. Ahora ve al sitio web de Mongoib
y actualiza la base de datos. Ver, aquí consigo nuestra base de datos
inkifi. Genial. Ahora déjame mostrarte también cómo podemos actualizar nuestro
código y volver a implementarlo. Entonces, en nuestro proyecto,
¿qué podemos cambiar? Vamos a este mensaje de Consola, servidor se está ejecutando en portar PT. Esto es solo para demo, guarda los cambios y para
actualizar el código en render. Tenemos que simplemente empujar
nuestro código en Github,
renderizar, automáticamente recuperaremos nuestras actualizaciones y lo volveremos a implementar Así que volvamos a nuestra aplicación de
escritorio Github, y aquí pasamos Commit message. Digamos, actualice el mensaje de la
Consola y haga clic en Commit
one file to main, y al final,
simplemente push origin. Ahora en nuestro sitio web de render, vamos a la sección de despliegue, y aquí después de uno a 2 minutos, podemos ver que se está
desplegando y al final,
conseguimos que el servidor se esté ejecutando
en el puerto Nuestro puerto, lo que significa que nuestro código se
actualizó con éxito. Puede ver que el proceso de implementación
es realmente simple y fácil. Solo necesitas
subir tu código en el repositorio
Github y
luego usando render, implementaremos nuestra
aplicación rápidamente. Y si queremos
actualizar nuestra aplicación, entonces solo necesitamos
empujar los cambios en
el Github y en los
dos a 3 minutos, nuestro servidor se reiniciará
y obtendremos nuestras actualizaciones.
211. ¿Qué es la arquitectura MVC? [EXTRA]: Ahora bien, si estás
trabajando como desarrollador, entonces
definitivamente has escuchado sobre arquitectura
MVC
en grandes proyectos Entonces veamos qué es la
arquitectura MVC y por qué la necesitamos. Así que MVC significa controlador de vista de
modelo. Básicamente, es una forma de organizar nuestro núcleo de
aplicaciones. Entonces, en el futuro, será
mucho más fácil administrar, mantener y escalar
la aplicación. En palabras simples, se trata una estructura de carpetas que separa diferentes partes
de nuestra aplicación. En la arquitectura MVC, creamos
tres carpetas separadas. Uno para el modelo, el segundo para la vista y el tercero para el controlador. No te confundas.
Es realmente simple. Así que la carpeta modelo es
donde viven nuestros datos. Aquí, tenemos que
definir cómo deben
ser los datos de estructura y cómo
interactuar con su base de datos. Por ejemplo, en la aplicación
Node, ya
creamos la carpeta de
modelos, y en eso almacenamos
todos los modelos y esquemas para cada colección
Mongo be, y por eso nombramos a
esta carpeta como A continuación, tenemos ver carpeta. Ver significa lo que ve el usuario. Es la parte UI
de nuestra aplicación. Por ejemplo, en la aplicación
Node, podríamos tener
motores de plantillas como EJS o PUG o tenemos archivos
SDML o CSS, que queremos mostrar Entonces, si tenemos código relacionado con front
end, entonces podemos almacenar ese
código en la carpeta view. Ahora por fin, tenemos la carpeta
del controlador. En la carpeta Controller,
almacenaremos la lógica de
nuestra aplicación. Por ejemplo, si
abrimos la ruta de nuestro usuario, aquí podemos ver esta es la función de devolución de llamada
ASN, que se ejecuta cuando alguien envía solicitud de
publicación en este Esta es la parte lógica.
En la carpeta de Controller, almacenaremos
las funciones ASN por separado, y luego simplemente
lo importaremos aquí en las rutas No te preocupes,
simplemente tenemos que cortar y pegar
estas funciones. Eso lo veremos
en tan solo un minuto. Aquí entendemos el modelo
MVC para datos, vista para cosas relacionadas con la interfaz y controlador para la lógica de la
aplicación Pero podría preguntarse, ¿cuál es el punto de esta arquitectura
MVC ¿Por qué les gusta a las grandes empresas? Entonces como sabemos en las grandes empresas, hay grandes equipos que están
trabajando en una sola aplicación. Si creamos una carpeta separada
para cada parte como modelo, vista y controlador, entonces creará una separación
de preocupaciones. Aquí por separación, nuestro
código puede ser más fácil de administrar. Supongamos que un equipo trabaja en
las características relacionadas con la publicación, segundo equipo trabaja en funciones relacionadas con el
pago y otro equipo trabaja en
las funciones relacionadas con el usuario. Cada equipo no necesitó tocar modelo de
publicación o el archivo de
modelo de pago o el archivo de modelo de usuario. Trabajarán en sus características
separadas, y es por eso que cuando
empujan código en Github, no
surgirán grandes conflictos. Además, otro beneficio de MVC
es que es fácil de mantener. Queremos actualizar el modelo, entonces no necesitamos
actualizar los archivos de vista. Otro beneficio es que es
mucho más fácil de escalar. medida que nuestra app crece, es más fácil agregar nuevas funcionalidades porque todo ya
está bien organizado, y es por ello que
las grandes empresas y hoy en día freelancers también bajan
esta arquitectura MVC Ahora aquí está la estructura de
carpetas para la arquitectura MVC en Node JS La primera es nuestra carpeta
principal de proyectos. Después de eso, agregamos el archivo JS de punto
índice, que es nuestro archivo principal. Además, agregamos otros
archivos o carpetas como paquete punto sn archivo o punto archivo ENV
o carpeta middleware,
te quedas aquí en
la carpeta te quedas aquí en
la Después de eso, agregamos
carpeta de modelos en todos los modelos que almacenamos. A continuación, carpeta para todos
los archivos relacionados con la interfaz de usuario, y luego carpeta Controllers
para toda la parte lógica, y en Node JS,
tenemos carpeta rutas. Entonces agregaremos todas las
rutas en esta carpeta. Ahora bien, esta estructura de carpetas es buena para proyectos pequeños o
medianos, pero las grandes empresas
como Paypal y Netflix usan una estructura de carpetas poco
diferente. Definitivamente depende de usted y su empresa la
estructura de carpetas que seleccione. Te mostraré ambas opciones. Esta otra opción es
un poco diferente y es buena para aplicaciones Big
Bend. Aquí estamos carpeta principal del proyecto. En eso teníamos
index dot archivo JS, que es el principal
punto de entrada de nuestra aplicación. Además, nosotros en archivos ENV, paquete dot JCNFLE Docker archivos,
y UploadedFles, y carpetas Después de eso, aquí agregamos
otra carpeta llamada source o SRC aquí podemos
almacenar nuestra carpeta middleware,
convey folder, y carpeta Utils
, Además, en la carpeta SRC, almacenamos la carpeta de módulos
para cada módulo, y en esta carpeta, podemos agregar carpetas para cada
característica como carpeta de usuario, carpeta correos, etcétera En esta cada carpeta, podemos definir tres archivos, user dot model dot gs
user dot routes dot js, y user dot controller dot js. Así podemos agregar un archivo más
usuario punto servicio dot js. Este archivo no es obligatorio, pero a algunas empresas
les gusta usarlo. En este archivo de servicio, podemos almacenar consultas de base de datos. No es obligatorio agregar este usuario dot
service dot js file, pero a algunas empresas
les gusta agregarlo. Entonces así, podemos agregar cuatro
archivos para la carpeta post también. Cuando queremos agregar
una nueva característica como producto, creamos la carpeta producto
aquí en la carpeta de módulos, y luego podemos agregar cuatro
archivos en la carpeta del producto. Como podemos ver, esto
es mucho complejo, pero es realmente bueno para aplicaciones grandes
y complejas. Puedes usar lo
que quieras. Depende totalmente de ti. La estructura de la carpeta puede ser un poco diferente para una
empresa a otra. No te preocupes por eso.
Ahora en la siguiente lección, aplicaremos la arquitectura MVC
en nuestra aplicación, y luego implementaremos
esos cambios
212. Aplica arquitectura MVC [EXTRA]: Ahora, apliquemos la arquitectura
MVC en nuestro proyecto Linky Fi Entonces actualmente en nuestra aplicación, tenemos estructura muy
organizada, como ya tenemos carpeta de modelos y
carpeta Rutas. Aquí, no necesitamos ver carpeta porque no
hay código de motor de plantilla. Así que tenemos que hacer un poco para manejarlo. Entonces hagámoslo. En primer lugar, aquí
creamos la carpeta llamada SRC. N S como esta carpeta de configuración, mantenga presionada la tecla Control o Comando,
selecciónela hasta las carpetas Stu Asegúrate de no mover
esta carpeta de módulos Node. Bueno. Ahora veamos qué tenemos que cambiar en
el archivo JS índice. En su mayoría, tenemos que cambiar
las partes del archivo de entrada. Mira, aquí tenemos
estos caminos startu. Tenemos que actualizarlo. Aquí creamos múltiples cursor manteniendo pulsado alter u opción. Y agrega aquí SRC, para asegurarnos de que estamos
obteniendo este archivo o no, déjame verificar quitando
este nombre de archivo Mira aquí estamos recibiendo sugerencias de
archivos, lo que significa que es correcto. Ahora no necesitamos cambiar nada en el
índice a archivo JS. Ahora en la carpeta SRC, ya
tenemos modelos
y carpeta Rutas Pero como sabemos, aplicamos aquí. Estructura de
aplicaciones de nodos complejos. Entonces aquí, creamos una nueva
carpeta llamada modules. En esta carpeta de módulos, tenemos que crear principalmente cuatro carpetas porque aquí
tenemos cuatro modelos. Vamos a crear la primera
carpeta llamada Jet, luego otra carpeta
llamada mensaje. Después otra carpeta para post
y última carpeta para usuario. Ahora recuerda en cada carpeta, tenemos que crear tres
archivos. Entonces hagámoslo. Primero, movemos el archivo JS del usuario de la carpeta models y
lo hicimos en la carpeta user. Aquí renombramos su nombre de archivo
a user dot model dot js. Aquí, puede
pedir entradas de actualización. Asegúrate de hacer clic en, sí. Y si no estás
recibiendo ese menú, entonces tienes que hacerlo manualmente. Ahora vamos a mover a los usuarios
dot js Route file de la carpeta routes y d it
en la carpeta user Module. Ahora está pidiendo actualización. Dile aquí a Actualizar usuario
punto js Ruta nombre de archivo. Ahora cambiemos el nombre de este archivo
a user dot routes dot js. Ver, ahora no está
pidiendo actualización. No te preocupes, lo
actualizaremos manualmente. Ahora en la carpeta del módulo de usuario, creamos un archivo más llamado user dot controller dot js. Ahora podrías preguntar qué
agregaremos en el controlador. Controller es donde
almacenamos la lógica de
nuestra aplicación. Es una colección de funciones de
devolución de llamada de nuestras
API. Déjame mostrarte eso. Aquí en la ruta del usuario, tenemos primero la API de registro, y esta es su función de
devolución Este es el controlador
para esta ruta. Cortar esta función de devolución de llamada de aquí y en el archivo del controlador, tenemos que exportar esta función Así que Cast register user es igual y pasado esta función de
devolución de llamada aquí Ahora para exportar esta función, agregamos exportaciones de módulo es igual a objeto
porque a partir de aquí, queremos exportar
múltiples funciones. Entonces aquí podemos agregar
usuario registrado para registrar usuario, o podemos eliminar este. Guarda este archivo, y ahora
tenemos que añadir esta función
en la ruta del usuario. Así que en la parte superior, añadimos costo controlador de
usuario es igual a requerir aquí
importamos desde punto hacia adelante
slash usuario dot Controller Ahora en el lugar de
API CallwayFunction, simplemente
agregamos controlador de usuario,
punto registrar Asegúrate de no llamar a
esta función aquí, tenemos que agregar referencia de
función. Ahora hagamos lo mismo
para otras APIs también. Así que corta este controlador
API de inicio de sesión. En nuestro archivo, definimos
una nueva función, costo usuario de inicio de sesión es igual
a pegar callback aquí A continuación, tenemos esta función de
devolución de llamada API. Y en nuestro archivo controlador, creamos una nueva función. Costo, obtener usuario es igual
pegarlo aquí. Igual que esto, tenemos que cortar cada función de devolución de llamada y separarla en el archivo del
controlador Sé que esto es un
poco preocupante, así que pon algo de música y
podemos completar esto juntos. Cortar la función de devolución de llamada, y en el archivo, Costo, solicitud, restablecer contraseña es
igual a pegarla aquí Corta la siguiente función de devolución de llamada, y en el archivo,
Cast reset password es igual a pegarla aquí Cortar la siguiente
función de devolución de llamada para seguir al usuario, y en el archivo, Cast, follow user es igual
a pegarlo aquí Ahora corta la siguiente
función de devolución de llamada, para rechazar, solicitar. En el expediente, Emitir, rechazar, seguir, solicitar, es
igual a pegarlo aquí. Ahora tengo la siguiente
colbkFunction para aceptar solicitud, y en el archivo, costo excepto, follow request
es igual a pasado aquí Cortar la siguiente función de devolución de llamada, para la lista de seguidores, y
en el archivo, const, obtener otro usuario, seguir, lista, es igual a pegarlo aquí No te preocupes, sólo nos
quedan unos pocos. Cortar la
función de devolución de llamada siguiente, para la siguiente lista. Y en el archivo, const, consigue otro usuario, siguiente lista
es igual a pegarlo aquí Corte la siguiente función de devolución de llamada. Y en el archivo, agregamos costo y seguimos usuario es
igual a pegarlo aquí. Además, de vuelta al archivo de ruta, necesitamos esta función general de Cs para registro e inicio de sesión API. Así que también cortamos toda
esta función y la
pegamos toda
esta función y en el archivo del
controlador. Aquí es posible que haya actualizado función de
generar tokens para el exceso de token y
se refiere tanto al token. Aquí tengo mi código antiguo porque esas son actualizaciones después
de publicar el curso, pero no te preocupes,
es el mismo proceso, corta toda esa función y
dt en el archivo del controlador. Además, si tiene ruta de actualización y
ruta de cierre de sesión, haga lo mismo con
esas API también Aquí, solo necesitamos exportar estas funciones y luego
agregarlas en el archivo Routes. Entonces, después de registrar usuario, agregamos usuario de inicio de sesión, obtenemos solicitud de usuario,
restablecimiento de contraseña, restablecimiento de contraseña, seguimiento de usuario ,
rechazo, solicitud de seguimiento,
aceptar, seguir ,
solicitar, obtener otro usuario, seguir la lista, obtener otro usuario, siguiente lista y
último usuario dejar de seguir Guarde este archivo, y
en nuestro archivo de ruta,
agregamosEUuser controller
dot login user No estoy desestructurando
las funciones aquí porque si algunos
desarrolladores nuevos ven nuestro código, entonces él o ella pueden confundirse Ahora, controlador de usuario
punto dios usuario, controlador de
usuario, punto de
solicitud de restablecimiento de contraseña, controlador de
usuario dot
reset contraseña, controlador de
usuario punto
Seguidor controlador de usuario, punto rechazar, seguir, solicitar, controlador de
usuario, punto
aceptar, seguir solicitud Controlador de usuario, punto
obtener usuario, lista de seguimiento. A continuación, controlador de usuario,
punto obtener otro usuario, siguiente lista, y último, controlador de
usuario,
punto dejar de seguir usuario Ahora tenemos que importar cosas
necesarias para
estos controladores. En la parte superior, podemos ver todas las importaciones no utilizadas
que califican. Así podemos recogerlos
juntos moviendo la salsa hacia abajo y simplemente cortar esas importaciones y
pegarlas en la parte superior del archivo
del controlador. Bueno. Ahora aquí, tenemos que
actualizar la ruta del modelo de usuario, por lo que la cambiamos a period slash user dot model
porque está en la carpeta actual Además, podemos asegurarnos de que
estos caminos estén bien. Sí, estos están bien.
Guarde este archivo. Y si revisamos nuestro archivo de ruta, vea esto se ve muy limpio. De esta manera, podemos ver
muy claramente endpoints
API con métodos API Ahora tenemos que hacer lo
mismo para los jets y publicar también. Hagámoslo
rápidamente. Primero, movemos jet model en
la carpeta jet Module y renombramos el nombre del archivo a
chat dot model dot js. Movamos la ruta de chat en la
carpeta de módulos de chat, actualicemos la entrada. Ahora renombra el nombre de archivo
chat punto Rus punto js. Ahora tenemos que
crear nuevo archivo para chat dot controller dot js. Volver al archivo Rutas. Primero, cortamos esta
primera devolución de llamada API y en el archivo del controlador, creamos una nueva función Costo obtener chats, es
igual a pegarlo aquí. Después de eso, cortamos la siguiente
función de devolución de llamada, y en el archivo, Cast get chat messages es
igual a pegarlo aquí A continuación, cortar la siguiente función de
devolución de llamada, y en el archivo, costo, crear chat es igual
a pegarlo aquí A continuación aquí, no necesitamos la API de enviar mensaje porque eso tenemos
manejado con Socket. Podemos eliminar esta buena ahora tenemos la siguiente
función de devolución de llamada y en el archivo, cost create group es
igual a pegarlo aquí Ahora tenemos que exportar
estas funciones desde aquí. Al final, las exportaciones del módulo
son iguales a Object, Gchat a GChatso podemos
eliminar los mensajes getchat, crear chat, crear grupo Guarda esto y en el
archivo de ruta aquí, ingresamos costo, controlador de
chat es
igual a requerir aquí, parlas chat dot controller Ahora en nuestras APIs, agregaremos esas funciones. Entonces controlador de chat, jets de punto
GAD, controlador de chat, punto obtener mensajes, controlador de
chat, punto crear chat, y último controlador de chat
punto Crear grupo Ahora cortamos estas importaciones
de modelos de aquí, guardamos este archivo, y en nuestro archivo controlador en la parte superior, pegamos. Bueno. Ahora aquí, tenemos que
actualizar también la ruta de estos dos modelos. Entonces cambiamos la ruta del modelo de
chat al modelo de punto de
chat de reenvío de
período, y para el mensaje A,
agregaremos el modelo de mensaje en la carpeta Módulo de
mensajes Entonces vamos una carpeta arriba mensaje
slash message dot model. Guarde este archivo y
tenemos que mover el modelo de
mensaje en la carpeta del módulo de
mensajes. Ahora cambia el nombre del archivo a
message dot model dot js. Ahora solo tenemos que hacer este proceso para nuestro
último módulo de post. Primero, movemos post Model en la
carpeta post Module y renombramos el nombre del archivo a
post model dot js. Ahora vamos a mover post ruta
en post carpeta Módulo,
actualizar la entrada, renombrar
el nombre del archivo, publicar rutas punto punto js Bueno. Ahora tenemos que crear nuevo archivo para
controladores post dot dot js. Volver al archivo Rutas. Primero, cortamos la
primera devolución de llamada API y en el archivo del controlador, creamos una nueva función Cast create post es
igual a pegarlo aquí. Después de eso, cortamos junto a la función de
devolución de llamada y
en el archivo Cast, obtener mi post es igual
a pegarlo aquí A continuación, corte la siguiente función de
devolución de llamada. Y en el archivo, Cs get siguiente post es
igual a publicado aquí. A continuación, cortamos otra función de devolución de llamada
API. Y en el archivo, const, delete post es igual a, y pegarlo aquí No peludo solo duran
pocas funciones para ir. Corta la siguiente función de Colbeg
para darle me gusta y no me gusta la publicación Y en el archivo, const, como, a diferencia de post es igual
a, pegarlo aquí Cortar la siguiente función de Colbeg. Y en el archivo, agregamos costo, agregar comentario es igual
pegarlo aquí. Corte la siguiente función de devolución de llamada. Y nuevamente, en el
archivo, agregamos costo, agregamos comentario, respuesta es
igual pegarlo aquí. Y ahora para la última función de devolución de llamada de la
API, cortamos y en el archivo del
controlador, agregamos costo, eliminar comentario, es igual a pegarlo aquí Ahora tenemos que exportar
estas funciones. Módulo dot export es
igual a in object, create post to create
post, get my post. A siguiente post, delete post, like post, add comment, add comment reply,
and delete command. Guarda esto y en el archivo post
routes en la parte superior, agregamos costo post
controller es igual a requerir periodo forward
slash post dot controller Ahora en nuestra API, podemos agregar esos controladores, copy post Controller y
write, postcontroller,
dot create post, postcontroller , dot GET MyPost, post
Controller, dot GET following
Post, post Controller, post Controller, dot delete
Post Post controller, dot, a diferencia de
post, post controller, dot add command,
post controller, dot add comment reply, y post controller
dot delayed comment. Bueno. Ahora cortemos las
importaciones no utilizadas del archivo Routes. Guarda este archivo y en el archivo del controlador
en la parte superior, lo
pegamos aquí. Ahora aquí, tenemos que actualizar
estas dos rutas, period, forward slash post dot model, y para ruta de usuario, vamos una carpeta hacia arriba, carpeta de
usuario, modelo de punto shuser Guarda esto como podemos ver, nuestros archivos se ven más organizados. Entonces aquí nuestras carpetas de modelos y
rutas están vacías ahora, así que simplemente podemos eliminarlas, y creo que tenemos que actualizar
path en un lugar más, que es rutas punto Jsle
en la carpeta de inicio Ver aquí ruta no se
actualizó automáticamente. Así que aquí simplemente cambiamos
la ruta a módulos, user, slash user dot Routes Módulos post post punto rutas y módulos JET Jett
rutas, y hecho Genial. Ahora, vamos a
empujar rápidamente este código a Github. Y por eso, nuestro código se puede implementar
automáticamente. Así que abre la aplicación
de escritorio Github. Y aquí obtenemos todos los cambios. Escribe el mensaje de compromiso. Y cometerlo. Y al fin, simplemente
ponemos este código
en Github, y eso es todo. Esto se
implementará automáticamente. Entonces así es como en el mundo
profesional, las
grandes empresas
gestionan su código no JS. Además, puede haber un enfoque un
poco diferente dependiendo de las empresas
o el equipo con el que trabajes, pero esta es la estructura de carpetas más
común que
los desarrolladores profesionales utilizan hoy en día.