mongodb - MongoError:此 MongoDB 部署不支持可重试写入。请将 retryWrites=false 添加到您的连接字符串
问题描述
我"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:此 MongoDB 部署不支持可重试写入。请将 retryWrites=false 添加到您的连接字符串中。
当我在远程环境中点击这个 api 时,它运行良好。我使用https://www.clever-cloud.com作为数据库云,使用 AWS 作为 api 云。
正如错误消息中所写,我试图把retryWrites=false
- 在我传递给猫鼬的连接字符串的末尾
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:事务号仅允许在副本集成员或 mongos 上
请提出一些建议。
解决方案
正如接受的答案中所建议的那样,您需要将本地服务器作为副本集运行才能执行事务,而不是独立服务器。
但是,除了建议的解决方案之外,您还可以按照MongoDB 文档中的说明轻松将独立本地数据库转换为副本集,而无需使用任何第三方工具,总结如下:
- 停止您的独立 mongod 实例,并使用
replSet
参数重新启动它。
mongod --port 27017 --dbpath /srv/mongodb/db0 --replSet rs0 --bind_ip localhost
- 使用 shell 连接到您的实例
mongo
,并启动新的副本集。
rs.initiate()
现在你应该有一个副本集而不是一个独立的 mongodb 服务器,你可以在本地环境中执行事务以一次更新多个文档!
replSet
每次要启动服务器时不要忘记包含参数,否则它将作为独立启动。我只是使用与步骤 1 中相同的命令再次运行它。
或者,您可以按照MongoDB 文档中的其他说明从头开始部署新的副本集以用于测试环境。
推荐阅读
- sql - 1 年内 2 周内按星期几的总计
- printing - 在while循环后打印语句不打印
- java - ArrayIndexOutOfBoundsException: 0 在 Karatsuba 实现中
- python - 尝试使用 csv 文件提供的信息从另一个数据帧创建新数据帧
- google-api - 谷歌云语音 API。帮助让 Google 自己的示例发挥作用
- python - 请求没有内容长度
- javascript - 以跨平台方式处理 React/React-Native 中的文本输入事件?(e.target.value 与 e.nativeTarget.text)
- python - 显示股价上下波动概率的熊猫系列函数
- python - 将两个字典合并到Python中的字典字典中
- swift - 滑动到下一张图片时,PageControl 没有动画