2
votes

I have 2 mongo instance running in 2 different servers (one primary and other secondary); I am able to retrieve a document from the primary server using this connection code:

var db = mongojs('user:pswd@localhost:27017/mydb?authSource=admin');

But when I try to retrieve a document from the secondary server, I am getting the following error:

{ [MongoError: not master and slaveOk=false]
name: 'MongoError',
message: 'not master and slaveOk=false',
ok: 0,
errmsg: 'not master and slaveOk=false',
code: 13435 }

I also tried using the code:

var db = mongojs('user:pswd@localhost:27017/mydb?authSource=admin&slaveOk=true');

What am I missing?

2

2 Answers

6
votes

Since you are trying to read from Secondary at DB level. You should specify the readPreferences "secondaryPreferred" in the connection URL for your replica set.

You can refer this document which describes in detail how to do that.

Read Preferences with MongoDB Node.JS Driver

var MongoClient = require('mongodb').MongoClient
  , format = require('util').format;

var url = format("mongodb://%s,%s,%s/%s?replicaSet=%s&readPreference=%s"
  , "localhost:27017",
  , "localhost:27018"
  , "localhost:27019"
  , "exampleDb"
  , "foo"
  , "secondaryPreferred");

MongoClient.connect(url, function(err db) {
  if(!err) {
    console.log("We are connected");
  }
});
0
votes
MongoClient.connect(
  'mongodb://ip/mongo-primary:27017,ip/mongo-secondary-1:ip/mongo-secondary-2:27017,ip/mongo-secondary-3:27017?readPreference=secondaryPreferred',
  {useNewUrlParser: true, useUnifiedTopology: true }, function (err, client) { var db = client.db('viajydb'); 

db.collection('customers').findOne({}, function (findErr, result) { if (findErr) throw findErr; console.log(result.name); client.close(); }); });