Aplicaciones Reactiva Con React Nodejs Mongodb
Aplicaciones Reactiva Con React Nodejs Mongodb
❝Se proactivo ante los cambios, pues una vez que llegan no tendrás tiempo para
reaccionar❞
Página | 2
Datos del autor:
Ciudad de México
e-mail: [email protected]
Autor y Editor
Composición y redacción:
Edición:
Portada
Primera edición
3 | Página
Acerca del autor
Oscar Blancarte es originario de Sinaloa, México donde estudió la carrera de
Ingeniería en Sistemas Computacionales y rápidamente se mudó a la Ciudad de
México donde actualmente radica.
Página | 4
Otras obras del autor
5 | Página
Éstos son sólo algunos de los 25 ejemplos que abordaremos en este libro, los
cuales están acompañados, en su totalidad, con el código fuente para que seas
capaz de descargarlos, ejecutarlos y analizarlos desde tu propia computadora.
Adquiérelo en https://reactiveprogramming.io/books/es
Página | 6
Introducción a la arquitectura de software – Un enfoque
práctico
La realidad es que a medida que la tecnología avanza, tenemos cada vez más
herramientas a nuestra disposición, como lenguajes de programación, IDE’s,
editores de código, frameworks, librerías, plataformas en la nube y una gran
cantidad de herramientas que nos hacen la vida cada vez más simple, y por
increíble que parezca, los retos de hoy en día no son compilar el código, imprimir
una hoja, guardar en una base de datos; tareas que antes eran muy difíciles; lo
curioso es que hoy en día hay tantas alternativas para hacer cualquier cosa, que
por increíble que parezca, el reto de un programador hoy en día es decidirse por
qué tecnología irse, eso es increíble, tenemos tantas opciones para hacer lo que
sea, que el reto no es hacer las cosas, si no con que tecnologías la aremos.
Ahora bien, yo quiero hacerte una pregunta, ¿crees que hacer un programa hoy
en días es más fácil que hace años?
Seguramente a todos los que les haga esta pregunta concordarán con que hoy
en día es más fácil, sin embargo, y por increíble que parezca, el hecho de que las
tecnologías sean cada vez más simples, nos trae nuevas problemáticas y justo
aquí donde quería llegar.
A medida que las tecnologías son más simples y más accesibles para todas las
personas del mundo, las aplicaciones se enfrentan a retos que antes no existían,
como la concurrencia, la seguridad, la alta disponibilidad, el performance, la
usabilidad, la reusabilidad, testabilidad, funcionalidad, modificabilidad,
portabilidad, integridad, escalabilidad, etc, etc. Todos estos son conceptos que
prácticamente no existían en el pasado, porque las aplicaciones se desarrollaban
para una audiencia muy reducida y con altos conocimientos técnicos, además, se
ejecutaban en un Mainframe, lo que reducía drásticamente los problemas de
conectividad o intermitencia, pues todo se ejecuta desde el mismo servidor.
Adquiérelo en https://reactiveprogramming.io/books/es
7 | Página
Página | 8
Agradecimientos
Este libro tiene una especial dedicación a mi esposa Liliana y mi hijo Oscar,
quienes son la principal motivación y fuerza para seguir adelante todos los días,
por su cariño y comprensión, pero sobre todo por apoyarme y darme esperanzas
para escribir este libro.
A mis padres, quien con esfuerzo lograron sacarnos adelante, darnos una
educación y hacerme la persona que hoy soy.
9 | Página
Prefacio
Cada día, nacen nuevas tecnologías que ayudan a construir aplicaciones web más
complejas y elaboras, con relativamente menos esfuerzo, ayudando a que casi
cualquiera persona con conocimientos básicos de computación puede realizar una
página web. Sin embargo, no todo es felicidad, pues realizar un trabajo
profesional, requiere de combinar muchas tecnologías para entregar un producto
de calidad.
Puede que aprender React o NodeJS no sea un reto para las personas que ya
tiene un tiempo en la industria, pues ya están familiarizados con HTML,
JavaScript, CSS y JSON, por lo que solo deberá complementar sus conocimientos
con una o dos tecnologías adicionales, sin embargo, para las nuevas
generaciones de programadores o futuros programadores, aprender React o
NodeJS puede implicar un reto aun mayor, pues se necesita aprender primero
las bases, antes de poder programar en un stack de más alto nivel.
Este libro pretende evitarte ese dolor de cabeza que yo tuve por mucho tiempo,
pues a lo largo de este libro aprenderemos a utilizar React + NodeJS con Express
+ MongoDB y aderezaremos todo esto con Redux, uno de los módulos más
populares y avanzados para el desarrollo de aplicaciones Web profesionales.
Finalmente aprenderemos a crear un API REST completo con NodeJS y utilizando
el Estándar de Autenticación JSON Web Tokens.
El objetivo final de este libro es que aprendas a crear aplicaciones reactivas con
React, apoyado de las mejores tecnologías disponibles. Es por este motivo que,
durante la lectura de este libro, trabajaremos en un único proyecto que irá
evolucionando hasta terminarlo por completo. Este proyecto será, una réplica de
la red social Twitter, en la cual podremos crear usuarios, autenticarnos, publicar
Tweets, seguir a otros usuarios y ver las publicaciones de los demás en nuestro
home.
Página | 10
Cómo utilizar este libro
Este libro es en lo general fácil de leer y digerir, pues tratamos de enseñar todos
los conceptos de la forma más simple y asumiendo que el lector tiene poco o
nada de conocimiento del tema, así, sin importar quien lo lea, todos podamos
aprender fácilmente.
Como parte de la dinámica de este libro, hemos agregado una serie de tipos de
letras que hará más fácil distinguir entre los conceptos importantes, código,
referencias a código y citas. También hemos agregado pequeñas secciones de
tips, nuevos conceptos, advertencias y peligros, los cuales mostramos mediante
una serie de íconos agradables para resaltar a la vista.
Texto normal:
Negritas:
Cursiva:
Es texto lo utilizamos para hacer referencia a fragmentos de código como
una variable, método, objeto o instrucciones de líneas de comandos. Pero
también es utilizada para resaltar ciertas palabras técnicas.
Código
1. ReactDOM.render(
2. <h1>Hello, world!</h1>,
3. document.getElementById('root')
4. );
El texto con fondo verdes, lo utilizaremos para indicar líneas que se agregan al
código existente.
11 | Página
Por otra parte, tenemos los íconos, que nos ayudan para resaltar algunas cosas:
Tip
Importante
Error común
Documentación
Página | 12
Código fuente
Todo el código fuente de este libro está disponible en GitHub y dividido de tal
forma que, cada capítulo tenga un Branch independiente. El código fuente lo
puedes encontrar en:
https://github.com/oscarjb1/books-reactiveprogramming.git
13 | Página
Requisitos previos
Este libro está diseñado para que cualquier persona con conocimientos básicos
de programación web, puedo entender la totalidad de este libro, sin embargo,
debido a la naturaleza de React y NodeJS, es necesario conocer los fundamentos
de JavaScript, pues será el lenguaje que utilizaremos a lo largo de todo este libro.
Página | 14
INTRODUCCIÓN
Muy lejos han quedado los tiempos en los que Tim Berners Lee, conocido como
el padre de la WEB; estableció la primera comunicación entre un cliente y un
servidor, utilizando el protocolo HTTP (noviembre de 1989). Desde entonces, se
ha iniciado una guerra entre las principales compañías tecnológicas por dominar
el internet. El caso más claro, es la llamada guerra de los navegadores,
protagonizado por Netscape Communicator y Microsoft, los cuales buscaban que
sus respectivos navegadores (Internet Explorer y Netscape) fueran el principal
software para navegar en internet.
Durante esta guerra, las dos compañías lucharon ferozmente, Microsoft luchaba
por alcanzar a Netscape, quien entonces le llevaba la delantera y Netscape
luchaba para no ser alcanzados por Microsoft. Como hemos de imaginar,
Microsoft intento comprar a Netscape y terminar de una vez por todas con esta
guerra, sin embargo, Netscape se negó reiteradamente a la venta, por lo que
Microsoft inicio una de las más descaradas estrategias; amenazo con copiar
absolutamente todo lo que hiciera Netscape si no accedían a la venta.
Para no hacer muy larga esta historia, y como ya sabrás, Microsoft termino
ganando la guerra de los navegadores, al proporcionar Internet Explorer
totalmente gratis y preinstalado en el sistema operativo Windows.
Hasta este punto te preguntarás, ¿qué tiene que ver toda esta historia con React
y NodeJS?, pues la verdad es que mucho, pues durante la guerra de los
navegadores Netscape invento JavaScript. Aunque en aquel momento, no era un
lenguaje de programación completo, sino más bien un lenguaje de utilidad, que
permitía realizar cosas muy simples, como validar formularios, lanzar alertas y
realizar algunos cálculos. Es por este motivo que debemos recordar a Netscape,
pues fue el gran legado que nos dejó.
15 | Página
Retornando a JavaScript, este lenguaje ha venido evolucionando de una manera
impresionante, de tal forma que hoy en día es un lenguaje de programación
completo, como Java o C#. Tan fuerte ha sido su evolución y aceptación que hoy
en día podemos encontrar a JavaScript del lado del servidor, como es el caso de
NodeJS, creado por Ryan Dahl en 2009. De la misma forma, Facebook desarrollo
la librería React basada en JavaScript.
Página | 16
Índice
Agradecimientos .................................................................................................................................... 9
Prefacio ............................................................................................................................................... 10
Requisitos previos................................................................................................................................ 14
INTRODUCCIÓN ................................................................................................................................... 15
Índice ................................................................................................................................................... 17
17 | Página
Introducción al desarrollo con React .................................................................................................... 64
Programación con JavaScript XML (JSX) ................................................................................................ 64
Diferencia entre JSX, HTML y XML .................................................................................................... 65
Contenido dinámico y condicional .................................................................................................... 72
JSX Control Statements ..................................................................................................................... 75
Transpilación ..................................................................................................................................... 79
Programación con JavaScript puro. ....................................................................................................... 80
Element Factorys .............................................................................................................................. 81
Element Factory Personalizados ....................................................................................................... 82
Resumen ................................................................................................................................................ 84
Página | 18
El enfoque Top-down & Bottom-up ..................................................................................................... 124
Top-down ........................................................................................................................................ 124
Bottom-up ....................................................................................................................................... 125
El enfoque utilizado y porque ......................................................................................................... 125
El API REST del proyecto Mini Twitter .................................................................................................. 126
Invocando el API REST desde React ..................................................................................................... 129
Mejorando la clase APIInvoker ....................................................................................................... 131
El componente TweetsContainer ......................................................................................................... 134
El componente Tweet .......................................................................................................................... 137
Paginando los Tweets .......................................................................................................................... 144
Resumen .............................................................................................................................................. 147
19 | Página
Function componentWillUnmount ....................................................................................................... 194
Flujos de montado de un componente ................................................................................................ 195
Flujos de actualización ......................................................................................................................... 196
Flujos de desmontaje de un componente ............................................................................................ 197
Mini Twitter (Continuación 2) .............................................................................................................. 198
Configuración inicial ........................................................................................................................ 198
El componente TwitterApp ............................................................................................................. 199
El componente TwitterDashboard .................................................................................................. 203
El componente Profile .................................................................................................................... 205
El componente SuggestedUsers ..................................................................................................... 209
El componente Reply ...................................................................................................................... 213
Resumen .............................................................................................................................................. 230
Página | 20
Mini Twitter (Continuación 5) .............................................................................................................. 296
El componente TweetDetail............................................................................................................ 296
El componente Modal ..................................................................................................................... 299
Últimos retoques al proyecto ......................................................................................................... 305
Resumen .............................................................................................................................................. 307
Hooks................................................................................................................................................. 323
Introducción a los Hooks ...................................................................................................................... 328
Estado ............................................................................................................................................. 328
Ciclo de vida .................................................................................................................................... 331
Creando nuestros propios Hooks .................................................................................................... 335
Utilizando el Context con los Hooks ............................................................................................... 336
El futuro de las clases...................................................................................................................... 337
Mini Twitter (Continuación 7) .............................................................................................................. 338
Migrando el componente Followers ............................................................................................... 338
Migrando el componente Followings ............................................................................................. 340
Migrando el componente SuggestedUser ...................................................................................... 341
Migrando el componente Toolbar .................................................................................................. 342
Migrando el componente TwitterDashboard ................................................................................. 344
Migrando el componente TwitterApp ............................................................................................ 344
Migrando el componente UserPage ............................................................................................... 347
Conclusiones ........................................................................................................................................ 353
21 | Página
Resumen .............................................................................................................................................. 395
Página | 22
Schemas del proyecto Mini Twitter ..................................................................................................... 466
Tweet Scheme................................................................................................................................. 466
Profile Scheme ................................................................................................................................ 467
Ejecutar operaciones básicas .......................................................................................................... 469
Resumen .............................................................................................................................................. 476
23 | Página
Producción vs desarrollo ...................................................................................................................... 572
Alta disponibilidad ............................................................................................................................... 573
Cluster ............................................................................................................................................. 573
Puertos ................................................................................................................................................. 578
Comunicación segura........................................................................................................................... 579
Certificados emitidos por autoridades ........................................................................................... 580
Certificados auto firmados .............................................................................................................. 581
Instalando un certificado en nuestro servidor ................................................................................ 582
Habilitar el modo producción .............................................................................................................. 586
Hosting y dominios .............................................................................................................................. 589
Resumen .............................................................................................................................................. 591
Página | 24
Por dónde empezar
Capítulo 1
Hoy en día existe una gran cantidad de propuestas para desarrollar aplicaciones
web, y cada lenguaje ofrece sus propios frameworks que prometen ser los
mejores, aunque la verdad es que nada de esto está cercas de la realidad, pues
el mejor framework dependerá de lo que buscas construir y la habilidad que ya
tengas sobre un lenguaje determinado.
Algunas de las propuestas más interesantes para el desarrollo web son, Angular,
Laravel, Vue.JS, Ember.js, Polymer, React.js entre un gran número de etcéteras.
Lo que puede complicar la decisión sobre qué lenguaje, librería o framework
debemos utilizar.
Desde luego, en este libro no tratamos de convencerte de utilizar React, sino más
bien, buscamos enseñarte su potencial para que seas tú mismo quien pueda
tomar esa decisión.
• Udemy
• Bitbucket
• Anypoint (MuleSoft)
• Facebook
• Courcera
• Airbnb
• American Express
• Atlassian
• Docker
• Dropbox
• Instagram
• Reddit
• Twitter
25 | Página
Son solo una parte de una inmensa lista de empresas y páginas que utilizan React
como parte medular de sus desarrollos. Puedes ver la lista completa de páginas
que usan React aquí: https://github.com/facebook/react/wiki/sites-using-react.
Esta lista debería ser una evidencia tangible de que React es sin duda una librería
madura y probada.
Página | 26
Introducción a React
React fue lanzado por primera vez en 2013 por Facebook y es actualmente
mantenido por ellos mismo y la comunidad de código abierto, la cual se extiende
alrededor del mundo. React, a diferencia de muchas tecnologías del desarrollo
web, es una librería, lo que lo hace mucho más fácil de implementar en muchos
desarrollos, ya que se encarga exclusivamente de la interface gráfica del
usuario y consume los datos a través de API que por lo general son REST.
El nombre de React proviene de su capacidad de crear interfaces de usuario
reactivas, la cual es la capacidad de una aplicación para actualizar toda la
interface gráfica en cadena, como si se tratara de una formula en Excel, donde
al cambiar el valor de una celda automáticamente actualiza todas las celdas que
depende del valor actualizado y esto se repite con las celdas que a la vez
dependía de estas últimas. De esta misma forma, React reacciona a los cambios
y actualiza en cascada toda la interface gráfica.
Uno de los datos interesantes de React es que, se ejecutado del lado del
cliente (navegador), y no requiere de peticiones GET para cambiar de una
página a otra, pues toda la aplicación es empaquetada en un solo archivo
JavaScript (bundle.js) que es descargado por el cliente cuando entra por primera
vez a la página. De esta forma, la aplicación solo requerirá del backend para
recuperar y actualizar los datos.
React suele ser llamado React.js o ReactJS dado que es una librería de
JavaScript, por lo tanto, el archivo descargable tiene la extensión .js, sin
embargo, el nombre real es simplemente React.
27 | Página
Server Side Apps vs Single Page Apps
Las aplicaciones del lado del servidor, son aquellas en las que el código fuente
de la aplicación está en un servidor y cuando un cliente accede a la aplicación, el
servidor solo le manda el HTML de la página a mostrar en pantalla, de esta
manera, cada vez que el usuario navega hacia una nueva sección de la página,
el navegador lanza una petición GET al servidor y este le regresa la nueva página.
Esto implica que cada vez que el usuario de click en una sección, se tendrá que
comunicar con el servidor para que le regresa la nueva página, creado N
solicitudes GET para N cambios de página. En una página del lado del servidor,
cada petición retorna tanto el HTML para mostrar la página, como los datos que
va a mostrar.
Como vemos en la imagen, el cliente lanza un GET para obtener la nueva página,
el servidor tiene que hacer un procesamiento para generar la nueva página y
tiene que ir a la base de datos para obtener la información asociada a la página
de respuesta. La nueva página es enviada al cliente y este solo la muestra en
pantalla. En esta arquitectura todo el trabajo lo hace el servidor y el cliente
solo se limita a mostrar las páginas que el server le envía.
Página | 28
Single page app
Las aplicaciones de una sola página se diferencian de las aplicaciones del lado del
servidor debido a que, gran parte del procesamiento y la generación de las
vistas las realiza directamente el cliente (navegador). Por otro lado, el
servidor solo expone un API mediante el cual, la aplicación puede consumir datos
y realizar operaciones transaccionales.
Si bien, React funciona originalmente como SPA, existe técnicas para realizar el
renderizado del lado del servidor, como es el caso de NextJS, un poderos
framework que permite el renderizado del lado del servidor, sin embargo, esto
querá fuera del alcance de este libro.
29 | Página
Introducción a NodeJS
NodeJS es sin duda una de las tecnologías que más rápido está creciendo, y que
ya hoy en día es indispensable para cubrir posiciones de trabajo. NodeJS ha sido
revolucionario en todos los aspectos, desde la forma de trabajar hasta que
ejecuta JavaScript del lado del servidor.
Página | 30
y orientado a eventos, que lo hace liviano y eficiente. El ecosistema de paquetes
de Node.js, npm, es el ecosistema más grande de librerías de código abierto en
el mundo.
Todo esto viene al caso, debido a que NodeJS se ha convertido en unos de los
servidores por excelencia para implementar microservicios, ya que es muy ligero
y puede ser montado en servidores virtuales con muy pocos recursos, algo que
es imposible con servidores de aplicaciones tradiciones como Wildfy, Websphere,
Glashfish, IIS, etc.
31 | Página
Hoy en día es posible rentar un servidor virtual por 5 USD al mes con 1GB de
RAM y montar una aplicación con NodeJS, algo realmente increíble y es por eso
mi insistencia en que NodeJS es una de las tecnologías más prometedoras
actualmente. Por ejemplo, yo suelo utilizar Digital Ocean, pues me permite rentar
servidores desde 5 usd al mes.
Introducción a MongoDB
Uno de los principales retos al trabajar con MongoDB es entender cómo funciona
el paradigma NoSQL y abrir la mente para dejar a un lado las tablas y las
columnas, para pasar un nuevo modelo de datos de colecciones y documentos,
los cuales no son más que estructuras de datos en formato JSON.
Página | 32
contenida en un solo objeto, que, en una base de datos relacional, probablemente
guardaríamos en más de una tabla. Un documento MongoDB suele ser un objeto
muy grande, que se asemejan a un árbol, y dicho árbol suele tener varios niveles
de profundidad, debido a esto, MongoDB NO requiere de realizar joins para
armar toda la información, pues un documento por sí solo, contiene toda la
información requerida, en pocas palabras, MongoDB permite grabar objetos
completos con todo y sus relaciones.
1. { 6. {
2. "name": "Juan Perez", 7. "name": "Juan Perez",
3. "age": 20, 8. "age": 20,
4. "tel": "1234567890" 9. "tels": [
5. } 10. "1234567890",
11. "0987654321"
12. ]
13. }
Observemos que los dos objetos son relativamente similares, y tiene los mismos
campos, sin embargo, uno tiene un campo para el teléfono, mientras que el
segundo objeto, tiene una lista de teléfonos. Es evidente que aquí tenemos dos
incongruencias con un modelo de bases de datos relacional, el primero, es que
tenemos campos diferentes para el teléfono, ya que uno se llama tel y el otro
tels. La segunda incongruencia es que, la propiedad tels del segundo objeto es
en realidad un arreglo, lo cual en una DB relacional, sería una tabla secundaria
unida con un Foreign Key. El segundo objeto se vería de la siguiente manera
modelado en una DB relacional:
33 | Página
La relación entre React, NodeJs & MongoDB
Como vemos en la imagen, React está del lado del FrontEnd, lo que significa que
su único rol es la representación de los datos y la apariencia gráfica. En el
BackEnd tenemos a NodeJS, quien es el intermediario entre React y MongoDB.
MongoDB también está en el Backend, pero este no suele ser accedido de forma
directa por temas de seguridad.
Página | 34
Resumen
35 | Página