我在Nodejs中安装了MongoDB v4.0
,以获得它最令人惊叹的特性Transaction,并将mongodb
3.1作为驱动程序。
当我尝试使用事务会话时,我遇到了这个错误:
MongoError: Transaction numbers are only allowed on a replica set member or mongos.
那是什么,我怎么才能摆脱它?
我在Nodejs中安装了MongoDB v4.0
,以获得它最令人惊叹的特性Transaction,并将mongodb
3.1作为驱动程序。
当我尝试使用事务会话时,我遇到了这个错误:
MongoError: Transaction numbers are only allowed on a replica set member or mongos.
那是什么,我怎么才能摆脱它?
9条答案
按热度按时间0kjbasz61#
对于那些想要针对停靠的MongoDB示例进行开发的人,下面是基于官方MongoDB停靠器映像的单文件
docker-compose.yaml
解决方案:更简单的解决方案是只使用Bitnami MongoDB image:
d4so4syb2#
为了使用事务,您需要一个MongoDB副本集,在本地启动副本集进行开发是一个复杂的过程。
您可以使用
run-rs npm module
. Zero-configMongoDB运行器,启动一个没有非节点依赖项的副本集,甚至没有MongoDB。或者,您可以简单地在
MongoDB Atlas
中创建一个帐户,它为您提供了一个资源有限的MongoDB集群,以便您可以运行/测试您的应用程序。MongoDB Atlas
pexxcrt23#
在Linux机器上运行MongoDB时,您可以通过编辑服务文件更新连接字符串来使用复制
并使用以下内容更新它
其中
--config "/etc/mongod.conf"
指向MongoDB配置文件,--replSet rs0
告诉它使用名为rs0
的复制然后重新启动
然后通过terminal中的mongod示例启动复制
kr98yfug4#
我已经和这个问题斗争了好几个星期了,现在我把我的结论告诉你,为了能够在分片集群上使用事务,你至少需要在集群上运行MongoDB4.2,如果集群没有分片,我使用了一个库,它有一个子依赖mongodb NodeJS驱动程序。这个来自3.3.x版本的驱动程序在4版本的分片MongoDB集群上失败了。0.4.对我来说,解决方案是将我的集群更新到4. 2版本。
源代码:https://www.bmc.com/blogs/mongodb-transactions/
ymzxtsji5#
适用于
mongo:5.0.5-focal
图像。停靠文件:
脚本/docker-entrypoint.sh。修补程序:
docker-compose.yml:
p1tboqfb6#
Transactions
无疑是MongoDB 4.0
中最令人兴奋的新特性。但不幸的是,大多数安装和运行MongoDB的工具都启动独立服务器,而不是副本集。如果您试图在独立服务器上启动会话,您将收到此错误。为了使用事务,您需要一个MongoDB副本集,并且在本地启动一个副本集以进行开发是一个复杂的过程。新的
run-rs npm module
使启动副本集变得简单。运行run-rs是启动副本集所需要的全部,run-rs甚至会为您安装正确版本的MongoDB
。除了
Node.js
和npm
之外,Run-rs没有外部依赖项。您不需要安装Docker
、homebrew
、APT
、Python
,甚至MongoDB
。使用
npm's -g
标志全局安装run-rs。您也可以在package.json
文件的devDependencies中列出run-rs。接下来,使用--version标志运行run-rs,Run-rs将为您下载MongoDB v4.0.0,不用担心,它不会覆盖您现有的MongoDB安装。
然后在连接字符串中使用**
replicaSet=rs
**。您可以在here中找到有关它的更多详细信息。
eiee3dmh7#
我得到了解决方案,它只是MongoDB配置文件中的三行配置。
在从MongoDB atlas切换并在我的带有WHM的CentOS 7 VPS上安装MongoDB v 4. 4. 0之后,我也面临着这个问题。
run-rs
解决方案对我不起作用,但我设法在没有任何第三方工具的情况下解决了这个问题,具体步骤如下:1.关闭
mongod
。最有效的方法是使用命令
mongo
checkout方法进入MongoDBshell您将无法使用MongoDB服务器。对我来说,关闭过程花费了太长时间,然后我用以下命令杀死了该进程:
如果您终止了
mongod
进程,则可能需要运行mongod --dbpath /var/db --repair
var/db
应该指向您的数据库目录。2.设置复制副本设置配置。
对于replicaSet设置步骤,请 checkout
/etc/mongod.conf
文件,查找replication
值行,并且您应该添加以下行,如下所示:在下一步中使用
replSetName
值。这些设置的示例:
3.添加您的连接字符串URL。
将replSetName的值添加到连接URL
&replicaSet=--YourReplicationSetName--
如果您使用了我们示例中的名称
rs0
,则应该将URL查询replicaSet=rs0
添加到DB连接中4.再次打开mongod
输入以下命令:
systemctl start mongod
5.访问replicaSet数据库
使用命令
mongo
进入MongoDB shell,然后输入命令rs.initiate()
,现在您应该已进入replicaSet数据库。lb3vh1jj8#
使用Docker进行本地开发的可能解决方案
创建停靠文件
构建此停靠文件
运行此创建的映像
使用此URI连接到数据库
wlp8pajw9#
我最近也遇到过同样的问题,因为我连接到的远程Mongo服务器的版本与我的本地开发环境不同。
为了快速解决这个问题,我在连接字符串中添加了以下参数:
?重试写入=假