MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Topologi dihancurkan saat menggunakan MongoDB dengan driver asli dan Express.js

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MEAN Stack:Bagaimana cara memperbarui hasil fungsi ke database?

  2. Bagaimana cara mengambil nilai dari mongoDB, dengan nama kuncinya?

  3. Bagaimana cara saya melakukan kueri NOT IN di Mongo?

  4. Luwak findOneAndUpdate Memperbarui Beberapa Bidang

  5. MongoDB $lookup Objectid mendapatkan array kosong?