nodejs连接多个mongodb数据库


nodejs连接多个mongodb数据库

参考:
http://blog.csdn.net/u011677050/article/details/44302093

最近需要将uid生成及管理单独做成一个module,所以要将数据库独立出来。就发现一个node要链接两个数据库,而使用的方式会报错。
nodejs使用Mongoose模块操作mongodb

mongoose.connect('mongodb://localhost:12345/xx_xx');
var db = mongoose.connection;

通过查阅网上资料将解决问题的过程整理如下:

1 mongoose两种链接数据库的方式

1.1 connect

当程序只需要连接一个数据库时可使用这种方式

Mongoose#connect(uri(s), [options], [callback])
Opens the default mongoose connection.

Parameters:
uri(s) <String>
[options] <Object>
[callback] <Function>
Returns:
<Mongoose> this

mongoose.connect('mongodb://user:pass@localhost:port/database');
var uri = 'mongodb://user:pass@localhost:port/database,mongodb://anotherhost:port,mongodb://yetanother:port';
mongoose.connect(uri);

使用sample:

连接

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:12345/xx_xx');
var db = mongoose.connection;
db.on('error', console.error.bind(console, '... connect error ...'));
db.once('open', function callback() {
console.info("... db open ...");
});

使用

var mongoose = require('mongoose');
var UsersSchema = new mongoose.Schema({
email: {type: String, require:true, index:{ unique:true}, lowercase:true},
username: {type: String, require:true, index:{ unique:true}},
});
var UsersModel = mongoose.model('users', UsersSchema);
module.exports = UsersModel;

1.2 createConnection()

当程序只需要连接多个数据库时必须使用这种方式

Mongoose#createConnection([uri], [options])
Creates a Connection instance.
Parameters:
[uri] <String> a mongodb:// URI
[options] <Object> options to pass to the driver
Returns:
<Connection> the created Connection object

使用Sample:

连接

var mongoose = require('mongoose');
var db = mongoose.createConnection('mongodb://localhost:12345/xx_xx');
db.on('error', console.error.bind(console, '... connect error ...'));
db.once('open', function callback() {
console.info("... db open xx_xx...");
});
module.exports = db;

使用

var db = require('./mongodb');
var UsersSchema = new mongoose.Schema({
email: {type: String, require:true, index:{ unique:true}, lowercase:true},
username: {type: String, require:true, index:{ unique:true}},
});
var UsersModel = db.model('users', UsersSchema);//不再是上种方式的mongoose.modell('users', UsersSchema);

1.3 分析

1 当我们使用connect()链接两个数据库会发生什么?

有一个数据库连接成功了

mongoose.connect('mongodb://localhost:12345/xx_xx');
var db = mongoose.connection;

返回的是mongoose实例下面有一个默认链接实例connection。
而第二次调用

mongoose.connect('mongodb://localhost:12345/uid');
var db = mongoose.connection;

则会失败因为默认链接connection已经open,所以不能重复打开。

2.当我们使用createConnection()链接上两个数据库

var db = mongoose.createConnection('mongodb://localhost:12345/xx_xx');
module.exports = db;
var db_uid = mongoose.createConnection('mongodb://localhost:12345/xx_xx');
module.exports = db_uid;
//注意db 和db_uid 都是一个 a Connection。

而在使用时这样用

var mongoose = require('mongoose');
var UsersSchema = new mongoose.Schema({
email: {type: String, require:true, index:{ unique:true}, lowercase:true},
username: {type: String, require:true, index:{ unique:true}},
});
var UsersModel = mongoose.model('users', UsersSchema);
module.exports = UsersModel;

这样肯定不会工作,mongoose.model 使用的是默认链接,因为默认链接没有连接到数据库。而是非常奇怪 的没有任何现象,卡在那里。

3 总结

如果使用mongoose.connect的话,它连接的是默认连接;
而如果是db = mongoose.createConnection(xxxx)的话,因为它返回的是一个连接,所以接下来再进行模型生成的时候需要使用db.model而不是mongoose.model。
详细解释可参考:
https://stackoverflow.com/questions/22786374/queries-hang-when-using-mongoose-createconnection-vs-mongoose-connect

附上connect返回:

<Mongoose> this:
Mongoose constructor.
The exports object of the mongoose module is an instance of this class.
Most apps will only use this one instance.

附上createConnection返回:

Connection(base)
Parameters:
base <Mongoose> a mongoose instance

mongoose文档:
http://www.nodeclass.com/api/mongoose.html#connection_Connection

2 阿里云mongodb使用中遇到的问题

阿里云平台节点2为secondary 节点默认是不可读的,通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告