Dit komt omdat de code een antipatroon bevat:elke keer dat er een nieuw verzoek binnenkomt, wordt een nieuwe databaseverbinding geopend en wordt die verbinding vervolgens gesloten zodra het antwoord is verzonden. Vervolgens heeft het geprobeerd de gesloten verbinding opnieuw te gebruiken, vandaar de foutmelding die u ziet bij het 2e verzoek.
Wat u wilt, is slechts één keer verbinding maken met de database voor de levensduur van de toepassing met behulp van een globaal verbindingsobject, en vervolgens dat globale object gebruiken om uw databasebewerkingen uit te voeren.
Door dit globale object te gebruiken, kan het MongoDB-stuurprogramma op de juiste manier een verbindingspool met de database maken. Deze pool wordt beheerd door de MongoDB-driver en vermijdt het dure verbindings-/opnieuwverbindingspatroon.
Bijvoorbeeld:
// 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))
})
})
Bewerken om je vraag te beantwoorden in de opmerking:
Dit komt omdat in de originele code, dbClient
globaal werd gedefinieerd. Wanneer dbClient.close()
werd genoemd, de globale dbClient
was gesloten. Er werd toen een fout geproduceerd toen die dbClient
voorwerp is hergebruikt. Dit komt omdat connect()
creëert een verbindingspool in plaats van een enkele verbinding, en er werd niet verwacht dat deze meerdere keren per aanroep zou worden aangeroepen.
Als u de dbClient
. verplaatst variabele van het globale bereik naar de app.get()
context, zult u zien dat er geen fout wordt geproduceerd wanneer u het HTTP-eindpunt meerdere keren aanroept, als een nieuwe dbClient
object is elke keer gemaakt.
Dat gezegd hebbende, hoewel het zal werken, is dit geen aanbevolen patroon. Het is beter om een patroon te gebruiken dat lijkt op de voorbeeldcode die ik hierboven heb gepost.