mongoose如何连接到许多数据库

对于一个项目,我需要在一些MongoDB数据库之间切换,以便进行一些查询。

我发现了一个例子: 单个node.js项目中的Mongoose和多个数据库

他的答案是完美的工作,但现在我试图做一个循环,不幸的是这是行不通的,我得到这个错误:

events.js:72 throw er; // Unhandled 'error' event ^ Error: failed to connect to [localhost:27017] at null.<anonymous> (/home/user/test_many_db_mongodb/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js:549:74) at EventEmitter.emit (events.js:106:17) at null.<anonymous> (/home/user/test_many_db_mongodb/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:150:15) at EventEmitter.emit (events.js:98:17) at Socket.<anonymous> (/home/user/test_many_db_mongodb/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js:533:10) at Socket.EventEmitter.emit (events.js:95:17) at net.js:440:14 at process._tickCallback (node.js:419:13) 

而我不明白为什么我得到这个错误,如果上面的链接的例子工作我的代码也应该:

 var mongoose = require('mongoose'); for (var i = 0; i != 1000; i++) { var conn = mongoose.createConnection('mongodb://localhost/test' + i); conn.on('connected', function() { console.log('Mongoose connected to database'); var Model = conn.model('Model', new mongoose.Schema({ title : { type : String, default : 'model in test database' } })); var newModelA = new Model(); newModelA.save(function(err) { if (err) console.log(err); console.log('save A'); }); }); } 

谢谢你的帮助。

我认为循环有一个问题。 因为循环内的代码本质上是asynchronous的。 所以我用forEach而不是for。 请看下面的代码。 这对我来说可以。

 var mongoose = require('mongoose'), arr = [0, 1, 2]; arr.forEach(function(i) { var conn = mongoose.createConnection('mongodb://localhost/test' + i); conn.on('connected', function() { console.log('Mongoose connected to database', i); var Model = conn.model('Model', new mongoose.Schema({ title: { type: String, default: 'model in test database' } })); var newModelA = new Model(); newModelA.save({ name: 'a' }, function(err) { if (err) console.log(err); console.log('save A'); }); }); }); 

由于您正在耗尽可用MongoDB连接的供应的同步循环中创build所有1000个数据库连接池,因此您将failed to connect错误。

所以你需要使用类似于async库的eachLimit方法来引入一些asynchronousstream控制到你的方法:

 var mongoose = require('mongoose'); var async = require('async'); var iterations = []; for (var i = 0; i != 1000; i++) { iterations.push(i); } // Iterate over iterations, allowing no more than 5 async iterations to be // outstanding at any one time. async.eachLimit(iterations, 5, function(i, callback) { var conn = mongoose.createConnection('mongodb://localhost/test' + i); conn.on('connected', function(err) { console.log('Mongoose connected to database'); var Model = conn.model('Model', new mongoose.Schema({ title : { type : String, default : 'model in test database' } })); var newModelA = new Model(); newModelA.save(function(err) { if (err) console.log(err); console.log('save A'); // Close the connection and tell eachLimit this iteration is // complete by having the close method call the eachLimit callback // when the close completes. conn.close(callback); }); }); }, function() { console.log('All done!'); }); 

谢谢你的帮助。

我尝试了这两种方式,但它没有在我的项目上工作,可能是因为我没有告诉你所有的代码。 我用这个useDd()find一个方法:

 var amqp = require('amqp'); var MailParser = require('mailparser').MailParser; var mailparser = new MailParser(); var mongoose = require('mongoose'); var conn = mongoose.createConnection('mongodb://localhost'); var count = 1; var connection = amqp.createConnection({host: 'localhost'}); connection.on('ready', function() { connection.queue('task_queue', {autoDelete: false, durable: true}, function(queue) { console.log('Waiting for emails. To exit press CTRL+C'); queue.subscribe({ack: true, prefetchCount: 1}, function(message, headers, deliveryInfo, ack) { mailparser.write(message.data.toString('utf-8')); mailparser.end(); ack.acknowledge(); }); }); }); mailparser.on("end", function(email_object){ var d = new Date(); // just for be sure the db name is unique for the test var db = conn.useDb('test_'+d.getDate()+'-'+d.getMonth()+'-'+d.getYear()+'_'+d.getHours()+'-'+d.getMinutes()+'-'+d.getSeconds()+'-'+d.getMilliseconds()); var Model = conn.model('Model', new mongoose.Schema({ subject : { type : String }, body : { type : String } })); var newEmail = new Model(); newEmail.subject = email_object.subject; newEmail.body = email_object.body; newEmail.save(function(err) { if (err) console.error(err); console.log(count++); }); }); 
Interesting Posts