¿Cómo desplegar una aplicación Node.js en Heroku utilizando MongoDB Atlas?
Desplegar aplicaciones en la nube puede parecer complejo al principio, pero con servicios como Heroku y MongoDB Atlas, el proceso se simplifica bastante. Aquí aprenderás a realizar un deployment de una aplicación Node.js en Heroku, usando MongoDB Atlas como la base de datos.
¿Qué necesitas configurar en tu aplicación?
Para preparar tu aplicación y desplegarla en Heroku, deberás realizar algunos ajustes claves en tu proyecto de Node.js. Asegúrate de seguir los siguientes pasos:
Archivo Main:
Asegúrate de habilitar las CORS para recibir peticiones.
Define el puerto a través de una variable de ambiente, por defecto Heroku asigna un puerto dinamico, normalmente el puerto 80.
Archivo package.json:
Especifica la versión de Node.js que utilizarás, por ejemplo, la versión 14.
Archivo Procfile:
Define el comando que ejecutará tu aplicación cuando sea desplegada.
¿Cómo se configura Heroku para el deployment?
Heroku permite interacciones tanto mediante interfaz gráfica como a través de la terminal. Para empezar el deployment, sigue estos pasos:
Creación del Proyecto:
Usa el comando heroku create en la terminal. Esto generará una nueva aplicación con un dominio asignado.
heroku create
Repositorio de Heroku:
Heroku crea automáticamente un repositorio donde se realizará el deployment. Asegúrate de estar en la rama master para ejecutar correctamente el comando de envío.
Realizar y enviar un commit:
Realiza un merge de los cambios recientes y luego usa el comando:
gitadd.git commit -m "Descripción de los cambios"git push heroku master
¿Cómo configurar las variables de entorno en Heroku?
Las variables de entorno son cruciales para la conexión con MongoDB Atlas. Puedes configurarlas de las siguientes maneras:
Desde la interfaz gráfica:
Accede a la consola de Heroku y dirígete a las configuraciones del proyecto.
Agrega las variables de entorno, asegurándote de que los valores como el nombre de la base de datos, usuario, host, y tipo de conexión sean correctos. Por ejemplo, el tipo de conexión para MongoDB Atlas es mongodb+srv://.
Desde la terminal:
Usa el comando heroku config:set para definir variables de entorno. Esto facilita las modificaciones y los reinicios automáticos del proyecto.
heroku config:set JW_SECRET=my_secret_key
¿Qué ajustes se deben hacer en el código?
Cuando trabajas con bases de datos remotas como MongoDB Atlas, hay ciertas optimizaciones que puedes realizar:
Eliminar puertos de conexión:
Las bases de datos remotas no requieren puertos en la conexión. Ajusta tu código para que el host incluya automáticamente el puerto en el desarrollo, pero no en producción.
Refactorización del código de conexión:
Asegúrate de eliminar puertos específicos del archivo de configuración del proyecto. Redefine las conexiones para que, dependiendo del entorno, se gestionen de manera dinámica.
¿Cómo verificas que la aplicación se desplegó exitosamente?
Con la aplicación desplegada en Heroku, sigue estos métodos para comprobar que todo funciona correctamente:
Verificación de la URL de la aplicación:
Accede a la URL proporcionada por Heroku para ver si la aplicación está activa y funcionando sin errores.
Pruebas mediante Insomnia:
Usa una herramienta como Insomnia para realizar peticiones a los endpoints de tu aplicación.
Verifica la creación de usuarios, autenticaciones, y otros endpoints configurados para asegurarte de que todos se conectan efectivamente con la base de datos en MongoDB Atlas.
Consulta en MongoDB Compass:
Revisa los datos ingresados en MongoDB Compass para confirmar que se están guardando correctamente en tu base de datos administrada por MongoDB Atlas.
Implementar un proyecto en la nube con estas configuraciones no solo facilita su gestión, sino que también te permite escalar a un entorno productivo más robusto si es necesario. ¡No dudes en seguir explorando y mejorando tus habilidades!
Un curso de microservicios con NestJs y su administración!!!!
Heroku actualmente no tiene un add-ons (o plugin) gratuito para MongoDB. Necesariamente se debe utilizar con Mongo Atlas.
No ocurre esto con MySQL o PostgreSQL donde si hay versiones gratuitas de estos motores de BB.DD.
Una pena que Heroku no de este servicio free para pruebas, hasta fines del 2020 lo tenía.
Hay que ser precavidos a la hora de quien se conecta a nuestra BD, por lo general deberíamos dejas los accesos a Heroku (que es nuestro servidor) y al admin (que en este caso seriamos nosotros).
Buenos dias Nicolas, por favor me confirmas si ya no se puede desplegar en Heroku para Mongodb, tengo problemas con esto, solo me falta esto para poder realizar el examen, quedo muy pendiente a tu respuesta, en anterior pregunta coloque la imagen con el error presentado
Si se puede desplegar sin problema en Heroku, pero tienes que revisar si la DB que configuraste en Mongo Altas está funcionando correctamente.
estoy haciendo el deploy, pero me da un error de dependencias al darle push a master en heroku, ya actualice las dependencias pero sigue dandome el error, aqui dejo el error
remote: -----> Installing dependencies
remote: Installing node modules (package.json)
remote: npm ERR! code ERESOLVE
remote: npm ERR! ERESOLVE unable to resolve dependency tree
remote: npm ERR!
remote: npm ERR! While resolving: platzi-store@0.0.1
remote: npm ERR! Found: rxjs@6.6.6
remote: npm ERR! node_modules/rxjs
remote: npm ERR! rxjs@"6.6.6" from the root project
remote: npm ERR!
remote: npm ERR! Could not resolve dependency:
remote: npm ERR! peer rxjs@"^7.1.0" from @nestjs/common@8.2.4
remote: npm ERR! node_modules/@nestjs/common
remote: npm ERR! @nestjs/common@"^8.2.4" from the root project
remote: npm ERR!
remote: npm ERR! Fix the upstream dependency conflict, or retry
remote: npm ERR! this command with --force, or --legacy-peer-deps
remote: npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
remote: npm ERR!
remote: npm ERR! See /tmp/npmcache.wpkAA/eresolve-report.txt for a full report.
remote:
remote: npm ERR! A complete log of this run can be found in:
remote: npm ERR! /tmp/npmcache.wpkAA/_logs/2022-01-09T00_16_59_248Z-debug.log
remote:
remote: -----> Build failed
remote:
remote: We're sorry this build is failing! You can troubleshoot common issues here:
remote: https://devcenter.heroku.com/articles/troubleshooting-node-deploys
remote:
remote: If you're stuck, please submit a ticket so we can help:
remote: https://help.heroku.com/
remote:
remote: Love,
remote: Heroku
remote:
remote: ! Push rejected, failed to compile Node.js app.
remote:
remote: ! Push failed
remote: Verifying deploy...
remote:
remote: ! Push rejected to guarded-taiga-60070.
remote:
To https://git.heroku.com/guarded-taiga-60070.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/guarded-taiga-60070.git'
El deploy me regresa los siguientes errores
2021-09-09T03:48:59.266113+00:00 app[web.1]:> node dist/main
2021-09-09T03:48:59.266113+00:00 app[web.1]:2021-09-09T03:49:00.018565+00:00 app[web.1]:(node:22)Warning:Accessing non-existent property 'MongoError'of module exports inside circular dependency
2021-09-09T03:49:00.018585+00:00 app[web.1]:(Use`node --trace-warnings ...` to show where the warning was created)2021-09-09T03:49:00.038000+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:00AM[NestFactory]StartingNest application...2021-09-09T03:49:00.065424+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:00AM[InstanceLoader]MongooseModule dependencies initialized +45ms
2021-09-09T03:49:00.065810+00:00 app[web.1]: conexion2 mongodb+srv://usuario:password@platzi-store.dominio.mongodb.net2021-09-09T03:49:00.069052+00:00 app[web.1]: client MongoClient{2021-09-09T03:49:00.069054+00:00 app[web.1]: _events:[Object:null prototype]{},2021-09-09T03:49:00.069054+00:00 app[web.1]: _eventsCount:0,2021-09-09T03:49:00.069054+00:00 app[web.1]: _maxListeners:undefined,2021-09-09T03:49:00.069055+00:00 app[web.1]: s:{2021-09-09T03:49:00.069056+00:00 app[web.1]: url:'mongodb+srv://usuario:password@platzi-store.dominio.mongodb.net',2021-09-09T03:49:00.069056+00:00 app[web.1]: options:{},2021-09-09T03:49:00.069056+00:00 app[web.1]: promiseLibrary:[Function:Promise],2021-09-09T03:49:00.069057+00:00 app[web.1]: dbCache:Map(0){},2021-09-09T03:49:00.069057+00:00 app[web.1]: sessions:Set(0){},2021-09-09T03:49:00.069057+00:00 app[web.1]: writeConcern:undefined,2021-09-09T03:49:00.069058+00:00 app[web.1]: readPreference:ReadPreference{2021-09-09T03:49:00.069058+00:00 app[web.1]: mode:'primary',2021-09-09T03:49:00.069059+00:00 app[web.1]: tags:undefined,2021-09-09T03:49:00.069059+00:00 app[web.1]: hedge:undefined2021-09-09T03:49:00.069059+00:00 app[web.1]:},2021-09-09T03:49:00.069060+00:00 app[web.1]: namespace:MongoDBNamespace{db:'admin',collection:undefined}2021-09-09T03:49:00.069060+00:00 app[web.1]:},2021-09-09T03:49:00.069060+00:00 app[web.1]:[Symbol(kCapture)]:false2021-09-09T03:49:00.069060+00:00 app[web.1]:}2021-09-09T03:49:00.073755+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:00AM[InstanceLoader]HttpModule dependencies initialized +8ms
2021-09-09T03:49:00.096734+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:00AM[InstanceLoader]ConfigHostModule dependencies initialized +23ms
2021-09-09T03:49:00.100702+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:00AM[InstanceLoader]ConfigModule dependencies initialized +4ms
2021-09-09T03:49:00.105663+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:00AM[MongooseModule]Unable to connect to the database.Retrying(1)...+5ms
2021-09-09T03:49:00.117512+00:00 app[web.1]:(node:22)DeprecationWarning: current ServerDiscovery and Monitoring engine is deprecated, and will be removed in a future version.To use the newServerDiscover and Monitoring engine, pass option {useUnifiedTopology:true} to the MongoClient constructor.2021-09-09T03:49:00.179476+00:00 app[web.1]: database Db{2021-09-09T03:49:00.179481+00:00 app[web.1]: _events:[Object:null prototype]{},2021-09-09T03:49:00.179482+00:00 app[web.1]: _eventsCount:0,2021-09-09T03:49:00.179482+00:00 app[web.1]: _maxListeners:undefined,2021-09-09T03:49:00.179483+00:00 app[web.1]: s:{2021-09-09T03:49:00.179483+00:00 app[web.1]: dbCache:{},2021-09-09T03:49:00.179483+00:00 app[web.1]: children:[],2021-09-09T03:49:00.179484+00:00 app[web.1]: topology:ReplSet{2021-09-09T03:49:00.179484+00:00 app[web.1]: _events:[Object:null prototype],2021-09-09T03:49:00.179485+00:00 app[web.1]: _eventsCount:35,2021-09-09T03:49:00.179485+00:00 app[web.1]: _maxListeners:Infinity,2021-09-09T03:49:00.179485+00:00 app[web.1]: s:[Object],2021-09-09T03:49:00.179486+00:00 app[web.1]:[Symbol(kCapture)]:false2021-09-09T03:49:00.179486+00:00 app[web.1]:},2021-09-09T03:49:00.179486+00:00 app[web.1]: options:{2021-09-09T03:49:00.179487+00:00 app[web.1]: authSource:'admin',2021-09-09T03:49:00.179487+00:00 app[web.1]: retryWrites:true,2021-09-09T03:49:00.179487+00:00 app[web.1]: readPreference:[ReadPreference],2021-09-09T03:49:00.179488+00:00 app[web.1]: promiseLibrary:[Function:Promise]2021-09-09T03:49:00.179488+00:00 app[web.1]:},2021-09-09T03:49:00.179488+00:00 app[web.1]: logger:Logger{className:'Db'},2021-09-09T03:49:00.179488+00:00 app[web.1]: bson:BSON{},2021-09-09T03:49:00.179489+00:00 app[web.1]: readPreference:ReadPreference{2021-09-09T03:49:00.179489+00:00 app[web.1]: mode:'primary',2021-09-09T03:49:00.179489+00:00 app[web.1]: tags:undefined,2021-09-09T03:49:00.179490+00:00 app[web.1]: hedge:undefined2021-09-09T03:49:00.179490+00:00 app[web.1]:},2021-09-09T03:49:00.179490+00:00 app[web.1]: bufferMaxEntries:-1,2021-09-09T03:49:00.179490+00:00 app[web.1]: parentDb:null,2021-09-09T03:49:00.179491+00:00 app[web.1]: pkFactory:undefined,2021-09-09T03:49:00.179491+00:00 app[web.1]: nativeParser:undefined,2021-09-09T03:49:00.179491+00:00 app[web.1]: promiseLibrary:[Function:Promise],2021-09-09T03:49:00.179492+00:00 app[web.1]: noListener:false,2021-09-09T03:49:00.179492+00:00 app[web.1]: readConcern:undefined,2021-09-09T03:49:00.179492+00:00 app[web.1]: writeConcern:undefined,2021-09-09T03:49:00.179493+00:00 app[web.1]: namespace:MongoDBNamespace{db:'platzi-store',collection:undefined}2021-09-09T03:49:00.179493+00:00 app[web.1]:},2021-09-09T03:49:00.179494+00:00 app[web.1]: serverConfig:[Getter],2021-09-09T03:49:00.179494+00:00 app[web.1]: bufferMaxEntries:[Getter],2021-09-09T03:49:00.179494+00:00 app[web.1]: databaseName:[Getter],2021-09-09T03:49:00.179496+00:00 app[web.1]:[Symbol(kCapture)]:false2021-09-09T03:49:00.179496+00:00 app[web.1]:}2021-09-09T03:49:00.179898+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:00AM[InstanceLoader]DatabaseModule dependencies initialized +74ms
2021-09-09T03:49:00.180578+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:00AM[InstanceLoader]AppModule dependencies initialized +1ms
2021-09-09T03:49:03.112053+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:03AM[MongooseModule]Unable to connect to the database.Retrying(2)...+2931ms
2021-09-09T03:49:06.116810+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:06AM[MongooseModule]Unable to connect to the database.Retrying(3)...+3005ms
2021-09-09T03:49:09.120308+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:09AM[MongooseModule]Unable to connect to the database.Retrying(4)...+3003ms
2021-09-09T03:49:12.124414+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:12AM[MongooseModule]Unable to connect to the database.Retrying(5)...+3005ms
2021-09-09T03:49:15.128907+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:15AM[MongooseModule]Unable to connect to the database.Retrying(6)...+3004ms
2021-09-09T03:49:18.132875+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:18AM[MongooseModule]Unable to connect to the database.Retrying(7)...+3004ms
2021-09-09T03:49:21.136517+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:21AM[MongooseModule]Unable to connect to the database.Retrying(8)...+3004ms
2021-09-09T03:49:24.140900+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:24AM[MongooseModule]Unable to connect to the database.Retrying(9)...+3004ms
2021-09-09T03:49:24.141777+00:00 app[web.1]:[Nest]22-09/09/2021,3:49:24AM[ExceptionHandler] querySrv ENOTFOUND _mongodb._tcp.ajumx.mongodb.net+1ms
2021-09-09T03:49:24.141797+00:00 app[web.1]:Error: querySrv ENOTFOUND _mongodb._tcp.ajumx.mongodb.net2021-09-09T03:49:24.141798+00:00 app[web.1]: at QueryReqWrap.onresolve[as oncomplete](dns.js:206:19)2021-09-09T03:49:24.152186+00:00 app[web.1]: npm ERR! code ELIFECYCLE2021-09-09T03:49:24.152420+00:00 app[web.1]: npm ERR! errno 12021-09-09T03:49:24.157907+00:00 app[web.1]: npm ERR! platzi-store@0.0.1start:prod:`node dist/main`2021-09-09T03:49:24.158000+00:00 app[web.1]: npm ERR!Exit status 12021-09-09T03:49:24.158115+00:00 app[web.1]: npm ERR!2021-09-09T03:49:24.158194+00:00 app[web.1]: npm ERR!Failed at the platzi-store@0.0.1start:prod script.2021-09-09T03:49:24.158269+00:00 app[web.1]: npm ERR!This is probably not a problem with npm.There is likely additional logging output above.2021-09-09T03:49:24.161554+00:00 app[web.1]:2021-09-09T03:49:24.161704+00:00 app[web.1]: npm ERR!A complete log ofthis run can be found in:2021-09-09T03:49:24.161773+00:00 app[web.1]: npm ERR!/app/.npm/_logs/2021-09-09T03_49_24_158Z-debug.log2021-09-09T03:49:24.222312+00:00 heroku[web.1]:Process exited with status 12021-09-09T03:49:24.277771+00:00 heroku[web.1]:State changed from starting to crashed
2021-09-09T03:49:41.161489+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=calm-bayou-72866.herokuapp.com request_id=ce6edeec-1b00-495c-9c73-45e87a9127c2 fwd="177.245.201.47" dyno= connect= service= status=503 bytes= protocol=https
En definitiva es algo tu conexión si ya estas en Heroku, ¿Usaste Mongo Atlas para tu DB en producción? Si es así ¿Puedes probar conectarte a esa DB de producción desde Mongo Atlas? Con esto descartar que no sea un error de la configuración de tu DB.
Hola tengo este error mongodb+srv URI cannot have port number por favor alguien que pueda aportar con su ayuda, no he podido dar con la config adecuada para este error
Recuerda configurar en tu .env tu variable de entorno URI_MONGODB y verificar que estes usando exactamente la url que entrega mongo atlas cuando se configuro.
Si es posible puedes colocar un ejemplo de uri para entrar mas en detalle
A alguien le funciono subirlo a Heroku?
Hola
¿Tuviste problemas para hacer el deploy? Puedes pegar acá el código o una imagen para ver que problema lo está causando.
Claro ODCenteno, la imagen del error es la siguiente, la BD es con mongo, si lo pruebo en local funciona perfectamente, la verdad no entiendo que puede ser, te funciono con Mongo?
Hola Nicolas, me genera error heroku luego de realizar el push para desplegar en produccion
alguna idea que puede ser?
El error no es muy claro, puedes revisar que dentro de la carpeta dist este el archivo main y ver si está bien, si no tocaría ver a más detalle con tu código.
Nicolas Muchas gracias por responder, validando si esta el archivo main.js en el directorio dist, lo raro es que cuando lo corro localmente funciona bien, el fuente esta en: https://gitlab.com/riloco/nestjs/-/commits/master depronto con tu conocimiento me puedes echar una manito, no quiero realizar el examen si poder completar el despliegue