Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongoose如何连接到多个数据库_Node.js_Mongodb_Mongoose_Multiple Databases - Fatal编程技术网

Node.js Mongoose如何连接到多个数据库

Node.js Mongoose如何连接到多个数据库,node.js,mongodb,mongoose,multiple-databases,Node.js,Mongodb,Mongoose,Multiple Databases,对于一个项目,我需要在一些MongoDB数据库之间切换以执行一些查询 我找到了一些类似的例子: 他的答案非常有效,但现在我尝试在一个循环中进行,不幸的是,它不起作用,我得到了以下错误: events.js:72 throw er; // Unhandled 'error' event ^ Error: failed to connect to [localhost:27017] at null.<anonymous> (/home/

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

我找到了一些类似的例子:

他的答案非常有效,但现在我尝试在一个循环中进行,不幸的是,它不起作用,我得到了以下错误:

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)

谢谢您的帮助。

我认为for循环有问题。因为循环中的代码本质上是异步的。所以我用forEach代替for。请看下面的代码。这对我来说很好

var mongoose=require('mongoose'),
arr=[0,1,2];
arr.forEach(功能(i){
var conn=mongoose.createConnection('mongodb://localhost/test"(i),;
conn.on('connected',function(){
log('Mongoose连接到数据库',i);
var Model=conn.Model('Model',新的mongoose.Schema({
标题:{
类型:字符串,
默认值:“测试数据库中的模型”
}
}));
var newModelA=新模型();
newModelA.save({
姓名:“a”
},函数(err){
如果(错误)
控制台日志(err);
console.log('save A');
});
});

});您将收到
连接失败
错误,因为您正在同步循环中创建所有1000个数据库连接池,这将耗尽可用MongoDB连接的供应

因此,您需要使用一些类似于库的方法,在您的方法中引入一些异步流控制:

var mongoose=require('mongoose');
var async=require('async');
var迭代次数=[];
对于(变量i=0;i!=1000;i++){
迭代。推送(i);
}
//迭代,允许不超过5个异步迭代
//在任何时候都是杰出的。
eachLimit(迭代,5,函数(i,回调){
var conn=mongoose.createConnection('mongodb://localhost/test"(i),;
连接on(已连接),功能(错误){
log(“Mongoose连接到数据库”);
var Model=conn.Model('Model',新的mongoose.Schema({
标题:{type:String,默认值:'测试数据库中的模型'}
}));
var newModelA=新模型();
newModelA.save(函数(err){
如果(错误)
控制台日志(err);
console.log('save A');
//关闭连接,并告诉每个人此迭代是有限的
//通过让close方法调用eachLimit回调来完成
//当关闭完成时。
控制室关闭(回拨);
});    
});
},函数(){
console.log('All done!');
});
谢谢您的帮助

我尝试了两种方法,但在我的项目中都不起作用,可能是因为我没有向您展示所有的代码。我找到了一种方法:


forEach
是同步的,因此其行为与OP的代码相同。如果for循环是异步的,因为内部代码是异步的,循环将首先执行,然后执行内部代码。因此,在本例中,内部代码的值为2(上面的示例)。但在forEach循环的情况下,它不会发生。我已经运行了OP的代码以及我自己的代码。我请求您运行代码,您也将得到差异。谢谢。好的,这将解决共享
conn
变量问题,但不能解决OP的
连接失败
错误。这是因为所有1000个连接池都是在同步循环中打开的。需要一些异步流控制来解决这个问题。我认为“连接失败”问题是另一个问题。OP的mongodb可能有问题。我再次要求您运行代码段,您可以很容易地发现代码按预期工作,并有效地生成结果。
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');
        });
    });
}
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++);
    });
});