Esto no es tanto una pregunta, sino más bien una solicitud de consulta. No pude encontrar recursos para verificar la validez de mi método, por lo que me gustaría escuchar la opinión de los expertos de MongoDB.
Estaba jugando con MongoDB y se me ocurrió este método de middleware para pasar el cliente a mis rutas. Tengo este middleware Express:
const addClientToRequest = async (req, _, next) => { const client = new MongoClient(uri); await client.connect(); req.client = client; next(); }; app.use(addClientToRequest);Después de eso, uso req.client en mis rutas para acceder a mi base de datos.
app.get("/:id", async (req, res) => { const client = req.client; const id = req.params.id; try { const data = await client.db("mydb").collection("mycollection").findOne({ id }); if (data) return res.status(200).json(data); } catch (error) { return res .status(500) .json({ message: "Error fetching requested data", error }); } return res.status(404).json({ message: "Requested data cannot be found" }); });¿Cuál sería un problema en este enfoque? ¿Está bien usar el cliente MongoDB de esta manera?
En mi experiencia, siempre hemos definido una utilidad separada para cargar un grupo de conexiones al inicio de la aplicación y luego reutilizamos esas conexiones.
En el enfoque anterior, parece que está creando una nueva conexión para cada solicitud HTTP que se realiza y luego no termina (o) cierra la conexión. Esto puede ser costoso para una aplicación grande.
db.util.js
const { MongoClient } = require("mongodb"); const uri = `mongodb://${process.env.DB_USER}:${process.env.DB_PASSWORD}@localhost:27017/${process.env.DATABASE}?maxPoolSize=2-&w=majority`; const client = new MongoClient(uri); const init = async () => { try { await client.connect(); console.log("Connected"); } catch (error) { console.log(error); } }; const getClient = () => { return client; }; module.exports.init = init; module.exports.getClient = getClient;aplicación.js
//Import modules require("dotenv").config({ path: __dirname + "/.env" }); const express = require("express"); const dogRoutes = require("./routes/dog.routes"); const db = require("./utils/db.util"); // Define PORT for HTTP Server const PORT = 9900; // Initialize Express const app = express(); app.use(express.json()); app.use(dogRoutes); (async () => { await db.init(); app.listen(PORT, (err) => { console.log(`Server is up at localhost ${PORT}`); }); })();Creo que lo que podría hacer es colocar al cliente fuera del middleware, para que no lo vuelva a definir y vuelva a conectarse cada vez que se realiza una solicitud. Para hacerlo, simplemente defínalo y conéctese antes que el middleware, y en el middleware, configure el cliente como req.mongoClient o como quiera llamarlo.
const client = new MongoClient(uri); await client.connect(); // if this is outside of an async function, either use an async function like (async () => {..script..})(), either define a variable isClientReady and set it on true after the promise resolved. const addClientToRequest = (req, _, next) => { req.client = client; next(); }; app.use(addClientToRequest);