Transcripciones
1. Introducción: Bienvenido de nuevo al Módulo cinco
del curso ExpressJS
Advanced Esta clase es una continuación de la serie de cursos ExpressJS Mi nombre es Shawn Ragunhi y estoy emocionado de guiarte a través este siguiente paso para
dominar Express JS haber trabajado en numerosas aplicaciones de grado de
producción, conozco
la importancia
de comprender las capacidades avanzadas de Express, y estoy aquí para compartir
esa experiencia con usted. En este módulo,
profundizaremos en las
características avanzadas de Express JS. Esto es lo que aprenderá
la magia del Middleware, cómo usar opciones integradas, integrar bibliotecas de terceros
e incluso crear su
propio Middleware personalizado Después verá técnicas de
configuración avanzadas para hacer que sus aplicaciones adaptables a diferentes
entornos. Entonces aprenderás a solucionar problemas y depurar
aplicaciones express como un Pro Después de eso,
aprenderá a integrar bases de datos con Express para una administración de datos
fluida. Y finalmente,
las mejores prácticas para estructurar y organizar sus aplicaciones para la escalabilidad y
mantenibilidad Este módulo es perfecto para desarrolladores que
ya se sienten cómodos con los conceptos básicos de Express y están listos para llevar sus
habilidades al siguiente nivel. Si has completado
el módulo anterior o tienes alguna experiencia
con APIs de descanso, ya
estás listo para sumergirte Al final de este módulo, tendrá un conocimiento
profundo funciones avanzadas
de Express JS, lo que le permitirá construir aplicaciones de
radio
sofisticadas y de producción. Ya sea que estés construyendo un proyecto personal o trabajando
en aplicaciones de nivel empresarial, estas habilidades te
diferenciarán como desarrollador backend Por último, nuestro proyecto
en este modio se centrará en mejorar
el empaque de ruedas justo Mejorará la estructura
y mantenibilidad de
la aplicación
de llantas justas refactorizando Organizar su código
es un paso crítico en creación de aplicaciones escalables y listas para
la producción. Y este proyecto te
guiará a través del proceso de
modularización de tus rutas Estoy encantado de ayudarte a desbloquear todo el
potencial de Express Js. Vamos a sumergirnos y comencemos. Nos vemos en la primera conferencia.
2. Sumérgete en técnicas avanzadas de Express: En la última sección,
aprendiste a construir servicios RSL
usando Express En esta sección, vamos
a continuar nuestro viaje con Express y mirar temas
más avanzados. Más específicamente,
veremos motores de middleware, configuración, depuración
y plantillas Así que ahora comencemos.
3. Magia del middleware en Express.js: Uno de los conceptos centrales en
express que necesitas
aprender es el concepto de
middleware o
función de middleware Una función de middleware es
básicamente una función que toma un objeto request
y devuelve una respuesta al cliente o
pasa el control a otra función de
middleware Ya has
visto dos ejemplos
de funciones de middleware Una es esta función de
manejador de rutas. Entonces en Express, cada función de
manejador de ruta que tenemos es técnicamente una función de
middleware porque toma
un objeto request, y en este caso, devuelve
una respuesta al cliente,
por lo que termina
el por lo que termina Entonces este es un ejemplo de
una función de middleware. Tenemos otro ejemplo
que está en la línea cinco. Entonces, cuando llamamos
a Express a través del método JCN, este método devuelve una función,
una función de middleware El trabajo de esta función de
middleware es leer la solicitud, y si hay un objeto JCN
en el cuerpo de la solicitud, pasará el cuerpo de la
solicitud a un objeto JCN, y luego dirá
request at Esencialmente, esto es lo que
sucede en tiempo de ejecución. Cuando recibimos
solicitudes en el servidor, esa solicitud
pasa por este pipeline. Llamamos a este pipeline, el pipeline de procesamiento de
solicitudes. En este pipeline, tenemos una o más funciones de middleware Cada función
de middleware termina el ciclo
de respuesta de solicitud devolviendo un objeto de respuesta, o pasará el control a
otra Entonces, en nuestra
implementación actual, el pipeline de procesamiento de solicitudes tiene dos funciones de middleware La primera es la función
middleware que pasa el
cuerpo solicitado a un objeto JCN Ahora, en este caso,
no termina el ciclo de respuesta a la
solicitud. Entonces pasa el control a la segunda función de
middleware,
que es, en este caso,
nuestro manejador de rutas En nuestro manejador de rutas, tenemos el objeto request con una propiedad
body poblada Entonces aquí podemos realizar alguna
operación y luego terminar el ciclo de respuesta a la solicitud devolviendo una respuesta
al cliente. Entonces Express incluye algunas funciones de middleware
integradas. Pero también podemos crear funciones de middleware
personalizadas que podemos poner al frente de
nuestra canalización de procesamiento de solicitudes Entonces cada solicitud que obtengamos en el servidor pasará por
nuestra función de middleware Con esta función de
middleware personalizada, podemos realizar preocupaciones
transversales Por ejemplo, podemos hacer registro, autenticación,
autorización, etc. Así que la aplicación Express
es esencialmente nada más que un montón de funciones de
middleware En la siguiente conferencia,
te
voy a mostrar cómo crear una función de
middleware personalizada
4. Crea tu propio middleware de Express: I Así que ahora
déjame mostrarte cómo crear una función de middleware
personalizada Así que aquí en la línea cinco, estamos agregando JS y función de
middleware Después de eso, vamos a llamar
a app que use. Una vez más, llamamos a
este método para instalar una función de middleware en nuestro pipeline de procesamiento de
solicitudes Entonces aquí necesitamos pasar
una función que tome
una respuesta de solicitud y siguiente, que es una referencia a la siguiente función de
middleware
en la tubería Entonces simplemente pasamos
una función aquí. Ahora en esta función,
hagamos un simple registro de Consol. Imaginemos que esta función de
middleware es para registrar cada solicitud Entonces realizamos nuestro registro, y luego llamamos Next
para pasar el control a la siguiente
función middlewab en la tubería Si no haces
esto, porque
no estamos terminando el ciclo de respuesta a la
solicitud, nuestra solicitud terminará colgando Déjame mostrarte lo que pasa. Entonces voy a
comentar esta línea, guardar ahora de nuevo en
Cartero en esta pestaña, voy a enviar un
sencillo STTPgtrQuest
a guardar ahora de nuevo en
Cartero en esta pestaña,
voy a enviar un
sencillo STTPgtrQuest
a nuestro punto final de cursos. Entonces envía mira,
no estamos recibiendo respuesta. Se está cargando. Si
miras en la consola, puedes ver nuestro mensaje de registro. Esto indica que nuestra función de
middleware se ejecutó Pero debido a que
no pasamos el control a otra función de middleware para terminar el ciclo de
respuesta a solicitudes, nuestras solicitudes
terminan colgando ahí También podemos crear otra función de
middleware para realizar Entonces voy a seleccionar
este código, duplicarlo, y en la segunda función de
middleware, voy a cambiar este
mensaje a autenticar Ahora, de vuelta en Cartero, enviemos otra solicitud Ahora, en la terminal, tenemos dos mensajes,
registrando y autenticando. Entonces lo que quiero que prestes
atención aquí es que nuestras funciones de middleware
se llaman en secuencia En primer lugar, se llama a la función de
middleware de registro, luego a la función middleware
para autenticar al usuario Y finalmente, el fin de ruta, que es otra función de
middleware Ahora en términos de codificación creen, cuando quieres crear una función de middleware
personalizada, no
quieres escribir
todo el código dentro app dot archivo JS o módulo de aplicación Debe poner cada función de
middleware en un archivo separado o en
un módulo separado Así que de vuelta aquí, vamos a crear un nuevo archivo llamado logar dot js Ahora de vuelta en app dot js, vamos a agarrar esta función de
middleware aquí,
obtenerla, y de vuelta
en Logger dot Nosotros pegamos eso aquí. Le damos a esta función un nombre
como lob y finalmente, exportamos como este
módulo que exporta Ponemos esto a esta función. Entonces este módulo exporta una
sola función, ¿de acuerdo? Ahora, de vuelta en app dot js, en la parte superior, cargamos
nuestro nuevo módulo. Así periodo barra para indicar la
carpeta actual y el registrador Obtenemos el resultado y
lo almacenamos en un registrador de llamadas constante. Y luego podemos instalarlo
llamando a app que use y pase
esta función logger aquí. Ahora entiendes exactamente
lo que significa esta línea. Entonces, cuando llamamos a Express JSN, devuelve una función,
una función de middleware que
tiene tres parámetros,
request response, request response, Esa función de middleware
pasa el cuerpo del punto de solicitud. Y si hay un objeto JSON, establecerá request en body, y luego pasará el control a la siguiente función de middleware Bien, entonces déjame
borrar este comando. De vuelta en App Js. Entonces así es como
definimos una función de
middleware personalizada en un módulo separado Importa aquí y luego instálalo llamando a
la app dot Hughes Podríamos usar la misma técnica para la segunda función de
middleware, pero te voy a dejar eso
a ti como ejercicio
5. Uso del middleware integrado en Express: En la última conferencia aprendiste a construir middleware
personalizado Pero como te dije antes, en Express, tenemos algunas funciones integradas
en middleware Uno de ellos es el middleware
JCN con el
que estás familiarizado, donde pasa el
cuerpo de la solicitud Y si hay un objeto JCN, se
llenará solicitud
en la propiedad body Tenemos otra función de
middleware similar que se llama URL codificada Entonces déjame duplicar esta línea. Aquí tenemos express
dot URL codificada. Nuevamente, este es un
método que llamamos y lo que obtenemos en resultado es
una función de middleware Esta función de middleware analiza la solicitud
entrante con cargas útiles codificadas por
URL Esa es una petición
con cuerpo como éste. Entonces tenemos key set to value
y otro key set to value. Ahora bien, esto es más un enfoque
tradicional. No es algo que
usemos tan a menudo en estos días. Básicamente, si tienes
un formulario HTML con campos de
entrada y publicas
ese formulario en el servidor, el cuerpo de tu solicitud
se verá así. ¿Bien? Entonces ahí es
donde tienes carga útil
codificada por URL en el
cuerpo de tu solicitud. Ahora, este middleware
pasa este cuerpo y
rellena el cuerpo del punto de solicitud como un
objeto Déjame mostrarte cómo funciona eso. Así que volvamos a Cartero, enviemos una solicitud de correo al
Local Os puerto 3,000 APISORE Bien, entonces anteriormente
pasaba el
Objeto JSON en el cuerpo, así que te dije que seleccionaras
un aquí y luego JSON. Sin embargo, en esta demo, vamos a utilizar la URL del
formulario codificada aquí. Entonces ahora podemos pasar pares de valores
clave en el cuerpo de la solicitud, y se concatenarán cuando esta solicitud se
envíe al servidor Entonces la clave que voy
a establecer es nombre y el valor es Mc poros SN. Ahora puedes ver que
creamos con éxito un nuevo curso
en el servidor. Entonces nuestra
función de middleware pudo leer nuestra solicitud con carga útil
codificada por URL Ahora bien, si miras en la
terminal, ves esta advertencia. Body parter
deprecated, undefined,
extended provide extended option Entonces esta advertencia
nos está diciendo que debemos pasar un objeto aquí y
establecer extendido a true. Con esto, podemos pasar matrices en objetos
complejos usando el formato codificado por
URL. ¿Bien? Ahora, finalmente, el último
middleware construido que tenemos en
Express es estático, y lo usamos para
servir archivos estáticos Entonces déjame mostrarte
cómo funciona eso. App U express punto estático. Ahora aquí pasamos un argumento, y ese es el nombre de carpeta. En este caso, voy a
usar una carpeta llamada Pública. Así que vamos a poner todos
nuestros activos estáticos como imágenes
CSS y así sucesivamente
dentro de esta carpeta. Así que vamos a crear
esta carpeta aquí. Público por ahora, sólo
voy a agregar un
simple archivo de texto aquí. Texto de punto Léame. Y esto es un Read Me cinco. Bien. Ahora con esta función de
middleware, podemos volver al
navegador y dirigirnos al puerto de
Localhost 3,000
slashRmdt puerto de
Localhost 3,000 Entonces con este middleware,
podemos servir contenido atérico. Y tenga en cuenta que aquí no
tenemos público en la URL, por lo que nuestro contenido estérico se sirve desde la
raíz del sitio En la próxima conferencia,
vamos a ver el middleware de
terceros
6. Mejora Express con middleware de terceros: En esta conferencia,
voy a presentarles un par de
middleware de terceros que tenemos en Express Así que dirígete a
exprejs.com en la parte superior. Bajo recursos,
puedes encontrar Middleware. Pero estos son los middleware de
terceros que puedes usar en
tus aplicaciones Pero eso no significa que
debas usar todas las funciones de
middleware
aquí porque cada función de
middleware impactará en el rendimiento Si no necesitas la
funcionalidad que viene con una
función de middleware, no la uses Simplemente va a ralentizar el procesamiento de
tu solicitud. Así que dedique un tiempo, eche un vistazo rápido a
esta documentación, y vea qué hay
para usted en caso de que lo necesite. Ahora en esta lista, el
middleware que se
considera mejor
práctica es considera mejor
práctica es Por lo tanto, le ayuda a proteger
su aplicación estableciendo varios errores de SCDP Así que vamos a echar un vistazo rápido aquí. Básicamente, todo lo
que tenemos que hacer es cargar este módulo de casco usando
importar o requerir función. Lo que obtenemos aquí es una función. Entonces llamamos a eso y eso
devuelve una función de middleware, y luego vamos a usar eso.
Eso es todo lo que tenemos que hacer. Si quieres entender mejor qué hace el casco debajo del capó, realmente
necesitas mirar la documentación porque eso está
más allá del alcance de este curso. Así que de vuelta en la terminal,
instalemos el casco. Ahora, aquí en nuestro
módulo de app en la parte superior, cargamos casco, obtenemos el resultado y lo almacenamos en
una constante llamada casco. Esta es la función.
Entonces vamos a llamar a eso y pasarlo al método de uso de punto de
aplicación. Entonces casco como este. El otro
middleware de terceros que te puede resultar útil es Morgan Usamos Morgan para registrar SDDPRquest. Déjame mostrarte cómo funciona eso. Así que una vez más, NPM
instala a Morgan. Ahora, aquí en la
parte superior del archivo, cargamos Morgan usando
la función requerida. Muy sencillo. Y luego
finalmente, úsalo así. Entonces Morgan es una función, y aquí puedes especificar
varios formatos. Voy a usar el
más simple que es pequeño. Nuevamente, es necesario
mirar la documentación para ver varias opciones
que están disponibles para usted. Entonces ahora, de vuelta en la terminal, ejecutemos la aplicación
con Morgan en su lugar. Cada vez que enviemos una solicitud
al servidor, ésta será bloqueada. Entonces aquí, voy a enviar una simple solicitud get a
nuestro punto final de cursos. Ahora mira en la terminal,
Morgan bloqueó nuestra solicitud STTP, y este es un formato diminuto Es muy, muy sencillo. Por lo que enviamos una
solicitud GTP get para este punto final, el resultado fue un código de estado de 200, lo que significa exitoso Y este es el tiempo que tardó en responder
a esta solicitud. Si quieres más detalles, estableces un formato diferente, y por cierto, por defecto, Morgan bloqueó la
solicitud en la consola. Pero también puedes configurarlo, escribirlo en un archivo de registro. Nuevamente, recuerde que cuando
active esta función, tendrá
un impacto en su canalización de
procesamiento de solicitudes. Entonces quizás no quieras
hacer esto en producción, o quizás quieras
habilitarlo solo en ciertas situaciones. Por ejemplo, puede tener un archivo de configuración
cuando implementa esta aplicación en
la producción. En ciertas situaciones,
puedes encenderlo por un corto periodo de tiempo
y luego apagarlo. En la próxima conferencia, te
voy a mostrar
cómo trabajar con diferentes entornos como desarrollo, las pruebas
y la producción.
7. Configurar Express para diferentes entornos: En una aplicación más compleja o
empresarial, necesitas saber en
qué entorno se está ejecutando
tu código. Se trata de un
entorno de desarrollo o de producción. Quizás
desee habilitar o deshabilitar ciertas funciones en
función del
entorno actual. Por ejemplo,
imaginemos que tenemos que habilitar tala de la solicitud del PIB solo en el
entorno de desarrollo, en una máquina de desarrollo,
pero no en la producción. Entonces déjame mostrarte
cómo hacer esto. Anteriormente aprendiste sobre
este objeto proceso. Se trata de un objeto global en nodo que nos da acceso
al proceso actual. Este objeto de proceso tiene
una propiedad llamada N, que nos da las variables de
entorno. Ahora tenemos una variable de
entorno estándar llamada nodo subrayado N, y esta
variable de entorno devuelve el entorno para
esta aplicación de nodo Si no se establece aquí, vamos a ponernos indefinidos. Alternativamente, podemos establecer
esto desde el exterior. Podemos establecer esto al
desarrollo a pruebas, a la escena o
a la producción. Entonces para esta demostración, vamos a
registrar esto en la consola. Así consola dot log. Voy a usar el carácter de
backtick para definir una cadena de plantilla Nodo subrayan N.
Signo de dólar, llaves collie, y aquí está nuestro proceso N, nodo subrayado N. Ahora tenemos otra forma de obtener
el entorno actual,
y eso es a través Así que este objeto app
tiene un método llamado get que usamos para obtener varias configuraciones sobre
esta aplicación. Ahora, una de las configuraciones es N. Este método utiliza internamente la variable de entorno para detectar el entorno actual. Sin embargo, si esta
variable de entorno no está establecida, Esto devolverá
el desarrollo por defecto. Déjame mostrarte cómo funciona eso. Así consola dot log, B tacle la etiqueta es app Y aquí agregamos
signo de dólar con Colbass y luego app dot gat de N. Ahora, vuelta en terminal, mira, nuestra variable de entorno
no está establecida, así que eso es indefinido Pero app dot gat está devolviendo
el desarrollo por defecto. ¿Bien? Esto es una diferencia. Ahora bien, ¿qué enfoque elegir es puramente tu preferencia personal? Ahora, en esta demostración,
queremos habilitar el registro de SDDPRquest solo en una Para que podamos escribir código así. Si app dot consigue con desarrollo, entonces vamos a habilitar
a Morgan. Y también para tabugging. Quiero mostrar
algo en la consola. Así que Morgan habilitó, ¿de acuerdo? Ahora, eliminemos
estas dos líneas. Ya no los necesitamos. De vuelta en la terminal porque esta es mi máquina de desarrollo, se
puede ver que Morgan está habilitado. Detengamos este proceso,
establecemos la
variable de entorno a producción, volvamos a
ejecutar la aplicación y luego verás que
Morgan no estará habilitado. Así que detenga este proceso con
Control y C. Configuramos nuestra variable de entorno usando Exportar en Mac o configuramos en Windows al
usar el símbolo del sistema. Y dólar al
usar Power Shell. Entonces nodo subrayado,
establecemos esto a producción. Ahora, ejecutemos la
aplicación una vez más. Entonces no hay mod app Bien, mira, solo obtenemos este mensaje
escuchando en el puerto 3,000. No tenemos Morgan Enable. Entonces así es como puedes saber si tu código se está ejecutando
en una máquina de desarrollo,
pruebas, puesta en escena o en
una máquina de producción.
8. Técnicas avanzadas de configuración: Entonces, en la última conferencia,
aprendes a detectar el entorno en el que se está ejecutando
tu aplicación. Un tema que va mano con los entornos
es un tema de almacenar los ajustes de
configuración
para la aplicación y anular esos ajustes
en cada entorno Por ejemplo, en tu entorno de
desarrollo, vas a
utilizar las diferentes bases de datos o servidor de correo. En esta conferencia, te voy
a mostrar cómo almacenar los configuración
para tu aplicación y sobrescribirlos en
cada entorno. Ahora hay varios paquetes de
nodos por
ahí para administrar la
configuración. El más popular es RC. Ahora, si buscas
npmrcrnpms.com, RC para que podamos
ver que este
paquete ha sido descargado más Es un paquete muy popular. Pero mi preferencia personal es otro paquete que no
es tan popular, aunque tiene un diseño muy
limpio y elegante y es realmente fácil de usar. Así que busca NPM Config nuevamente, aquí npmjs.com Por lo que este paquete
se ha descargado más de 1 millón de veces por semana, pero tiene una comunidad muy
activa. Así que de vuelta en el terminal, vamos a instalar el módulo config. Hermoso. Ahora, de vuelta
al proyecto aquí, vamos a crear una carpeta
llamada Config. En esta carpeta, podemos tener un archivo de configuración
predeterminado. Entonces agreguemos un nuevo archivo
llamado AJCN predeterminado. Así que aquí podemos tener un objeto JCN para definir los ajustes de
configuración predeterminados Por ejemplo, vamos a tener una
configuración aquí llamada Nombre. Ese es el nombre de
nuestra aplicación. Ahora, de vuelta en la carpeta de
configuración, agreguemos otro archivo, punto de
desarrollo Gs. En este archivo, podemos definir la configuración específica del entorno de
desarrollo. Como parte de esto, podemos anular los ajustes que
definimos en GSN por defecto También podemos agregar ajustes
adicionales. Entonces aquí puedo cambiar el nombre. Puedo anularlo diciendo que mi desarrollo de aplicaciones Express también
podemos agregar
propiedades adicionales aquí, y estas propiedades
también pueden ser objetos complejos. Por ejemplo, podemos tener
una propiedad llamada mail, donde almacenamos información
sobre nuestro servidor de correo. Así que aquí podemos tener post, y vamos a configurar esto para que se
desarrolle en el servidor de correo. Del mismo modo, podemos crear otro
archivo de configuración llamado production. Entonces producción punto JSON ahora voy a volver
en desarrollo o JSN, copiar todo esto,
pegarlo en la producción, y cambiar el nombre
de la aplicación así
como la dirección
del servidor de correo Así Rod servidor de correo. Así que con este paquete de nodos, se
puede ver fácilmente la configuración
por defecto así
como la configuración
para cada entorno. Te da una estructura muy
limpia. Ahora, de vuelta en nuestra app
punto JS en la parte superior, cargamos el módulo de configuración. Y guárdala en una
constante llamada config. Y con esto, podemos obtener fácilmente diversos ahorros para
nuestra aplicación. Entonces echemos un vistazo a algunos ejemplos. Configuración. Voy a hacer un nombre de
aplicación de registro de puntos de consola. Ahora aquí podríamos usar
una cadena de plantilla. Eso realmente no importa. La forma en que usamos este
objeto config es así. Entonces tiene un método, y aquí como argumento, especificamos el nombre de una propiedad de
configuración. Así nombre. Ahora,
dupliquemos esto. La otra propiedad que quiero
mostrar es servidor de correo. Para ello, necesitamos
acceder a la configuración aquí, host, que es parte del correo. La forma en que hacemos esto es usando la notación de puntos al
igual que acceder a
las propiedades de un objeto. Entonces quieres obtener host de correo. ¿Bien? Ahora, de vuelta en la terminal, voy a poner esta máquina en el entorno de desarrollo. Entonces dólar y columna nodo subrayan N.
Ponemos esto a desarrollo y
luego ejecutamos nuestra aplicación Para que pueda ver que el nombre de
la aplicación está configurado en My Express desarrollo de
aplicaciones. Esta configuración viene de
nuestro punto de desarrollo JCNFLE. Del mismo modo, nuestro
servidor de correo es Dave Mail Sour. ¿Bien? Ahora bien, si cambiamos el
ambiente a producción, vamos a ver
diferentes valores. Entonces dólar y columna,
nodo subrayan N, establecemos esto en producción y ejecutamos la aplicación
una vez más Mira, esta vez nuestro
servidor de correo es Prod mail Sur. Entonces, con este paquete de notas, puede almacenar fácilmente los ajustes de configuración
para su aplicación. Sin embargo, no debe almacenar los secretos de la aplicación en
estos archivos de configuración. Por ejemplo, no
debes almacenar la contraseña de tu base de datos o tu servidor de correo
porque cuando
registras tu
código fuente a un repositorio, esa contraseña o
secreto es visible para cualquiera que tenga acceso a ese repositorio de control de
origen. De hecho, una de las
compañías financieras famosas en EU fue pirateada porque
alguien registró
una contraseña en el repositorio de
control de fuentes Entonces, la forma en que tratamos
estos secretos es almacenándolos en variables de
entorno. Déjame mostrarte cómo funciona eso. Así que de vuelta en la terminal,
definamos una variable de entorno para almacenar la contraseña
de un servidor de correo. Entonces contraseña de dólar y columna, configuramos en uno,
dos, tres, cuatro. Ahora, para evitar que esta variable
de
entorno conflicto con otra variable de
entorno, es mejor
prefijarla con el nombre de
nuestra aplicación. En esta demo, digamos que el nombre de nuestra
aplicación es app. Entonces agregamos el
subrayado de la aplicación como prefijo. Bien. Entonces, en el
entorno de desarrollo, configuramos manualmente esta variable de
entorno. Y también en el
entorno de producción, lo más probable es que tengamos un panel de configuración para almacenar nuestras variables de
entorno. Así que almacenamos todas estas
contraseñas y secretos en nuestras variables de entorno y luego las leemos usando
nuestro módulo de configuración. Ahora, de vuelta al proyecto en
la carpeta de configuración, necesitamos agregar otro archivo llamado variables de
entorno personalizadas. Asegúrate de deletrearlo correctamente. El nombre de este archivo
es muy importante. Así que
las variables de entorno personalizadas, TSN. Y en este archivo,
definimos el mapeo
de los ajustes de configuración
a las variables de entorno. Entonces voy a ir en nuestro archivo TSN de
desarrollo, copiar todo esto en
este nuevo archivo Ahora, digamos aquí por la propiedad
masculina dentro de eso, vamos a tener una
propiedad llamada contraseña. Bien. Ahora queremos mapear esto a la variable de entorno
que creamos
que era la
contraseña subyacente de la aplicación, ¿bien? Ahora no necesitamos
alojar porque
no vamos a mapear esto a
una variable de entorno. El valor se define en uno
de nuestros archivos de configuración, y por esa misma razón no
necesitamos nombre. Entonces en este archivo, variables de
entorno personalizadas, solo
tenemos el mapeo, el mapeo de nuestros ajustes de
configuración a variables de entorno. Ahora, de vuelta en app dot s, vamos a duplicar esta línea y mostrar la contraseña
del servidor de correo. Entonces correo contraseña, y lo obtenemos de la propiedad de contraseña
masculina. Entonces, este
objeto configurado busca varias fuentes para encontrar un
valor para esta configuración. El origen puede ser un
archivo de configuración, archivo adyacente. Puede ser una variable de
entorno. También puede ser un argumento de línea de
comandos. Para eso, necesitas mirar
la documentación tú mismo. Ahora, de vuelta a la terminal,
ejecutemos la aplicación. Bien, mira, nuestra
contraseña masculina es 1234. Y esto se leyó de
una variable de entorno, no de un archivo de configuración. Nuevamente, este paquete de conflicto tiene muchas características útiles, y te dejo a ti leer la documentación y conocer
más sobre este paquete.
9. Solución de problemas y depuración de aplicaciones Express: Anteriormente en esta sección, escribimos este código para ver si estamos en el entorno de
desarrollo. Si Morgan logramos el STDPRquest y
también logramos este mensaje
en la consola Entonces este registro de puntos de consola es el amigo
más antiguo del programador de
JavaScript. Lo usamos todo el
tiempo para depurar. El problema con este
enfoque, sin embargo, es que a veces cuando
terminamos con ellos, los
eliminamos o los
comentamos. A veces más tarde,
es posible que los necesitemos. Entonces tenemos que
volver a escribir el código o eliminar el comando. Este enfoque es muy tedioso. Una mejor manera de registrar
mensajes con el propósito de depurar es usar el
paquete de depuración en nodo con Tbug Vamos a reemplazar todas estas sentencias de registro de
punto de consola con una llamada a una función de depuración, y luego podremos
usar una
variable de entorno para habilitar
o deshabilitar la depuración. De esta manera, no
tenemos que volver
a nuestro código y modificar el código. No tenemos que
eliminar este
registro consolado o declaraciones de depuración No tenemos que
elogiarlos. Podemos controlarlos
desde el exterior usando una variable de entorno. Pero lo más importante, también
podemos determinar el nivel de
información de depuración que queremos ver A lo mejor alguna vez estamos trabajando
en un problema de base de datos. Quizás solo queremos ver esa información de
depuración
relacionada con la base de datos No tienes que
volver al código y modificar todas estas declaraciones
consoladas o log Entonces déjame mostrarte cómo
usar el paquete de depuración. De vuelta en el terminal,
instalemos debug. Hermoso. Ahora volvamos a nuestro módulo de
aplicaciones en la parte superior, vamos a ralentizar el módulo de depuración. Esta función requerida
aquí devuelve la función. Entonces llamamos a esta función
y le damos un argumento. Y este argumento es un espacio de nombres arbitrario que
definimos para la depuración Por ejemplo, podemos definir un espacio de
nombres como el inicio de aplicaciones. Ahora, cuando llamamos a esta
función con este argumento, obtenemos una función para escribir mensajes de
depuración
en este espacio de nombres Entonces llamemos a esa
función, depurador de inicio. Potencialmente podemos
tener otro depurador
para depurar mensajes relacionados con la base de datos Entonces, una vez más, cargamos
ese módulo de depuración. Obtenemos una función.
Llamamos a esa función, le damos un espacio de nombres como app DB, y esto devolverá
una función de depuración Entonces lo conseguimos y
lo almacenamos en el depurador DB. ¿Bien? Vamos a reemplazar esta sentencia de
registro de punto de consola con una llamada para iniciar la función de
depurador Así que el depurador de inicio así. Ahora, potencialmente
en algún lugar de la aplicación, podemos tener algún trabajo de base de datos, y ahí es posible que necesitemos escribir alguna
información de depuración para que podamos usar nuestra otra función depuradora Así que el depurador DB, conectado a la base de datos,
algo así Ahora volvemos a la terminal y utilizamos una variable de
entorno para determinar qué tipo de información de depuración
queremos ver en la consola Entonces aquí establecemos una
variable de entorno llamada Ebub. Configuramos esto para el inicio de la aplicación. Eso significa que con esta línea, vamos a ver sólo
los mensajes de depuración que forman parte de este espacio de nombres Inicio de aplicaciones. Ahora bien, si
ejecutas la aplicación, mira, tenemos el inicio de la aplicación
y aquí nuestro mensaje. Ahora la próxima vez que ejecute
esta aplicación, tal vez no quiera ver
ninguna información de depuración, así podemos restablecer esta
variable de entorno a nada Vuelva a ejecutar la aplicación. Mira, ya no vemos
este mensaje de depuración, o es posible que queramos ver mensajes de
depuración para
múltiples espacios de nombres Así podemos establecer nuestra variable de
entorno para inicio de
la aplicación, coma AppNTV Con esto, veremos
los mensajes de depuración en estos dos espacios de nombre O si quieres ver todos
los mensajes de depuración para nuestro espacio de nombres de aplicaciones, podemos usar un comodín De esta manera, no tenemos que
repetir cada una de
ellas individualmente. Ahora cuando ejecutamos la aplicación, mira, vemos los mensajes
en diferentes espacios de nombres. Así que el inicio de la aplicación y la aplicación DV. Y
lo bonito de este módulo de depuración es que
codifica por color el espacio de nombres, por lo que podemos distinguir fácilmente
varios mensajes de depuración No lo entendemos
con Console o platicar. Y una última cosa en
esta demo en particular, creé dos
funciones de depuración, startup y DVTBugger En escenarios del mundo real, es posible
que no necesite necesariamente múltiples funciones de depuración en el mismo archivo o en
el mismo módulo Si ese es el caso,
puede simplificar su código
cambiando el nombre de esta función
depuradora para depurar Por ejemplo, en este archivo, digamos que no tenemos
ningún trabajo de base de datos. Entonces voy a borrar esto. Solo queremos escribir mensajes de
depuración sobre
el inicio de la aplicación Así que vamos a eliminar esta función
TB Tbugger. Ahora podemos renombrar esta función
debugger de inicio para depurar Entonces, mira, eso es
más corto que montar el registro de puntos de la consola, y nos da mucha
más potencia y control sobre la cantidad de
información de depuración que queremos ver Así que prefiera el módulo de depuración a las sentencias de registro de puntos de
consola.
10. Vistas dinámicas con motores de plantillas: En todos los puntos finales que
hemos implementado hasta ahora, devolvemos objetos GSN
en la respuesta A veces, sin embargo, necesitas
devolver el marcado HTMR al pin, y ahí es donde usas
un motor de plantillas Hay varios motores de
plantillas disponibles para
aplicaciones expresas. Los más populares son PAG, que solía llamarse JD También tienes Mustach y EGS. Cada motor de plantillas tiene
una sintaxis diferente para generar HTML dinámico y
devolverlo al cliente Juega esta demo, te voy
a mostrar cómo usar PAC que generan un HTML dinámico y lo devuelven al cliente. Entonces primero, instalemos PAC. Hermoso. Ahora, de vuelta
en nuestro módulo de aplicaciones, necesitamos configurar el
motor de visualización para la aplicación. Entonces llamamos app dot set. El nombre de la
propiedad que necesitamos
establecer es motor de espacio de visión, y el nombre de nuestro motor de visión
o motor de plantillas es PAC Entonces cuando establecemos esto, express cargará internamente este módulo, así que no tenemos que requerirlo. Bien, ahora,
hay otra configuración que no es obligatoria. Es opcional, solo si quieres anular la ruta
a tus plantillas. Entonces app que establece, el nombre de la
propiedad es views, y el valor es la parte
donde almacenamos las plantillas. Por lo que el valor predeterminado
son las vistas de punto. Eso significa que debes
poner todas tus vistas o todas tus plantillas dentro de
una carpeta llamada views, que debería estar en la
raíz de la aplicación. Nuevamente, este es un escenario optal. Ese es el valor predeterminado, así que no tenemos que establecer eso. Ahora, agreguemos aquí una nueva
carpeta, views. Dentro de esta carpeta,
agreguemos un nuevo archivo. Podemos llamar a ese punto índice Pug. Con PAG, podemos definir nuestra plantilla usando
una sintaxis como esta. Entonces podemos tener un elemento TML. Entonces dentro de eso
podemos tener cabeza, y luego podemos tener el elemento
title y
podemos establecer un valor para esto
dinámicamente usando la sintaxis. Entonces agregamos un signo igual y luego nombre de una variable que
vamos a establecer en tiempo de ejecución. Te voy a mostrar cómo funciona
eso más tarde. Ahora en paralelo a la cabeza, queremos tener otro
elemento llamado cuerpo. Y dentro de eso,
queremos tener uno H. Y queremos ver
el valor para esto dinámicamente usando una
variable llamada message. Ves bug como una
sintaxis más limpia que STMO normal. No tenemos esos elementos de apertura
y cierre. Por supuesto, a algunas personas les
encanta, a algunas personas lo odian. Pero eso aparte,
veamos cómo podemos convertir esto a un STMO regular y devolverlo al cliente Así que de vuelta en nuestro módulo app, antes definimos una ruta para la raíz de la aplicación. Entonces aquí le enviamos un
mensaje sencillo al cliente. Hola. Ahora mismo,
queremos reemplazar esto con un marcado HTML y
devolverlo al cliente Entonces, en lugar de enviar
método, usamos render. Entonces respuesta punto render. Ahora como primer argumento, especificamos el nombre de nuestra opinión. En ese caso, index porque el nombre de nuestro
archivo es index dot pug Como segundo argumento,
pasamos un objeto, y este objeto incluye
todos los valores para
los parámetros que hemos
definido en nuestra plantilla, como title y message. Entonces aquí voy a
establecer dos propiedades Title My Express app
y mensaje Hola. Eso es todo lo que tenemos que
hacer. Así que ahora iniciemos de nuevo
la aplicación y dirijamos al host Local por 3,000. Mira, obtenemos el marcado ML. Podemos verificar eso al mirar la fuente
de este discurso. Lo que ves aquí es
nuestra plantilla de Puck convertida a HTML estándar Entonces tenemos título de cabeza TML. Este valor se inserta
dinámicamente en tiempo de ejecución, y luego junto a
eso, tenemos By. Y dentro de esto, tenemos
este H un elemento. Entonces, si quieres devolver el marcado
TML a la moneda, usas un motor de visión Nuevamente, hay varios
motores de vista disponibles como Pug,
EJS, MastAC y Pero cuando está construyendo servicios de
descanso para el back end de sus aplicaciones
cliente, realmente no
necesita un motor de visión
o un motor de plantillas Acabo de cubrir este
tema porque
quería que mi curso
de nodo fuera integral. A continuación, voy a
hablar de que los datos fueron la integración.
11. Integración de bases de datos con Express.js: Bien, vamos a la integración de
bases de datos. En realidad, tenemos
una sección separada sobre este tema donde te
enseñaré en detalle cómo trabajar con una base de datos MongoDB Pero en esta conferencia, solo
quiero señalar cuáles son
las diversas opciones de
integración de bases disponibles para
ti cuando usas Node y Express. Entonces en el sitio web Express, si vas a guiar y
luego a la integración de bases de datos, en esta página, puedes ver varios controladores de base de datos que están disponibles para que los uses. Puedes usar Cassandra,
Out Base, CQL, Bango,
Oracle, Redis, quel Sur,
Elastic Search, Elastic Search Entonces hay varias
opciones disponibles aquí. Para cada uno de estos,
puedes ver algún código de muestra. Entonces echemos un vistazo a MongoDB. Básicamente, lo
que hay que hacer es instalar el driver
para trabajar con Mongo Entonces NPM instala MongoDB, y luego lo carga usando
la función requerida Entonces obtendrás una
API simple para conectarte a Mongo, y luego podrás acceder a
varias colecciones y así sucesivamente Trabajar con otras
bases de datos es lo mismo. Instalamos un driver,
y luego puedes obtener un módulo con una API simple. Ahora, en el caso del
mango, específicamente, hay otro paquete
que se llama mangosta, que está construido sobre mango, encuentra encima de este paquete
Mongo DB Usamos mangosta porque nos
da una API más simple. Nuevamente, más adelante en este curso, vamos a tener una sección
integral sobre el trabajo con mangosta y
mangosta
12. Protege las aplicaciones de Express con autenticación: Hasta el momento, hemos cubierto
mucho terreno sobre Express. Pero ¿qué pasa con la autenticación? Bueno, la autenticación
está fuera del alcance de Express porque
Express es un framework mínimo y
ligero, y
no tiene una opinión
sobre la autenticación. Entonces más adelante en el curso, vamos a tener una sección
integral sobre autenticación
y autorización. Entonces te mostraré cómo
asegurar tu API y puntos.
13. Mejores prácticas para estructurar aplicaciones de Express: Entonces este es un código
que hemos escrito en app dot Js a lo largo de
esta sección. Si miras aquí, tenemos un archivo muy débil con
92 líneas de código, y esta es una aplicación muy
sencilla. En la aplicación del mundo real, no
quieres escribir todo
ese código dentro de app dot JS. Entonces en esta conferencia,
voy a
mostrarte cómo
estructurar adecuadamente tu aplicación. Lo primero que
queremos hacer es sacar todo el código para esta API de cursos y
ponerlo en un archivo separado. En otras palabras, por cada parte lógica
de nuestra aplicación, para cada punto final de API, queremos tener un
archivo separado o un módulo separado. Entonces todas las rutas
para trabajar con cursos serían
en cursos punto JS, y todas las rutas
para trabajar con, digamos que los autores deberían
estar en autores punto Gs. Cuando la raíz del proyecto, vamos a crear una nueva
carpeta, llamarlo rutas. Aquí teníamos un nuevo
archivo de cursos dot js. Ahora, de vuelta en app dot js, seleccionemos todo el código
para trabajar con cursos. Ahora, recorta los
cursos, pégalo aquí. Ahora de vuelta en app dot js. Puedes ver aquí
solo tenemos 36 líneas. Pero primero, terminemos de
refactorizar las rutas de los cursos. Así que cortemos esta línea y volvamos a los cursos
punteamos JS en la parte superior. Aquí, primero, necesitamos
cargar Express. Tan constante Express, lo
requerimos así. No APGs llamamos
Express como una función. Y tenemos un objeto app, ¿verdad? Pero este enfoque no funciona cuando se separa la ruta
en un módulo separado. Entonces aquí necesitamos usar un router. Entonces este expreso tiene
un método llamado router que devuelve el objeto
router. Ahora aquí, voy a cambiar el nombre esta aplicación a router para mayor claridad. Así que presione F dos Enrutador. Entonces la diferencia es que en este módulo en el módulo de cursos, en lugar de trabajar
con el objeto app, trabajamos con el objeto router. ¿Bien? Ahora, finalmente,
al final de este módulo, exportamos este router. Entonces módulo que exporta, lo
configuramos a este router. Entonces, en resumen, obtenemos
el enrutador en la parte superior, le
agregamos rutas, y finalmente exportamos el enrutador al final del módulo. ¿Bien? Ahora, necesitamos cargar
este módulo de cursos
dentro del módulo de la aplicación. Así que de vuelta en App dogs aquí, carguemos el módulo de cursos. Por lo tanto, requieren cursos de ruta de
carpeta actuales. Ahora, obtenemos esto y
lo almacenamos en una constante llamada cursos. Y finalmente, una vez que
carguemos este módulo, necesitamos llamar a app that use. Aquí, necesitamos
aportar dos argumentos. El primer argumento es un camino, así que recorta los cursos de APS Y el segundo argumento es nuestro objeto router que
importamos. Eso son cursos. Básicamente,
le estamos diciendo a Express que para cualquier ruta que comience
con cursos AP, use este enrutador, el enrutador que cargamos desde
el módulo de cursos. Y con esto, podemos volver a nuestro módulo de cursos y hacer nuestras rutas un
poco más cortas. Así que volvamos al
módulo de cursos en la parte superior, ver cada ruta aquí tiene
esta parte cursos API. No queremos repetir esto en
todas partes porque
en app dot JS, le
dijimos a todas partes porque
en app dot JS, Express que cualquier
ruta que comience con cursos de
slash API slash debería ser manejada por
este router de cursos Así que de vuelta en el módulo de cursos, podemos deshacernos de todos
estos cursos API. Entonces para la primera ruta, que es para conseguir todos los cursos, nuestra ruta cambiará
a solo slash Lo mismo para la segunda ruta. Para la tercera ruta,
tenemos un parámetro. Así que solo agregaremos ID de columna. De igual manera, para la ruta de eliminación, solo
necesitamos ID. Y por último, lo mismo
para la última ruta aquí. Para que veas que nuestras rutas
son mucho más sencillas ahora. Ahora de vuelta en app dot Js. Ahora aquí tienes un
ejercicio sencillo para ti. Quiero que refactorizaran
esta ruta a la playa del hogar y la pongan
en un archivo separado Entonces, pausa el video,
haz este ejercicio, y luego podrás
regresar, seguir viendo. Bien, así que esto es
lo que tenemos que hacer. Aquí en la carpeta de ruta, voy a agregar un nuevo archivo. Llamemos a esto home dot
js para SreeoAdepress. Por lo que requieren Express. Entonces conseguimos un router. Así que el router es el router Express. Ahora, de vuelta en la app punto JS, conseguimos cortar esta ruta
y pegarla aquí. Pero en lugar de app, adjuntamos a este router. Y por último,
exportamos el router. Así módulo dot Exportaciones, lo
configuramos a este router. Y por último, volvemos a app dot JS y cargamos
este nuevo módulo. Entonces en la parte superior, aquí es donde
cargamos nuestro módulo de cursos. Carguemos el módulo home. Por lo que requieren casa. Por último, aquí donde estamos
agregando el middleware, llamamos app que usamos decimos para cualquier ruta que comience con
slash, use el Todo bien. Ahora bien, si nos
fijamos en app dot JS, todo lo que tenemos aquí es simplemente el código de inicio de
nuestra aplicación. Ahora, una última cosa antes
de terminar esta conferencia. Así que antes, creamos
este middleware logger. Lo colocamos en un módulo
separado y
exportamos esta función al
final de este módulo, ¿verdad? Ahora, en términos de estructurar
tu aplicación, es posible que
tengas múltiples funciones de
middleware Entonces es mejor ponerlos todos en una carpeta llamada middleware Así que aquí en la raíz
de la aplicación, creamos otra carpeta llamada middleware y movemos este
logger dentro de esta Whoa y esto también
significa que deberíamos ir a la app o a Js en la parte superior donde
cargamos este middleware, deberíamos cambiar la ruta
a