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.