0

我只是对原生驱动程序不会抱怨我的(未正确配置的)副本集这一事实感到好奇。事实上,我的设置只有一个mongod监听端口 27021 的实例(甚至没有使用端口 27018 和 27019):

var async          = require('async')
  , mongodb        = require('mongodb')
  , Db             = mongodb.Db
  , Connection     = mongodb.Connection
  , Server         = mongodb.Server
  , ReplSetServers = mongodb.ReplSetServers;

async.waterfall([
    function (callback) {
        var rls = new ReplSetServers([
            new Server('localhost', 27017, {}), // Just mongod instance
            new Server('localhost', 27018, {}), // Offline
            new Server('localhost', 27019, {}), // Offline
        ]);

        new Db('test', rls, { w: 0 }).open(function (err, db) {
            callback(err, db);
        });
    },
], function (err, db) {
    if (err) console.error(err);
    if (db) db.close();
});

没有错误输出。当然,停止唯一的mongod运行实例会导致连接错误。我在这里遗漏了一些明显的东西吗?

4

1 回答 1

1

提供给驱动程序的服务器列表用于发现您的副本集成员。如果驱动程序可以连接到至少一个副本,它将执行一个 rs.isMaster() 调用(你可以在 shell 中尝试这个),它返回一个活动成员列表。只要执行的操作不违反集合的当前状态(例如在没有主节点时尝试写入),您就不会看到错误。即使是写入,您也必须请求确认 (w: >= 1) 才能在客户端上看到错误。

于 2013-05-17T13:35:13.243 回答