¿Cómo configurar la conexión a MongoDB en tu proyecto?
Para trabajar con bases de datos en nuestros proyectos, establecer una conexión adecuada es fundamental. Primero, asegurarte de que ya has configurado la base de datos y cómo integrarla con tu proyecto. A continuación, se explican los pasos para crear una conexión utilizando MongoDB.
Utilizando Robo 3T para administrar tu base de datos
Robo 3T es una herramienta excelente para gestionar visualmente tus bases de datos MongoDB. Puedes hacer lo siguiente:
Crear nuevas conexiones mediante la introducción de los parámetros de la base de datos.
Administrar tus colecciones y datos de manera sencilla.
Insertar información en la base de datos usando funciones predefinidas de MongoDB, como insertMany.
Inserción de datos en MongoDB
Una vez configurada la conexión, puedes proceder a insertar datos en tu colección. Supongamos que tienes varios documentos listos para ser insertados:
// Ejemplo de inserción de documentosconst documents =[{name:"Curso 1",description:"Introducción a la programación"},{name:"Curso 2",description:"JavaScript avanzado"},{name:"Curso 3",description:"Bases de datos con MongoDB"}];// Operación de insercióndb.collection('cursos').insertMany(documents);
Recuerda eliminar los identificadores (ids) explícitos, ya que MongoDB los genera automáticamente.
¿Cómo extraer datos de MongoDB?
Una vez que tu base de datos está configurada y los datos insertados, el siguiente paso es extractar la información necesaria.
Implementación de resolvers para consultar datos
En el proyecto, implementamos resolvers para manejar las consultas:
// Función para consultar todos los cursosasyncfunctiongetCursos(){const db =awaitconnectToDb();const cursos =await db.collection('cursos').find().toArray();return cursos;}
Optimización de consultas con async y await
Las funciones de consulta deben ser asíncronas para garantizar una operación no bloqueante. Usa async y await para manejar la sincronización:
Establece la conexión con la base de datos usando async.
Realiza las consultas con await para esperar los resultados de las mismas.
Manejo de errores en consultas
Es esencial manejar posibles errores durante las consultas. Usa bloques de try-catch para capturar y manejar excepciones:
try{const curso =await db.collection('cursos').findOne({_id:newObjectId(id)});return curso;}catch(error){console.error("Error al consultar el curso:", error);}
¿Cómo manejar errores y verificar el código?
Durante el desarrollo, es común encontrar errores. Aquí te damos algunos consejos para abordar estos problemas de manera efectiva:
Diagnóstico y corrección de errores comunes
Módulo no encontrado: Asegúrate de usar las rutas correctas.
Verifica que has escrito correctamente el nombre del módulo y su ruta de acceso.
Ejemplo: usa require('./db') en lugar de un nombre incorrecto.
Conexiones fallidas: Comprueba que la configuración de la base de datos sea correcta.
Revisa las credenciales y la disponibilidad del servidor.
Asegúrate de que tu aplicación tiene los permisos necesarios para acceder a la base de datos.
Errores de sintaxis: Siempre revisa el código en busca de errores tipográficos o de estructura.
Consejos para debuggear
Usa console.log para verificar el flujo de datos y función de las variables.
Implementa herramientas de desarrollo que ofrezcan depuración paso a paso, como el visor de pasos de Node.js.
Incentivo a seguir aprendiendo
El mundo del desarrollo de software está en constante cambio, pero con la práctica continua y un enfoque en la resolución de problemas, cada día se mejora un poco más. No te detengas aquí; la próxima vez profundizaremos en cómo insertar información en la base de datos, potenciando aún más tu aplicación. ¡Adelante, sigue explorando y aprendiendo!
¿Por qué no mejor actualizan el curso?, estar creando clusters y manejando el web de Mongo no es cualquier cosa y el profe se lo salta nada más. Ni siquiera está actualizada la documentación Mongo.
No que uno no pueda investigar, ¿pero de qué nos sirve el código limpio que nos ofrece en el video si ya no tiene el mismo resultado?
Hola, Mr Billy. Agradezco tu feedback nos hace mejorar como comunidad. Si crees que hay más cosas que deban mejorar de este curso puedes escribirnos a team@platzi.com para poder discutirlo. Por ahora me llevo esto que escribiste que está muy bueno. :)
Algo que se me hizo interesante es que objectID esta un poco rezagado y la documentación prefiere que utilicemos objectId ya que es un poco mejor
const{ObjectId}=require('mongodb')getCourse:async(root,{id})=>{let db
let course =[];try{ db =awaitconnectDB() course = db.collection('courses').findOne({_id:ObjectId(id)})}catch(err){console.error(err)}return course
}
Yo hice la conexión con MongoAtlas, una vez que tienes tu cluster creado, seleccionas el botón connect y seleccionas la opción connect using MongoDB Compass. Saldrá una liga para copiar, es la seleccionas, agregas tu password y en Robo 3T seleccionas la opción create connection, y la pegas donde dice FROM SRV.
GraphQL, tengo entendido, no funciona presisamente con una base de datos, esta hecho para la parte del front-end, funciona mas que todo con API's, para pedir datos y mostrarlos, ahora, con un lenguaje de programacion puedese crear una API que este conectada a una base de datos cualquiera.
GraphQL no es una base de datos ni un layer de datos. Es una especificacion para hacer API que a la larga nisiquiera tienen que estar limitadas a un solo origen de datos, pueden estar conectadas a multiples origenes, base de datos, micro servicios o incluso otros API como Rest
Para no utilizar interfaz grafica genere esta funcion el archivo db.js que permite validar si ya existe la collecion y si no existe agregar la data que queramos
constmain=async()=>{const db =awaitconnectDB();const collectionName ="courses";try{const exists =(await(await db.listCollections().toArray()).findIndex((item)=> item.name=== collectionName))!==-1;if(!exists){console.log("Collection courses not exists:");await db.createCollection(collectionName);console.log("Sucessfull creation courses collection");const insertRes =await db.collection("courses").insertMany(coursesData);console.log("Sucessfull records inserted -> ", insertRes.insertedCount);}}catch(err){console.error(err);}};main();
A mi me funcionó este código, estoy usando Studio3T y MongoDb de manera local. Para este ejercicio no le configuré user y password a la bd, por esta razón no lo envié en la cadena de conexión.
'use strict'const{MongoClient}=require('mongodb')const{DB_HOST,DB_PORT,DB_NAME}= process.envconst mongoUrl =`mongodb://${DB_HOST}:${DB_PORT}/${DB_NAME}`let connection
asyncfunctionconnectDB(){if(connection)return connection
let client
try{ client =awaitMongoClient.connect(mongoUrl,{useNewUrlParser:true}) connection = client.db(DB_NAME)}catch(error){console.error('No se pude conectar a la bd', mongoUrl, error) procces.exit(1)}return connection
}module.exports= connectDB
quien se haya registrado a Mongo Atlas en vez de Mlab porque el registro a este último esta cerrado, y tenga el problema al seguir esta clase con la conexión a la base de datos, debe cambiar la siguiente línea de la configuración de mongoUrl en el archivo db.js:
Igual para los que sigan teniendo problemas para conectar la app con mongo atlas, se pueden fiar del ejemplo que Mongo Atlas ofrece para conectarse:
Por ejemplo:
constMongoClient=require(‘mongodb’).MongoClient;const uri ="mongodb+srv://admin:<password>@platzi-db-jmryr.mongodb.net/test?retryWrites=true";const client =newMongoClient(uri,{useNewUrlParser:true});client.connect(err=>{const collection = client.db("test").collection("devices");// perform actions on the collection object client.close();});
Yo simplemente reorganize las variables y demas para que quedaran como en el curso y me funciono.
Fue medio confuso realizar la conexión desde Robo 3T, pero intentaré explicarla a acontinuación:
Loguearse en , que es gratis el registro y puede ser con la cuenta de Google para quien lo prefiera.
Luego de entrar, nos encontramos frente al panel principal de la aplicación, y en el menú lateral izquierda seleccionamos Clusters
Ahora, a la derecha, seleccionamos CONNECT
En la nueva ventana seleccionamos la tercera opción: Connect using MongoDB Compass. Al menos en mi caso, elegir esta ruta me llevó a buen término.
En la siguiente sección, copiamos la cadena de conexión. Se puede usar el botón Copy para realizar dicha copia.
Aquí vamos a poner la contraseña de nuestro usuario donde la cadena dice <password>
Ahora, cuando abrimos Robo 3T, lo primero que aparece es una ventana en la mitad de la pantalla que nos pregunta a dónde nos queremos conectar. La primera vez posiblemente no salga nada en la lista, así que damos click en Create:
Ahora, en los detalles de la conexión, le damos un nombre a la nuestra, que en este caso fue "platzi-connect", y frente al botón From SRV pegamos la cadena de conexión extraida del punto 5.
Luego de lo anterior, se oprime el botón From SRV, y entonces la ventana muestra ahora otras cosas, como a continuación:
Y listo, si todo salió sin líos, llegamos a este punto, donde tenemos listada la conexión en nuestra ventana MongoDB Connections
Y al seleccionarla, oprimimos Connect
Para crear la base de datos, colecciones y demás, me fue bastante útil usar una serie de videos que comencé a revisar desde este.
Espero sea útil para alguien como lo fue para mi.
Para la versión de mongodb ^3.5.9 el código de la función connectDB en db.js debe quedar así:
asyncfunctionconnectDB(){if(connection)return connection.db();let client;try{ client =newMongoClient(mongoUrl,{useNewUrlParser:true,useUnifiedTopology:true,}); connection =await client.connect();}catch(error){console.error("Could not connect to db", mongoUrl, error); process.exit(1);}return connection.db();}
Eso solventa el problema de db.collection is not a function
De esta forma funciona igual
try{ db =awaitconnectDB() courses =await db.db('graphql').collection('courses').find().toArray()}
Creé un poco de código reutilizable en resolver.js, por si les interesa: