2014-06-24 85 views
9

我试图通过猫鼬连接到MongoDB replicaSet。我用这个link
配置JSON:
Mongoose连接到副本集

"mongoose": { 
    "uri": "mongodb://localhost:27022/chat,localhost:27021,localhost:27020", 
    "options": { 
     "replset": { "rs_name": "rs0" }, 
     "server": { 
      "poolSize": 3, 
      "socketOptions": { 
       "keepAlive": 1 
      } 
     } 
    } 
} 

猫鼬连接:

var mongoose = require('mongoose'); 
mongoose.connect(config.get('mongoose:uri'), config.get('mongoose:options')); 

和启动应用程序后,我得到异常:

Error: host must be specified [undefined] 
at new exports.ConnectionPool (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\mongodb\lib\mongodb\connection\connection_pool.js:18:11) 
at Server.connect (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\mongodb\lib\mongodb\connection\server.js:335:25) 
at Db.open (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\mongodb\lib\mongodb\db.js:264:23) 
at MongoStore._open_database (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect-mongo\lib\connect-mongo.js:174:15) 
at MongoStore._get_collection (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect-mongo\lib\connect-mongo.js:169:14) 
at MongoStore.get (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect-mongo\lib\connect-mongo.js:213:10) 
at Object.session [as handle] (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect\node_modules\express-session\index.js:215:11) 
at next (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect\lib\proto.js:194:15) 
at Object.module.exports [as handle] (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\middleware\resExtensions.js:21:2) 
at next (c:\Users\lor1an\Downloads\prj_chat-master\prj_chat-master\node_modules\connect\lib\proto.js:194:15) 

Db的:聊天,主服务器:localhost:27022。

另外我试着删除另外两台服务器(只保留配置json中的主服务器),并且我看到它知道二级服务器(我用过日志)。我认为这是关于mongodb元数据。但是,当我关闭主要的一个,它完成了它的工作(难怪),我需要它,所以它可以使用第二个替代。
任何想法?

回答

14

我们使用这样的:

if(config.db.indexOf('replicaSet') > - 1) { 
    dbOptions = { 
    db: {native_parser: true}, 
    replset: { 
     auto_reconnect:false, 
     poolSize: 10, 
     socketOptions: { 
     keepAlive: 1000, 
     connectTimeoutMS: 30000 
     } 
    }, 
    server: { 
     poolSize: 5, 
     socketOptions: { 
     keepAlive: 1000, 
     connectTimeoutMS: 30000 
     } 
    } 
    }; 
} 

var db = mongoose.connect(config.db, dbOptions); 

其中

config.db = 'mongodb://USER:[email protected]:port1,host2:port2/DBNAME?replicaSet=RSNAME' 

Auto_reconnect熄灭按https://team.goodeggs.com/reconnecting-to-mongodb-when-mongoose-connect-fails-at-startup-83ca8496ca02

+1

@ lor1an正如在这个答案中指出的那样,你的dbname应该在host:ports列表后面*因此你的连接字符串应该是:'mongodb:// localhost:27022,mongodb:// localhost :27021,mongodb:// localhost:27020/chat' – MForMarlon

+0

@MForMarlon正如我的,对吧? – malix

+0

是的。语法对于mongo连接起作用非常重要。 – MForMarlon

5

您的连接字符串可能无效。

“URI”:你应该为每个副本集成员提供URI “的mongodb://本地主机:27022 /聊天,本地主机:27021为localhost:27020”

您应该检查replica set connection节在Mongoose文档中。

+0

我试了一下,在开始时,但没有任何工程。( – lor1an

+0

@ user3772831你得到什么错误,当您使用URI我建议? –

+0

堆栈跟踪是和以前一样。 – lor1an

6

我有这样的烦恼了。我从经验中学到的是:

仅当连接URI包含单个非群集连接(又名单个连接字符串)时,才会调用“服务器”块。

仅当连接URL包含逗号分隔的连接字符串(又名复制集)列表时,才会调用“replset”块。

var options = { 

    db: { 
     native_parser: true 
    }, 

    // This block gets run for a non replica set connection string (eg. localhost with a single DB) 
    server: { 
     poolSize: 5, 
     reconnectTries: Number.MAX_VALUE, 
     ssl: false, 
     sslValidate: false, 
     socketOptions: { 
      keepAlive: 1000, 
      connectTimeoutMS: 30000 
     } 
    }, 

    // This block gets run when the connection string indicates a replica set (comma seperated connections) 
    replset: { 
     auto_reconnect: false, 
     poolSize: 10, 
     connectWithNoPrimary: true, 
     ssl: true, 
     sslValidate: false, 
     socketOptions: { 
      keepAlive: 1000, 
      connectTimeoutMS: 30000 
     } 
    } 
}; 

该块在本地主机和生产环境中工作。 希望它有帮助。

+1

谢谢。你回答了我一直在琢磨的主要问题。 – ThinkingInBits

+1

该文件不是很清楚这一点 - 我发现了试验和错误.. – ChrisRich

+0

是啊monodb js连接选项文件可能*真正*提高。 – UpTheCreek

相关问题