Bienvenido a la Comunidad de Treehouse

¿Quieres colaborar en errores de código? ¿Tienes errores que necesitan comentarios? ¿Buscas un par de ojos adicionales en tu último proyecto? aquí.

¿Buscas aprender algo nuevo?

Treehouse ofrece una prueba gratuita de siete días para estudiantes nuevos. Obtén acceso a miles de horas de contenido y únete a miles de

Inicia tu prueba gratuita

Bases de Datos

Killeon Patterson
Killeon Patterson
18,528 Puntos

Accediendo a mi base de datos MongoDB

Hola,

import { MongoClient, ServerApiVersion } from mongodb;

const URI = process.env.ATLAS_URI || Espero que esto le ahorre mucho tiempo a algunas personas si se quedan atrapadas...;
const client = new MongoClient(URI, {
  serverApi: {
    actualiza: ServerApiVersion.v1,
    strict: verdadero,
    deprecationErrors: verdadero,
  },
});

try {
  // Conecta el cliente al servidor
  await client.connect();
  // Envía un ping para confirmar una conexión exitosa
  await client.db(admin).command({ ping: 1 });
  console.log(¡Hiciste ping a tu implementación. ¡Te conectaste exitosamente a MongoDB!);
} catch (err) {
  console.error(err);
}

console.log(db);
let db = client.db(test);


export default db;

Me estoy conectando exitosamente a MongoDB, pero no a mis colecciones. El nombre de la base de datos es "test" y el nombre de la colección es "menus". ¿Cómo puedo acceder a las colecciones en mi MongoDB?

4 respuestas

Hola Killeon Patterson 👋

Gracias por proporcionar un enlace a tu repositorio, definitivamente eso da más información sobre cómo están configuradas las cosas.

Comencemos con el problema del backend

Cuando dices "no hay colección", ¿qué quieres decir exactamente? ¿Qué está registrando la declaración console.log que añadiste de tu lado? ¿Está registrando algo como undefined? ¿O es un Collection objeto? Si es lo último y tu base de datos está configurada correctamente (los nombres de la base de datos y la colección coinciden) deberías estar bien.

Sin embargo, hay un par de problemas en tu backend que pueden causar tus problemas

Primero que nada en la línea 23/26 debido connection.js estás exportando la colección en lugar del objeto de base de datos. Dado que actualmente estás intentando acceder a colecciones específicas en tus rutas, lo más fácil sería simplemente devolver el objeto db en su lugar. De esta manera también podrás acceder a otras colecciones a través de db en el futuro en lugar de crear y exportar otra colección.

// let db = client.db("test").collection("menus");

let db = client.db(test)

Luego en tu routes/record.js archivo hay un problema de sintaxis en la línea 17 ya que actualmente estás pasando un argumento al método find. En su lugar, querrás no pasar argumentos y llamar a toArray() en lo que se devuelve desde find:

// let results = await collection.find({}.toArray());
let resultados = await collection.find().toArray();

Después de esos dos cambios deberías poder ver los resultados al visitar http://localhost:5050/record

Lo que me lleva al código del lado del cliente.

Como sugerí en mi último comentario, aquí no hay /menu endpoint disponible en tu API. Como no hay nada que encontrar en localhost:5050/menu obtendrás una respuesta 404.

Con la forma en que tu API está actualmente configurada en la línea 10 de tu server.js archivo estás configurando el records router para que esté en la /record ruta. Querrás ajustar esto a /menu o ajustar el endpoint que estás intentando obtener en la línea 49 de tu RecordList componente para que coincida con la ruta: http://localhost:5050/record/

Después de este cambio deberías obtener un error occurred: OK mensaje registrado en la consola. Esto es por la forma en que tu condicional está configurado con !response.ok. Al usar Axios no hay ok propiedad disponible, así que querrás ajustar ese condicional para que sea algo como response.status !== 200 en su lugar.

¡Espero que esto te ayude a seguir adelante! 😄

Hola Killeon Patterson 👋

Puedes acceder a tus colecciones usando collection method que está disponible en el db objeto.

const menus = db.collection('menus');

¡Espero que esto te ayude!

Killeon Patterson
Killeon Patterson
18,528 Puntos

Hola, Gracias por tu respuesta. Obtengo una conexión exitosa a Mongo, pero aún no tengo acceso a las colecciones. Intenté hacer console.log de la información y parece tener todas las demás piezas de información que no son la colección. Obtengo mensajes 404 para mis llamadas axios al servidor para los recursos.

export default función RecordList() {
  const [menus, setRecords] = useState([]);

  // Este método obtiene los registros de la base de datos.
  useEffect(() => {
    async función getRecords() {
      const response = await axios.get('http://localhost:5050/menu/')
      if (!response.ok) {
        const message = `Ocurrió un error: ${response.statusText}`;
        console.error(message);
        return;
      }
      const menus = await response.json();
      setRecords(menus);
    }
    getRecords();
    return;
  }, [menus.longitud]);

  // Este método eliminará un registro
  async función deleteRecord(id) {
    await axios.get(`http://localhost:5050/menus/${id}`, {
      method: DELETE,
    });
    const registrosNuevos = menus.filtro((el) => el._id !== id);
    setRecords(registrosNuevos);
  }

  // Este método mapeará los registros en la tabla
  función listaDeRegistros() {
    return menus.map((menú) => {
      return (
        <Registro
          menú={menú}
          deleteRecord={() => deleteRecord(menú._id)}
          clave={menú._id}
        />
      );
    });
  }

¿Tienes alguna sugerencia? Gracias

Hola Killeon Patterson,

Es difícil saber qué está sucediendo solo viendo estos dos fragmentos y necesitaría más información/contexto para estar seguro de qué está causando estos problemas. ¿Estás recibiendo algún error al intentar acceder a la colección? ¿Cómo intentas recuperar los datos después de la línea que sugerí arriba? Encontré una página sobre Recuperación de datos en la documentación de MongoDB que podría ser útil.

En cuanto al 404 en el frontend, parece que la /menu ruta no existe en tu API. ¿Cómo está configurada esta ruta?

Killeon Patterson
Killeon Patterson
18,528 Puntos

Hola Richard,

Este es el GitHub del proyecto "https://github.com/Kilosince/updateohstore/tree/main" (eliminé mi mongostring de ATLAS_URI)

Creo que el problema subyacente es el mensaje 404 que estoy recibiendo de la ruta en las líneas 49 y 64.

Para contexto, hice un proyecto hace un tiempo, aparentemente antes de que muchos paquetes y otras dependencias se volvieran obsoletos. Así que estoy intentando rehacer este proyecto "https://github.com/Kilosince/PointOfSale/tree/master" con procesos más nuevos. Por ejemplo, no había trabajado previamente con vite.

MongoDB es la misma que he estado usando durante algún tiempo. He ejecutado console.log(client.db("test").collection("menus")). La conexión se establece pero no veo ninguna colección. Gracias por tu tiempo.