¿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!
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
Gracias Iraida, siempre he tenido el problema con mi ISP para conectarme a Mongo Atlas y me toca los cursos trabajarlos de manera local
Me alegra que te haya servido ♥
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.
Me ayudo full tu comentario, muchas gracias
Gracias!!!
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
Wow muchas gracias me sirvió mucho.
De esta forma funciona igual
try{ db =awaitconnectDB() courses =await db.db('graphql').collection('courses').find().toArray()}
Tener presente la configuración de las variables de entorno del archivo .env
¿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. :)
Concuerdo !
Para los que quieran hacerlo con mySQL usando localhost con Xampp
const mysql =require('mysql2/promise')const dataDB ={host:'localhost',user:'root',password:'',database:'academy'}module.exports={Query:{getCourses:async()=>{const connection =await mysql.createConnection(dataDB)const[rows, fields]=await connection.execute('SELECT * FROM courses');return rows
},getCourse:async(root, args)=>{const connection =await mysql.createConnection(dataDB)const[rows, fields]=await connection.execute(`SELECT * FROM courses WHERE id = ${args.id}`);return rows[0]}}}
Genial, ¡muchas gracias! ✌️
Hola Devs:
Aqui les traigo mi solucion, usando clases para hacer la connection a la DB.
Connection a Mongo:
Las queries en el resolver:
Espero y les pueda ayudar de una manera diferente.
Recuerden, #NuncaParesDeAprender 💚
A los que les da el error "ObjectID is not a function" al traer el curso por el ID, la manera correcta es importarlo con la d en minúscula.
const{ObjectId}=require('mongodb')
Si aún así les da error, instalar el npm de bson:
npm i bson
Cambiando a minúscula fue suficiente, muchas gracias
Vengo haciendo toda la carrera frontend, veo estas clases y quedo así 😶 jajaja
Porque esto es más backend jajaja
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
}
Como no explican como crear la conexión con Robo 3T.
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.
A los que les sale error de autenticación, aquí la solución:
const mongoUrl= mongodb://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}
Quitenle el db name
mil gracias
La clase ObjectID esta deprecada, solo cambien a ObjectId por si quieren usar la actual
Conexión con mongoClient()
No es necesario instalar nada en el PC, la librería de mongoDB
Revolers
Buen día, me muestra el error Cannot read property 'collection' of undefined
LLevo unas horas con esto y nose que puede ser
Hola buen día, tengo la siguiente duda.
¿Es posible trabajar GrahpQL con otros SGBD?, por ejemplo MySQL?
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
Se puede usar MongoCompass para lo mismo, solo se tiene que crear el archivo JSON, con los campos e importarlo desde MongoCompass
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();
Creé un poco de código reutilizable en resolver.js, por si les interesa: