Ini karena kode berisi anti-pola:setiap kali permintaan baru masuk, itu membuka koneksi database baru, lalu menutup koneksi itu setelah respons dikirim. Kemudian kemudian mencoba menggunakan kembali koneksi yang ditutup, maka pesan kesalahan yang Anda lihat pada permintaan ke-2.
Yang Anda inginkan adalah menyambungkan hanya sekali ke database selama masa pakai aplikasi menggunakan objek koneksi global, kemudian menggunakan objek global tersebut untuk melakukan operasi database Anda.
Menggunakan objek global ini memungkinkan driver MongoDB membuat kumpulan koneksi ke database dengan benar. Kumpulan ini dikelola oleh driver MongoDB, dan menghindari pola connect/reconnect yang mahal.
Misalnya:
// 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))
})
})
Sunting untuk menjawab pertanyaan Anda di komentar:
Ini karena dalam kode aslinya, dbClient
didefinisikan secara global. Ketika dbClient.close()
disebut, dbClient
global ditutup. Kemudian terjadi kesalahan saat dbClient
objek digunakan kembali. Ini karena connect()
membuat kumpulan koneksi alih-alih koneksi tunggal, dan tidak diharapkan dipanggil beberapa kali per permintaan.
Jika Anda memindahkan dbClient
variabel dari lingkup global ke dalam app.get()
konteks, Anda akan menemukan bahwa tidak ada kesalahan yang akan dihasilkan saat Anda memanggil titik akhir HTTP beberapa kali, sebagai dbClient
baru objek dibuat setiap saat.
Karena itu, meskipun akan berhasil, ini bukan pola yang disarankan. Sebaiknya gunakan pola yang mirip dengan contoh kode yang saya posting di atas.