mongoskin и проблема подключения к кластеру реплик mongodb

Я использую модуль mongoskin npm для подключения к своему кластеру реплик базы данных mongo. Я перепробовал все возможные подходы, однако мой код nodejs не может установить соединение. Я могу подключиться к той же основной базе данных, используя автономное соединение, но при попытке использовать сервер реплики происходит сбой. Ниже приведены подробности

Code working for standalone: 
var express = require('express');
var app = express();
var mongo = require('mongoskin');
//connect primary as  standalone 
var db = mongo.db("mongodb://username:password@177.77.66.9:27017/bhs", {native_parser: true});

app.get('/', function (req, res) {
    db.bind('goalsfrequencymappings');
    db.goalsfrequencymappings.find().toArray(function (err, items) {
        res.json(items);
        db.close();
    });


});

var server = app.listen(8080, function () {

    var host = server.address().address;
    var port = server.address().port;

    console.log('Example app listening at http://%s:%s', host, port);

});

Код не работает как сервер реплик:

var express = require('express');
var mongo = require('mongoskin');
var app = express();
var Server = mongo.Server;
var Db = mongo.Db;
var ReplSetServers = mongo.ReplSetServers;


var replSet = new ReplSetServers([
    new Server('username:password@177.77.66.9:27017', 27017),
    new Server('username:password@88.052.72.91', 27017),
    new Server('username:password@95.46.865.455', 27017)
]);


var db = new Db('bhs', replSet, {w: 0, native_parser: (process.env['TEST_NATIVE'] != null)});

app.get('/', function (req, res) {

    db.collection('goalsfrequencymappings').find().toArray(function (err, items) {

        if(err){
            console.log("error :"+err);
            res.json(err);

        } else {
            console.log("items :"+items);
          res.json(items);  
        }

        db.close();
    });

});

var server = app.listen(8080, function () {

    var host = server.address().address;
    var port = server.address().port;

    console.log('Example app listening at http://%s:%s', host, port);

});

Это печатает следующую ошибку:

Example app listening at http://0.0.0.0:8080
error :Error: No valid replicaset instance servers found

Когда я подключаюсь к базе данных кластера с помощью cli и запускаю команду status и config, это выглядит хорошо.

myReplicaCluster:PRIMARY> rs.status();
{
    "set" : "myReplicaCluster",
    "date" : ISODate("2015-05-22T05:18:47Z"),
    "myState" : 1,
    "members" : [
        {
            "_id" : 0,
            "name" : "177.77.66.9:27017",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 6415902,
            "optime" : Timestamp(1432268531, 1),
            "optimeDate" : ISODate("2015-05-22T04:22:11Z"),
            "electionTime" : Timestamp(1425856025, 11),
            "electionDate" : ISODate("2015-03-08T23:07:05Z"),
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "88.052.72.91:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 6415566,
            "optime" : Timestamp(1432268531, 1),
            "optimeDate" : ISODate("2015-05-22T04:22:11Z"),
            "lastHeartbeat" : ISODate("2015-05-22T05:18:46Z"),
            "lastHeartbeatRecv" : ISODate("2015-05-22T05:18:47Z"),
            "pingMs" : 4,
            "syncingTo" : "177.77.66.9:27017"
        },
        {
            "_id" : 2,
            "name" : "95.46.865.455:27017",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 6415543,
            "optime" : Timestamp(1432268531, 1),
            "optimeDate" : ISODate("2015-05-22T04:22:11Z"),
            "lastHeartbeat" : ISODate("2015-05-22T05:18:46Z"),
            "lastHeartbeatRecv" : ISODate("2015-05-22T05:18:46Z"),
            "pingMs" : 0,
            "syncingTo" : "177.77.66.9:27017"
        }
    ],
    "ok" : 1
}
myReplicaCluster:PRIMARY> rs.config();
{
    "_id" : "myReplicaCluster",
    "version" : 5,
    "members" : [
        {
            "_id" : 0,
            "host" : "177.77.66.9:27017"
        },
        {
            "_id" : 1,
            "host" : "88.052.72.91:27017"
        },
        {
            "_id" : 2,
            "host" : "95.46.865.455:27017"
        }
    ]
}

Пожалуйста помоги.

1 ответ

Решение

После прочтения другого поста я понял, что передаю имя пользователя, пароль для каждого семени, который не требуется. Просто следуя синтаксису пула соединений mongodb, он работал. Ниже приведены подробности моего модифицированного кода, который работает нормально и работает на производстве.

 //Set seed mongo replicas.
url = 'mongodb://username:password@177.77.66.9:27017,88.052.72.91:27017,95.46.865.455:27017/dbname?replicaSet=yourReplicaCluster';

// Connect DB
var db = mongoskin.db(url, {native_parser: true, 'auto_reconnect': true, 'poolSize': 100, socketOptions: {
        keepAlive: 50,
        connectTimeoutMS: 1000,
        socketTimeoutMS: 0
    }});

// Get documents 
    getDocumentByQuery: function (collection, callback) {
        var query={};
        //Add additional filter to exclude soft deleted documents
        query.isDeleted = {$ne: true}
        DBModule.db.collection(collection).find(query).toArray(function (err, docuemnts) {
            if (!err) {
                callback(null, docuemnts);
            } else {
                callback(err, null);
            }
        });
    }
Другие вопросы по тегам