javascript – Mongoose(或MongoDB)中的TransientTransactionError是什么?

所以我有两个文件一个是server.js,另一个是db.js db.js文件使用Mongoose与我的数据库交互,我使用server.js从db.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}`)
                })
            }
        }
    })
}

我的server.js从db.js中调用了三个函数

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

我不明白为什么我会收到此错误:

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)]: {} }

对不起这个愚蠢的问题,但有谁能说我这里发生了什么?我做错了什么?

编辑:我发现了一篇与此问题相关的文章:https://docs.mongodb.com/manual/core/transactions/#retry-transaction但是不能真正弥补它的任何问题.

编辑2:发现问题.这是一个网络问题,因为它说MongoNetworkError和我猜TransientTransactionError引用了一些数据库端临时问题.我通过将我的IP地址列入白名单解决了这个问题.

解决方法:

What is a TransientTransactionError

TransientTransactionError是一个事务性错误,被归类为临时错误,如果重试,则可能成功.此外,在提交之前发生TransientTransactionError写入冲突时没有进行写入锁定且事务(新数据)未反映在事务快照中(以前的数据).因此,这些错误完全可以重试,直到那里是一次成功的提交.

在事务开始时重试在此方案中重试的事务.

请记住,此错误标签与在执行锁定但事务无法完成其提交时发生的提交错误不同.这个错误标签是UnknownTransactionCommitResult.对此的引用值得注意,因为您的应用程序在哪里发生错误以及可能的根本原因以及应用程序可能和/或将由于不同的错误类型而响应的区别不同.

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

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

MongoDB Transactions: retry-transaction中的代码示例显示了如何处理TransientTransactionError.

上一篇:javascript – 猫鼬自动增量


下一篇:javascript – mongoose .find()方法返回带有不需要的属性的对象