Estoy tratando de construir un servidor express.
En el archivo app.js , creo el servidor e intento conectarme a mi mongodb.
import express from "express"; import dbo from "./db/conn.js"; const app = express(); app.listen(PORT, async () => { await dbo.connectToDatabase(); log.info(`Server is running on port: ${PORT}`); }); En el archivo conn.js
const client = new MongoClient(uri); let db: Db; export async function connectToDatabase() { try { await client.connect(); db = client.db(dbName); await db.command({ ping: 1 }); log.info(`Successfully connected to database: ${db.databaseName}.`); } finally { await client.close(); } } export async function getDb() { return db; } export default { connectToDatabase, getDb }; Y ahora en un archivo separado, quiero usar la conexión de la base de datos que creé en el archivo app.js
como esto:
const collection = getDb().collection(collectionName); // insert documents in collection. pero cuando intento ejecutar la aplicación, aparece el error TypeError: Cannot read properties of undefined .
Entonces, ¿hay alguna forma de esperar hasta que se establezca la conexión db?
Hay algunos problemas con su código.
Primero, la función getDb devuelve promesa. Por lo tanto, no puede usar el método de recopilación de inmediato. Elimine la palabra clave async porque la función getDb actual no es una función asíncrona.
export function getDb() { return db; } En segundo lugar, en la declaración de prueba y finalmente, el bloque finalmente se ejecuta incondicionalmente, independientemente de si se produce una excepción en el código. Por lo tanto, después de mostrar el registro de éxito de la conexión en connectToDatabase , la conexión se cierra inmediatamente. Para insertar los datos, la conexión debe estar conectada, así que borre el await client.close(); código en bloque finalmente desde connectToDatabase .
Luego puede agregar un documento a la colección sin ningún problema.
Una forma de lograr lo que está tratando de hacer es pasar esa conexión a una clase o función que defina en otro lugar.
Digamos que este es su código de colección (o lo que sea, incluso fuera de una colección que necesita una instancia de conexión de base de datos sin procesar para poder usarla):
class Collection { constructor(db) { this.db = db //do whatever else needs to be setup } use(name) { //or use it here this.db.use(name) } } export default CollectionLuego, en su archivo principal, algo de código:
import Collection from './Collection.js' const collection = new Collection(getDb) collection.use('some arbitrary name')Esta es solo una forma de hacerlo, pero también hay otras formas. Además, si esto es lo único que usa su método getDb() anterior, puede eliminarlo de su principal y ponerlo aquí como administrador.