2014-06-24 3 views
9

J'ai essayé de me connecter à MongoDB replicaSet via mongoose. J'ai utilisé ce link.
Configuration JSON:
Connexion de Mongoose au jeu de réplicas

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

Mongoose connecter:

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

Après le lancement des applications i eu exception:

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: chat, serveur principal: localhost: 27022.

J'ai également essayé de supprimer deux autres serveurs (en gardant seulement le principal dans config json) et j'ai vu qu'il connaît les serveurs secondaires (j'ai utilisé le journal). Je pense qu'il s'agit de méta-données mongodb. Mais quand j'ai éteint le premier, il a fini son travail (pas étonnant), j'en ai besoin pour pouvoir utiliser le secondaire à la place.
Des idées?

Répondre

14

Nous utilisons ceci:

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 est REDUCTIONS par https://team.goodeggs.com/reconnecting-to-mongodb-when-mongoose-connect-fails-at-startup-83ca8496ca02

+1

@ lor1an Comme indiqué dans cette réponse, votre nom de fichier devrait venir * après * la liste des ports hôte: Donc, votre chaîne de connexion doit être: 'mongodb: // localhost: 27022, mongodb: // localhost : 27021, mongodb: // localhost: 27020/chat' – MForMarlon

+0

@MForMarlon Comme je l'ai fait, non? – malix

+0

Oui.La syntaxe est importante pour que la connexion mongo fonctionne. – MForMarlon

5

Votre chaîne de connexion est probablement invalide. Vous devez fournir URI pour chaque réplique membre du jeu:

"uri": "MongoDB: // localhost: 27022/chat localhost: 27021, localhost: 27020"

Vous devriez vérifier replica set connection section dans la documentation Mongoose.

+0

Je l'ai essayé au début, mais rien ne fonctionne. ( – lor1an

+0

@ user3772831 quelle erreur vous obtenez lorsque vous utilisez l'URI je suggère –

+0

? Stacktrace était le même que précédemment. – lor1an

6

J'ai eu du mal avec cela aussi. Ce que j'ai appris de cette expérience est:

Le bloc "serveur" est uniquement appelé lorsque l'URI de connexion contient une seule connexion non groupée (une chaîne de connexion unique). Le bloc "replset" n'est invoqué que lorsque l'URL de connexion contient une liste de chaînes de connexion séparées par des virgules (alias ensemble de réplication).

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 
     } 
    } 
}; 

Ce bloc a travaillé à la fois sur localhost et sur l'environnement de production. J'espère que ça aide.

+1

Merci. Vous avez répondu aux questions principales que je réfléchissais. – ThinkingInBits

+1

La documentation n'est pas très claire à ce sujet - J'ai découvert par essais et erreurs .. – ChrisRich

+0

Ouais la documentation des options de connexion monodb js pourrait * vraiment * être améliorée. – UpTheCreek

Questions connexes