mongodb - MongoError : This MongoDB deployment does not support retryable writes. 请在您的连接字符串中添加 retryWrites=false

标签 mongodb mongoose

我正在使用 "mongoose": "^5.7.1"在我的 Node.js 项目中。我正在制作一个涉及更新两个文档的 api。所以,我正在使用如下交易:

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

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

// Commit the transaction
session.commitTransaction()

当我在本地环境中点击此 api 时,出现以下错误:

MongoError: This MongoDB deployment does not support retryable writes. Please add retryWrites=false to your connection string.



当我在远程环境中点击这个 api 时,它运行良好。我正在使用 https://www.clever-cloud.com作为数据库云和 AWS 作为 api 云。

正如错误消息中所写,我试图把 retryWrites=false
  • 在我传递给 Mongoose 的连接字符串的末尾 mongodb://${ip}:${port}/${this.MONGO_DATABASE}?retryWrites=false
  • 选项为 retryWrites: false传递给 mongoose.connect方法。
  • mongoose.connect(`mongodb://${ip}:${port}/${this.MONGO_DATABASE}`, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
        useCreateIndex: true,
        retryWrites: false
      }, (err) => {...})
    

    以上都没有解决问题。

    以下是 mongo --version 的输出命令:
    db version v4.0.13
    git version: bda366f0b0e432ca143bc41da54d8732bd8d03c0
    allocator: system
    modules: none
    build environment:
        distarch: x86_64
        target_arch: x86_64
    

    我已经调试并发现抛出此错误背后的实际错误是:

    MongoError: Transaction numbers are only allowed on a replica set member or mongos



    请提出一些建议。

    最佳答案

    正如接受的答案中所建议的那样,您需要将本地服务器作为副本集运行才能执行事务,而不是独立服务器。

    但是,除了建议的解决方案之外,您还可以轻松地将独立本地数据库转换为副本集 不使用任何第三方工具 , 按照 MongoDB documentation 中的说明进行操作,总结如下:

  • 停止您的独立 mongod 实例,并使用 replSet 重新启动它争论。
  • mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
    
  • 使用 mongo 连接到您的实例shell,并启动新的副本集。
  • rs.initiate()
    

    现在你应该有一个副本集而不是一个独立的 mongodb 服务器,你可以在本地环境中执行事务以一次更新多个文档!

    别忘了包括 replSet每次要启动服务器时都有参数,否则它将作为独立启动。我只是使用与步骤 1 中相同的命令再次运行它。

    或者,您可以按照 MongoDB documentation. 中的其他说明从头开始部署新的副本集以用于测试环境。

    关于mongodb - MongoError : This MongoDB deployment does not support retryable writes. 请在您的连接字符串中添加 retryWrites=false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58589631/

    相关文章:

    mongodb - Mongo 按数组中的匹配计数排序

    node.js - Mongoose elemMatch 返回一个空数组

    javascript - 这个错误说明了什么?类型 'ParsedQs' 不可分配给类型 'string'

    node.js - 如何避免在 Mongoose 中多次查找同一文档?

    node.js - Mongoose 中的唯一索引不起作用

    node.js - 在 NodeJs 中处理 Mongodb 全局连接的最佳方法是什么

    node.js - Array.push 似乎不适用于 MongoDB

    javascript - MongoDB 使用排序和切片更新嵌套数组,不排序 desc

    javascript - 模型之间的 Mongoose 关系

    java - MongoDb 多重排序