MongoError: Bu MongoDB dağıtımı, yeniden yazılabilir yazma işlemlerini desteklemez. Lütfen bağlantı dizenize retryWrites = false ekleyin


11

"mongoose": "^5.7.1"Node.js projemde kullanıyorum . Ben iki belgede güncelleme içeren bir api yapıyorum. Yani, aşağıdaki gibi işlemleri kullanıyorum:

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

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

// Commit the transaction
session.commitTransaction()

Bu API'yi yerel ortamımda vurduğumda, aşağıdaki hatayı alıyorum:

MongoError: Bu MongoDB dağıtımı, yeniden yazılabilir yazma işlemlerini desteklemez. Lütfen bağlantı dizenize retryWrites = false ekleyin.

Bu api'yi uzak ortamda vurduğumda iyi çalışıyor. Veritabanı bulutu olarak https://www.clever-cloud.com ve api bulutu olarak AWS kullanıyorum .

Hata mesajında ​​yazıldığı gibi, retryWrites=false

  • Firavun faresine geçen bağlantı dizesinin sonunda mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
  • yönteme retryWrites: falseiletilen seçeneklerle mongoose.connect.
mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
    retryWrites: false
  }, (err) => {...})

Yukarıdakilerin hiçbiri sorunu çözmedi.

mongo --versionKomutun çıktısı aşağıdadır :

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

Hata ayıklama ve bu hatayı atma arkasındaki gerçek hatayı bulmak:

MongoError: İşlem numaralarına yalnızca çoğaltma kümesi üyesinde veya mongosta izin verilir

Lütfen bir şey önerin.


Bu hataları da görmeye başladım. Mlab'ı Heroku'da kullanıyorum. Ancak istemciye seçenek eklemek bunu çözdü. Ben sadece URI sürümünü denedim ve o da çalışıyor. Garip.
Mig

Bağımsız bir sunucu kullanıyorum ve bu hataya neden oluyor. İlk hata gerçek değildi ve sonraki hata çoğaltma kümesi veya paylaşılan kümelerle çözülebilir. Bkz. Npmjs.com/package/run-rs
Andro Developer

Yanıtlar:


2

İşlemler şüphesiz MongoDB 4.0'daki en heyecan verici yeni özellik. Ancak ne yazık ki, MongoDB'yi yüklemek ve çalıştırmak için kullanılan çoğu araç, çoğaltma kümesinin aksine bağımsız bir sunucu başlatır. Tek başına bir sunucuda bir oturum başlatmaya çalışırsanız, bu hatayı alırsınız.

Bu sorun, yerel ortamınızdaki çoğaltma kümeleri kullanılarak çözülebilir .

Bu amaçla run-r kullandım .


2

Kabul edilen yanıtta önerildiği gibi, bağımsız sunucunun aksine işlemleri gerçekleştirebilmek için yerel sunucunuzun bir çoğaltma kümesi olarak çalıştırılması gerekir.

Bununla birlikte, önerilen çözüme ek olarak, MongoDB belgelerinde aşağıdaki gibi özetlenen talimatları izleyerek , Bağımsız yerel db'nizi herhangi bir üçüncü taraf aracı kullanmadan kolayca bir Çoğaltma Setine dönüştürebilirsiniz :

  1. Bağımsız mongod örneğinizi durdurun ve bağımsız replSetdeğişkenle yeniden başlatın .
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
  1. Örneğinize bir mongokabuk kullanarak bağlanın ve yeni Çoğaltma Kümesini başlatın .
rs.initiate()

Şimdi, bir kerede birden çok belgeyi güncellemek için yerel ortamınızda işlem yapabileceğiniz Tek Başına mongodb sunucusu yerine bir Çoğaltma Setiniz olmalıdır!

replSetSunucuyu her başlatmak istediğinizde bağımsız değişkeni eklemeyi unutmayın , aksi takdirde bağımsız olarak başlatılır. Ben sadece tekrar çalıştırmak için adım 1 ile aynı komutu kullanın.


Alternatif olarak, MongoDB belgelerindeki diğer talimatları izleyerek test ortamı için sıfırdan yeni bir Çoğaltma Seti dağıtabilirsiniz .


1

Lütfen App/Config/databasedosyayı 'retryWrites'=>falsedüzenleyin Mongodb Bağlantı Dizesine Ekle

Mongo db bağlantısı yaz

'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
            ]
        ],

Kaydet ve Çalıştır


1

Lütfen &retryWrites=falsebağlantı dizenize eklemeyi deneyin

-

Aslında yerel olarak çalışıyordu iken, uzak db sunucumuza bağlanırken OP belirtilen hataları aldım. Hatada olan öneriyi denemeden önce mongo tarafından barındırılan destekle iletişime geçtim.

-

Barındırılan mongo sitemiz (mLab) şöyle dedi:

Muhtemelen uygulamanızın sürücüsü yalnızca WiredTiger özelliğini kullanmaya çalışan daha yeni bir sürüme güncellenmiştir. Hatadan bahsedildiği gibi, bağlantı dizenize & retryWrites = false eklemeniz gerekir.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.