nodejs连接多个mongodb数据库

2018-01-08 13:34:05来源:网络收集作者:咖啡不加糖人点击

分享

阿里云爆款
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;

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


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

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


Mongoose#connect(uri(s), [options], [callback])
Opens the default mongoose connection.
Parameters:
uri(s)
[options]
[callback]
Returns:
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.2createConnection()

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


Mongoose#createConnection([uri], [options])
Creates a Connection instance.
Parameters:
[uri] a mongodb:// URI
[options] options to pass to the driver
Returns:
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返回:


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 a mongoose instance

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


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

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


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台