MongoError: Ini penyebaran MongoDB tidak mendukung menulis retryable. Silakan tambahkan retryWrites = false ke string koneksi Anda

10

Saya menggunakan "mongoose": "^5.7.1"dalam proyek Node.js saya. Saya membuat api yang melibatkan pembaruan dalam dua dokumen. Jadi, saya menggunakan transaksi seperti berikut:

// Start the transaction
session = await mongoose.startSession()
session.startTransaction()

await Promise.all([
   <1st update operation>,
   <2nd update operation>
])

// Commit the transaction
session.commitTransaction()

Ketika saya menyalakan api ini di lingkungan lokal saya, saya mendapatkan kesalahan berikut:

MongoError: Ini penyebaran MongoDB tidak mendukung menulis retryable. Silakan tambahkan retryWrites = false ke string koneksi Anda.

Ketika saya menyalakan api ini di lingkungan yang jauh, maka itu berjalan dengan baik. Saya menggunakan https://www.clever-cloud.com sebagai database cloud dan AWS sebagai api cloud.

Seperti yang tertulis dalam pesan kesalahan, saya telah mencoba untuk menempatkan retryWrites=false

  • pada akhir string koneksi yang saya lewati untuk luoose mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
  • dengan opsi yang retryWrites: falsediteruskan ke mongoose.connectmetode.
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    retryWrites: false
  }, (err) => {...})

Tidak satu pun di atas yang menyelesaikan masalah.

Di bawah ini adalah output dari mongo --versionperintah:

db version v4.0.13
git version: bda366f0b0e432ca143bc41da54d8732bd8d03c0
allocator: system
modules: none
build environment:
    distarch: x86_64
    target_arch: x86_64

Saya telah men-debug dan menemukan kesalahan aktual di balik melempar kesalahan ini adalah:

MongoError: Nomor transaksi hanya diperbolehkan pada set anggota replika atau mongo

Tolong sarankan sesuatu.

Pengembang Andro
sumber
Saya mulai melihat kesalahan ini juga. Saya menggunakan Mlab di Heroku. Tetapi menambahkan opsi pada klien memecahkan ini. Saya baru saja mencoba versi URI dan berfungsi juga. Aneh.
Mig
Saya menggunakan server mandiri dan itulah yang menyebabkan kesalahan ini. Kesalahan awal bukan yang sebenarnya dan yang kemudian bisa diselesaikan dengan cluster set replika atau bersama. Lihat npmjs.com/package/run-rs
Pengembang Andro

Jawaban:

2

Transaksi tidak diragukan lagi fitur baru yang paling menarik di MongoDB 4.0. Namun sayangnya, sebagian besar alat untuk menginstal dan menjalankan MongoDB memulai server mandiri sebagai lawan dari set replika. Jika Anda mencoba memulai sesi pada server mandiri, Anda akan mendapatkan kesalahan ini.

Masalah ini dapat diatasi dengan menggunakan set replika di lingkungan lokal Anda.

Saya telah menggunakan run-rs untuk tujuan ini.

Pengembang Andro
sumber
2

Seperti yang disarankan dalam jawaban yang diterima, Anda harus memiliki server lokal Anda untuk dijalankan sebagai set replika untuk dapat melakukan transaksi, sebagai lawan dari server mandiri.

Namun, di samping solusi yang diusulkan, Anda dapat dengan mudah mengkonversi db lokal Standalone Anda ke Set Replika tanpa menggunakan alat pihak ketiga , dengan mengikuti petunjuk dalam dokumentasi MongoDB , diringkas sebagai berikut:

  1. Hentikan instance mongod mandiri Anda, dan mulai kembali dengan replSetargumen.
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
  1. Sambungkan ke instance Anda dengan sebuah mongoshell, dan jalankan Set Replika yang baru.
rs.initiate()

Sekarang Anda harus memiliki Set Replika alih-alih server mongodb mandiri, di mana Anda dapat melakukan transaksi di lingkungan lokal Anda untuk memperbarui beberapa dokumen sekaligus!

Jangan lupa untuk memasukkan replSetargumen setiap kali Anda ingin memulai server, jika tidak maka akan dimulai sebagai Standalone. Saya cukup menggunakan perintah yang sama seperti pada langkah 1 untuk menjalankannya lagi.


Atau, Anda dapat menggunakan Set Replika baru dari awal untuk lingkungan pengujian mengikuti instruksi lain ini dalam dokumentasi MongoDB.

gasbi
sumber
0

Harap Edit App/Config/databasefile Tambahkan 'retryWrites'=>falsedalam String Koneksi Mongodb

tulis koneksi Mongo db

'mongodb' => [
            'driver'   => 'mongodb',
            'host'     => env('MONGO_DB_HOST', 'lo*****'),
            'port'     => *****,
            'database' => env('MONGO_DB_DATABASE'),
            'username' => env('MONGO_DB_USERNAME'),
            'password' => env('MONGO_DB_PASSWORD'),
            'options'  => [
                'database'=> env('MONGO_DB_DATABASE'),
                'retryWrites'=>false
            ]
        ],

Simpan dan Jalankan

Arshit
sumber
0

Silakan coba tambahkan &retryWrites=falseke string koneksi Anda

-

Saya benar-benar mendapatkan kesalahan yang disebutkan dalam OP ketika menghubungkan ke server db jarak jauh kami, padahal itu bekerja secara lokal. Saya menghubungi dukungan mongo-host kami sebelum mencoba saran yang ada dalam kesalahan.

-

Ini adalah apa yang dikatakan situs mongo yang dihosting (mLab) kami:

Kemungkinan driver aplikasi Anda diperbarui ke versi yang lebih baru yang mencoba menggunakan fitur WiredTiger saja. Ketika kesalahan menyebutkan, Anda harus menambahkan & coba lagi = palsu ke string koneksi Anda.

https://docs.mlab.com/faq/#why-am-i-getting-the-transaction-number-are-only-allowed-on-storage-engines-that-support-document-level-locking-error

keris
sumber