reactjs - Error de conexión MongoDB NextJS "se intentó extraer una conexión de un grupo de conexiones cerrado"
Estoy intentando establecer una conexión con mi base de datos MongoDB para recuperar algunos datos.
Cuando estoy configurando la conexión sin obtener nada, no hay problemas. Pero cuando intento obtener algunos datos, la consola me muestra esto:
attempted to check out a connection from closed connection poolTenga en cuenta que la conexión aún devuelve true (vea el código abajo)
Lo que hace
Un error de consola. El cliente registra un {} (el registro está dentro de un hook useEffect)
lo que debería hacer
Devolver datos obtenidos de la base de datos
iniciar mongodb
const { MongoClient } = require('mongodb');
export function getClient() {
let client
let clientPromise
// Local setup
if (!process.env.MONGODB_URI) throw new Error("Invalid/missing database key")
const uri = process.env.MONGODB_URI
const options = {}
client = new MongoClient(uri, options)
clientPromise = client.connect()
console.log("connected to development database")
return clientPromise
}
obtenerPropsDelLadoDelServidor
export async function getServerSideProps(context: any) {
try {
const client = await getClient()
const db = await client.db("db-name")
const post = db
.collection("articles")
.find({"type": "nouvelle"},
{projection: { "_id": 0, "title": 1, "titleSlug": 1, "type": 1, "imageUrl": 1, "author": 1 }})
.sort({ $natural: -1 })
.limit(2)
.toArray()
await client.close()
return {
props: { isConnected: true, post: JSON.parse(JSON.stringify(post)) },
}
} catch (e) {
console.error(e)
return {
props: { isConnected: false, post: null },
}
}
}
Dependencias
{
"@types/node": "18.15.9",
"@types/react": "18.0.29",
"@types/react-dom": "18.0.11",
"eslint": "8.36.0",
"eslint-config-next": "13.2.4",
"mongodb": "^5.1.0",
"next": "13.2.4",
"react": "18.2.0",
"react-dom": "18.2.0",
"typescript": "5.0.2"
}
Respuesta #1
Encontré las cosas.
El doble async hizo que todo se estrellara.
Así que si tienes este problema, en lugar de separar punteros como lo hice, prefiere hacer:
const client = await getClient()
const post = await client.db("db-name")
.collection("articles")
.find({"type": "nouvelle"},
{projection: { "_id": 0, "title": 1, "titleSlug": 1, "type": 1, "imageUrl": 1, "author": 1 }})
.sort({ $natural: -1 })
.limit(2)
.toArray()
Respuesta #2
la razón por la que esto está sucediendo es porque estás intentando realizar una acción en la base de datos después de cerrar la conexión, específicamente la línea:
JSON.parse(JSON.stringify(post))
Necesitas mover esto antes de tu
await client.close()
y todo estará bien. La razón es que este es un objeto mongoose y no un objeto javascript simple, que podrías recibir alternativamente usando .lean
const post = db
.collection("articles")
.find({"type": "nouvelle"},
{projection: { "_id": 0, "title": 1, "titleSlug": 1, "type": 1, "imageUrl": 1, "author": 1 }})
.sort({ $natural: -1 })
.limit(2)
.toArray()
.lean()
Estaba teniendo un problema relacionado con un ejecutor de pruebas y las conexiones de MongoDB, que finalmente logré resolver usando:
afterEach(async () => {
// allow time for everything to complete
await new Promise(r => setTimeout(r, 500));
await mongoose.disconnect();
await mongoose.connect(dbUri, { maxPoolSize: 2000 });
});
Quizás esto pueda ayudar a alguien algún día jajaja
