39

I have server.js and db.js The db.js file interacts with my database using Mongoose and I use server.js to call functions from 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}`)
                })
            }
        }
    })
}

And my server.js calls three functions from db.js :

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

I don't understand why I get this error :

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

What am I doing wrong? I found an article but can't make anything of it.

user4157124
  • 2,809
  • 13
  • 27
  • 42
Sagnik Pradhan
  • 509
  • 1
  • 5
  • 16
  • @SagnikPradhan I would like to add one weird thing here. I don't if I am wrong here though. I added my IP address which I got from command prompt(Ipconfig command) and it didn't work . But when I asked the cluster to fetch my IP Address, it fetched a different one and that worked. If somebody could explain why, I feel that It would add something to the above question. – vibhor vaish Apr 21 '19 at 15:46
  • @vibhorvaish It might have been your local IP Address. – Sagnik Pradhan Apr 22 '19 at 01:46

16 Answers16

37

I had

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

I added my current IP to whiteList following "main page > security section > network access > add IP" in MongoDB website.

I hope this helps.

msahin
  • 1,520
  • 1
  • 16
  • 22
34

What is a TransientTransactionError

A TransientTransactionError is a transactional error that is classified as temporary, and if retried it may be successful. Furthermore, a TransientTransactionError write conflict occurs prior to a commit when no write lock has been taken and the transaction (new data) is not reflected in the transaction snapshot (previous data.) As a result, these errors are completely safe to retry until there is a successful commit.

Transactions that retry in this scenario are retried from the beginning of the transaction.

Keep in mind This error label is different than commit errors that happen when the lock has been taken but the transaction can't complete its commit. The error label for this is UnknownTransactionCommitResult. The reference to this is notable due to the difference in understanding where in your application an error is occurring and what may be the underlying cause and how the application can and or will respond due to different error types.

If you're using MongoDB supported drivers, there are two possible cause the code is getting this error:

  • Any database command error that includes the "TransientTransactionError" error label in the "errorLabels" field.
  • Any network error encountered running any command other than commitTransaction in a transaction.

The code example in MongoDB Transactions: retry-transaction show cased how to handle TransientTransactionError.

If the error message is MongoNetworkError, it means the transient transaction error is related to the network connectivity between the client and the server. This could either be a one time network glitch which is retry-able, or there is no network access which require network configuration. If the error is encountered on the first time the client trying to access the server, it is likely that there is network configuration needed. If the server is on MongoDB Atlas, please see Configure Whitelist Entries.

Wan B.
  • 18,367
  • 4
  • 54
  • 71
  • 1
    The only thing I would add is that the a transienttransactionerror is an attempt on a transaction that isn't on the snapshot (previous data) and prior to taking the write lock. Most likely due to a network connection error or write conflict. Think of a write conflict as something that won't let you write or to take the write lock because of circumstances... i.e. and prior to doing any sort of commit. – Christian Matthew Mar 25 '19 at 03:33
5
  1. Go to your mongoDB Atlas Dashboard
  2. Open Network Access (its there in side navbar)
  3. Click on ADD IP ADDRESS
  4. Click on allow from Any IP Address ( it basically give access to your dynamic IP address)

Now you are done.

Kos
  • 4,890
  • 9
  • 38
  • 42
SHASHANK JAIS
  • 87
  • 1
  • 2
4

I had the same issue/error, albeit on a Windows machine. Even though I thought I had started the mongodb service, I didn't see it running in Windows Services. So, I manually started the mongoDB service inside Services and then the error went away. Hope this helps!

Benny
  • 5,218
  • 5
  • 24
  • 28
4

If there is no security issue and you are just doing it for connecting: While setting up the IP Whitelist; format should be 0.0.0.0/0 , you will not face the issue.

enter image description here

Moreover, as you have answered yourself, we can add the ip for which we need access.

Singh Gaurav
  • 147
  • 3
  • 12
3

I encountered this error when running the populatedb.js script in the MDN tutorial for Express/NodeJS.

The script was looking for a db connection starting with mongodb://, however my connection string from mongo started with mongodb+srv://.

I edited the script to check for this syntax instead, which resolved the error.

I hope this helps someone.

2

I had similar problem... All day I was able to connect via mongoose. Then bang I started getting 'TransientTransactionError' error. I could connect to mongoDB via shell so I knew the server was up and running as expected.

IPv6/localhost. My IP switched from IPv4 to IPv6. I resolved the issue by disabling IPv6 and getting regular IPv4 IP.

EDIT -- seems I can reliably re/create this issue by connecting to 'localhost' while my NIC is configured with a IPv6 IP. Changing localhost->127.0.0.1 seems to resolve the issue.

terary
  • 940
  • 13
  • 30
  • Wat? How did your IP switch from IPv4 to IPv6? :/ How did you "disable IPv6"? – Bloke Feb 15 '19 at 15:53
  • @Bloke - I get IPv6 IP by connecting via phone mobile hotspot. I disable IPv6 using sysctl (see google for details). – terary Feb 20 '19 at 16:04
2

Make sure the server didn't run out of storage space.

In my case, none of the suggested answers helped. I was pulling out my hair until I've noticed that the server ran out of storage space. Clearing up a few megabytes of storage solved the error immediately.

The TransientTransactionError actually makes sense in this scenario due to its nature of being a temporary error that could be resolved upon an explicit retry - though it did take me a while to figure out it had to do with a storage issue.

Shaya
  • 2,792
  • 3
  • 26
  • 35
1

For me, the transient transaction error came whenever I switched from my wifi network to my phone's hotspot. If this happens to you too, go to MongoDB website where you have made your database and white list your current IP address again. This will solve your problem.

Jurgen Strydom
  • 3,540
  • 1
  • 23
  • 30
Tarun
  • 11
  • 1
  • 2
1

If you are using MongoDB Atlas. You need to Whitelist your IP address on the Atlas Console in the security settings.

HassanK
  • 80
  • 7
1

If you still have this error, another reason is that you forgot to restart nodemon server after changing config file. CTRL+C and start again, that's how i solved it.

1

Security > Network Acess> Add IP Adress > Add Current Computer IP address. Solved my problem.

tanvirgeek
  • 153
  • 1
  • 2
  • 10
1

Using mLab -- When your cluster is created, you need to add a database user (under the users tab) and make sure to not click the Make read-only checkbox. Once I did this, the errors went away. I was getting the same errors as above. The database user can be your login user name and password.

1

Go to your MongoDb Atlas dashboard. Click on Network Access, Click on add Ip Address and allow connectivity from any Ip Address. This should solve your problem.

0

I had this problem when trying to connect my Heroku app to a MongoDB Atlas database.

If you do a on you terminal

heroku logs --tail

You might see

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

After whitelisting the server connection on MongoDB Atlas, the database connection error was resolved.

Yvan Pearson
  • 319
  • 4
  • 6
0

You can read about the error online but the solution for this problem is: go to you MongoDB atlas and add your IP address.

Go to: main page > security section > network access > add IP

This problem is basically when the architecture do not know your own IP address.

Also, copy-paste directly to google to get straight forward solution.