sql >> Database teknologi >  >> NoSQL >> MongoDB

Topologi blev ødelagt ved brug af MongoDB med native driver og Express.js

Dette skyldes, at koden indeholder et anti-mønster:hver gang en ny anmodning kommer ind, åbner den en ny databaseforbindelse og lukker derefter forbindelsen, når svaret blev sendt. Det forsøgte efterfølgende at genbruge den lukkede forbindelse, deraf fejlmeddelelsen, du ser på den 2. anmodning.

Det, du ønsker, er kun at oprette forbindelse én gang til databasen i hele programmets levetid ved hjælp af et globalt forbindelsesobjekt, og derefter bruge det globale objekt til at udføre dine databasehandlinger.

Ved at bruge dette globale objekt kan MongoDB-driveren oprette en forbindelsespulje til databasen korrekt. Denne pulje administreres af MongoDB-driveren og undgår det dyre tilslutnings-/gentilslutningsmønster.

For eksempel:

// listen on this port
const port = 3000

// global database client object
var client = null

// listen on the configured port once database connection is established
MongoClient.connect('mongodb://localhost:27017', { useNewUrlParser: true }, (err, res) => {
  assert.equal(null, err)
  client = res
  app.listen(port, () => console.log(`Example app listening on port ${port}!`))
})

// use the client global object for database operations
app.get('/', (req, res) => {
  db = req.query.db
  col = req.query.col
  client.db(db).collection(col).find({}).toArray((err, docs) => {
    assert.equal(null, err)
    res.send(JSON.stringify(docs))
  })
})

Rediger for at besvare dit spørgsmål i kommentaren:

Dette skyldes, at i den originale kode, dbClient var globalt defineret. Når dbClient.close() blev kaldt, den globale dbClient blev lukket. Der opstod en fejl, da den dbClient objekt blev genbrugt. Dette er fordi connect() opretter en forbindelsespulje i stedet for en enkelt forbindelse og forventedes ikke at blive kaldt flere gange pr. opkald.

Hvis du flytter dbClient variabel fra det globale omfang til app.get() kontekst, vil du opdage, at der ikke opstår nogen fejl, når du kalder HTTP-slutpunktet flere gange, som en ny dbClient objekt blev oprettet hver gang.

Når det er sagt, selvom det vil virke, er dette ikke et anbefalet mønster. Det er bedre at bruge et mønster, der ligner den eksempelkode, jeg har lagt op ovenfor.



  1. Aggregationsfilter efter $lookup

  2. mongomapper geospatial 'inden for' forespørgsel

  3. Forespørgsel på resultat fra mongoose ved hjælp af dynamisk model.find

  4. Kan strenge JSON $dates bruges i en MongoDB-forespørgsel?