猫鼬(或MongoDB)中的TransientTransactionError是什么?

时间:2018-09-03 16:32:33

标签: javascript node.js mongodb mongoose

所以我有两个文件,一个是server.js,另一个是db.js db.js文件使用Mongoose与我的数据库交互,并且我使用server.js从{ {1}}

db.js

我的server.js从db.js : var mongoose = require('mongoose'); mongoose.connect('', { useNewUrlParser: true }) var Schema = mongoose.Schema; module.exports = function () { var db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); return db.once('open', function() { console.log("Connected to DB") var postschema = new Schema({ title: String, intro: String, body: String, author: String, timestamp: { type: Date, default: Date.now } }); var post = mongoose.model('post', postschema); return { newPost(title, intro, body, author) { var newpost = new post({ title: title, intro: intro, body: body, author: author }) }, getPostsAll() { post.find({}, function (err, res) { return (`Error:${err} Posts:${res}`) }) } } }) } 总共调用了三个函数

db.js

我不明白为什么会出现此错误:

var DB = require('./db.js')
var db = DB()
db.getPostsAll()
db.newPost()

对不起,这个问题很愚蠢,但是有人可以告诉我这里发生了什么吗?我在做什么错了?

编辑:我发现了与该问题有关的文章:https://docs.mongodb.com/manual/core/transactions/#retry-transaction但实际上无法弥补任何问题。

编辑2 :发现了问题。它是一个网络问题,因为它说connection error: { MongoNetworkError: connection 4 to black-test-shard-00-01-ewyaf.mongodb.net:27017 closed at TLSSocket.<anonymous> (E:\HTML\black-box\node_modules\mongodb-core\lib\connection\connection.js:276:9) at Object.onceWrapper (events.js:272:13) at TLSSocket.emit (events.js:185:15) at _handle.close (net.js:541:12) at TCP.done [as _onclose] (_tls_wrap.js:379:7) name: 'MongoNetworkError', errorLabels: [ 'TransientTransactionError' ], [Symbol(mongoErrorContextSymbol)]: {} } ,我猜MongoNetworkError指的是数据库方面的临时问题。我通过将我的IP地址列入白名单来解决了这个问题。

16 个答案:

答案 0 :(得分:14)

我有

  'MongoNetworkError',
  errorLabels: [ 'TransientTransactionError' ],
  [Symbol(mongoErrorContextSymbol)]:

我在MongoDB网站中的“ clusters / security / whitelist”后面添加了当前IP到whiteList。

我希望这会有所帮助。 (没有足够的声誉来发表评论)

答案 1 :(得分:5)

  

什么是TransientTransactionError

TransientTransactionError是一种事务性错误,被归类为暂时性错误,如果重试,则可能成功。此外,如果未采取任何写锁定且事务(新数据)未反映在事务快照(先前的数据)中,则在提交之前发生TransientTransactionError写冲突。因此,在发生此类错误之前,可以完全安全地重试这​​些错误。是一次成功的提交。

在这种情况下重试的事务将从事务开始时重试。

请紧记:此错误标签与已采取锁定但事务无法完成其提交的提交错误不同。为此的错误标签是UnknownTransactionCommitResult。之所以值得一提,是因为在理解您的应用程序中发生错误的地方,可能的根本原因以及由于不同的错误类型而导致应用程序可以或将如何响应的理解上存在差异。

如果您使用的是MongoDB supported drivers,则可能有两个原因导致代码出现此错误:

  • 在“ errorLabels”字段中包含“ TransientTransactionError”错误标签的任何数据库命令错误。
  • 在事务中运行除commitTransaction以外的任何命令时遇到任何网络错误。

MongoDB Transactions: retry-transaction中的代码示例演示了如何处理TransientTransactionError的情况。

答案 2 :(得分:3)

尽管在Windows计算机上,我也遇到相同的问题/错误。尽管我以为我已经启动了mongodb服务,但我没有看到它在Windows Services中运行。因此,我在Services内手动启动了mongoDB服务,然后错误消失了。希望这会有所帮助!

答案 3 :(得分:3)

在Express / NodeJS的MDN教程中运行populatedb.js脚本时遇到此错误。

脚本正在寻找以mongodb://开头的数据库连接,但是我来自mongo的连接字符串以mongodb+srv://开头。

我编辑了脚本以检查该语法,从而解决了该错误。

我希望这对某人有帮助。

答案 4 :(得分:2)

我有类似的问题... 我整天都能通过猫鼬建立联系。然后,我开始收到“ TransientTransactionError”错误。我可以通过外壳连接到mongoDB,所以我知道服务器已按预期方式启动并运行。

IPv6 /本地主机。我的IP从IPv4切换到了IPv6。我通过禁用IPv6并获取常规的IPv4 IP解决了该问题。

编辑-似乎在我的NIC配置有IPv6 IP的情况下,可以通过连接到“ localhost”来可靠地重新创建此问题。更改localhost-> 127.0.0.1似乎可以解决此问题。

答案 5 :(得分:2)

确保服务器没有用完存储空间

就我而言,建议的答案都无济于事。我一直在拔头发,直到我发现服务器只是存储空间不足。清除几兆字节的存储可以立即解决该错误。

在这种情况下,TransientTransactionError实际上是有意义的,因为它的性质是一个临时错误,可以通过显式重试来解决-尽管花了我一段时间才弄清楚它与存储有关问题。

答案 6 :(得分:1)

对我来说,每当我从wifi网络切换到手机的热点时,就会出现瞬时交易错误。如果您也遇到这种情况,请访问已建立数据库的MongoDB网站,并再次将当前IP地址列入白名单。这样可以解决您的问题。

答案 7 :(得分:1)

如果仍然存在此错误,则另一个原因是您在更改配置文件后忘记重新启动nodemon服务器。 CTRL + C并重新开始,这就是我解决的方法。

答案 8 :(得分:1)

使用mLab -创建集群时,需要添加一个数据库用户(在“用户”选项卡下),并确保不要单击Make read-only复选框。一旦这样做,错误就会消失。我遇到了与上述相同的错误。数据库用户可以是您的登录用户名和密码。

答案 9 :(得分:1)

转到您的MongoDb Atlas仪表板。单击“网络访问”,单击“添加IP地址”,并允许来自任何IP地址的连接。 这应该可以解决您的问题。

答案 10 :(得分:1)

  1. 转到您的mongoDB Atlas仪表板
  2. 打开网络访问(位于侧面导航栏中)
  3. 点击添加IP地址
  4. 单击任意IP地址中的允许(基本上可以访问您的动态IP地址)

现在您完成了。

答案 11 :(得分:0)

尝试将我的Heroku应用程序连接到MongoDB Atlas数据库时遇到此问题。

如果在终端机上进行

heroku logs --tail

您可能会看到

ERROR: { MongoNetworkError: 
connection 4 to cluster0-shard-40-01-qnwp8.mongodb.net:27017 closed
name: 'MongoNetworkError',
errorLabels: [ 'TransientTransactionError' ],
[Symbol(mongoErrorContextSymbol)]: {} }`

将MongoDB Atlas上的服务器连接列入白名单后,数据库连接错误已解决。

答案 12 :(得分:0)

如果您使用的是MongoDB Atlas。您需要在安全设置的Atlas控制台上将IP地址列入白名单。

答案 13 :(得分:0)

如果没有安全问题,而您只是在进行连接: 设置IP白名单时;格式应为0.0.0.0/0,您将不会遇到问题。

enter image description here

此外,如您所言,我们可以添加我们需要访问的IP。

答案 14 :(得分:0)

安全性>网络访问>添加IP地址>添加当前计算机IP地址。 解决了我的问题。

答案 15 :(得分:-1)

您可以在线阅读有关该错误的信息,但是此问题的解决方案是:转到您的MongoDB地图集,然后 添加您的IP地址 。它将正常工作。