Du kan använda en global variabel för att hålla anslutningen (t.ex. db
), till exempel:
var db = null // global variable to hold the connection
MongoClient.connect('mongodb://localhost:27017/', function(err, client) {
if(err) { console.error(err) }
db = client.db('test') // once connected, assign the connection to the global variable
})
app.get('/', function(req, res) {
db.collection('test').find({}).toArray(function(err, docs) {
if(err) { console.error(err) }
res.send(JSON.stringify(docs))
})
})
Eller, om du föredrar det, kan du också använda Promise-objektet som returneras av MongoClient
om det anropas utan ett callback-argument:
var conn = MongoClient.connect('mongodb://localhost:27017/') // returns a Promise
app.get('/', function(req, res) {
conn.then(client=> client.db('test').collection('test').find({}).toArray(function(err, docs) {
if(err) { console.error(err) }
res.send(JSON.stringify(docs))
}))
})
Observera att jag använde ES6 fettpilfunktionsdefinitionen i det andra exemplet.
Du har helt rätt i att du inte ska ringa MongoClient
varje gång. Genom att använda en global variabel eller Promises kan MongoDB node.js-drivrutinen skapa en anslutningspool, som uppnår minst två bra saker:
- Anslutningar återanvänds i en pool, så det finns ingen dyrbar installations-/nedbrytningsprocess under hela programmets livstid. Du ansluter en gång och låter föraren ta hand om resten åt dig.
- Du kan kontrollera mängden anslutning som din applikation gör till databasen genom att begränsa storleken på anslutningspoolen.
Redigera 2018-08-24 :MongoClient.connect()
metod i node.js drivrutinsversion 3.0 och nyare returnerar ett klientobjekt istället för ett databasobjekt. Exemplen ovan har modifierats för att hålla den uppdaterad med den senaste drivrutinsversionen av node.js.