sql >> Databasteknik >  >> NoSQL >> MongoDB

Topologi förstördes när MongoDB användes med inbyggd drivrutin och Express.js

Detta beror på att koden innehåller ett antimönster:varje gång en ny begäran kommer in öppnar den en ny databasanslutning och stänger den anslutningen när svaret skickades. Den försökte sedan återanvända den stängda anslutningen, därav felmeddelandet som du ser på den andra begäran.

Vad du vill är att bara ansluta en gång till databasen under programmets livstid med hjälp av ett globalt anslutningsobjekt, och sedan använda det globala objektet för att utföra dina databasoperationer.

Genom att använda detta globala objekt kan MongoDB-drivrutinen skapa en anslutningspool till databasen. Denna pool hanteras av MongoDB-drivrutinen och undviker det dyra anslutnings-/återanslutningsmönstret.

Till exempel:

// 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))
  })
})

Redigera för att svara på din fråga i kommentaren:

Detta beror på att i den ursprungliga koden, dbClient var globalt definierad. När dbClient.close() kallades, den globala dbClient stängdes. Ett fel uppstod då den dbClient föremålet återanvändes. Detta beror på att connect() skapar en anslutningspool istället för en enda anslutning och förväntades inte anropas flera gånger per anrop.

Om du flyttar dbClient variabel från det globala omfattningen till app.get() sammanhang kommer du att upptäcka att inget fel kommer att uppstå när du anropar HTTP-slutpunkten flera gånger, som en ny dbClient objekt skapades varje gång.

Med det sagt, även om det kommer att fungera, är detta inte ett rekommenderat mönster. Det är bättre att använda ett mönster som liknar exempelkoden jag postade ovan.



  1. Django serialisering till JSON-fel:'MetaDict'-objektet har inget attribut 'concrete_model'

  2. Hur använder man oordnad bulkinfogning med Mongoskin?

  3. Mongodb och MAMP

  4. infoga Många Hantera Duplicate Errors