对于一个项目,我需要在一些MongoDB数据库之间切换以进行一些查询。
我找到了一个类似的例子:Mongoose and multiple database in single node.js project
他的答案完全正常,但现在我试图在一个循环中这样做,不幸的是它不起作用,我得到了这个错误:
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');
});
});
}
感谢您的帮助。
答案 0 :(得分:1)
我认为for循环存在问题。因为循环中的代码本质上是异步的。所以我使用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');
});
});
});
&#13;
我这样做了三次。你也可以做1000次。
答案 1 :(得分:1)
您收到failed to connect
错误,因为您在同步循环中创建了所有1000个数据库连接池,这会耗尽可用的MongoDB连接。
因此,您需要使用类似async
库的eachLimit
方法的方法为您的方法引入一些异步流控制:
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!');
});
答案 2 :(得分:0)
感谢您的帮助。
我尝试了两种方式,但它对我的项目无效,可能是因为我没有向您显示所有代码。我找到了使用useDb()的方法:
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++);
});
});