【发布时间】:2020-02-23 15:25:26
【问题描述】:
我在我的 Node.js 项目中使用 "mongoose": "^5.7.1"。我正在制作一个涉及更新两个文档的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 上使用
请提出一些建议。
【问题讨论】:
-
我也开始看到这些错误。我在 Heroku 上使用 Mlab。但是在客户端上添加选项解决了这个问题。我刚刚尝试了 URI 版本,它也可以正常工作。奇怪。
-
我使用的是独立服务器,这导致了这个错误。最初的错误不是实际的,后面的错误可以通过副本集或共享集群来解决。见npmjs.com/package/run-rs