参考:
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;
通过查阅网上资料将解决问题的过程整理如下:
当程序只需要连接一个数据库时可使用这种方式
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;
当程序只需要连接多个数据库时必须使用这种方式
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);
有一个数据库连接成功了
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,所以不能重复打开。
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 使用的是默认链接,因为默认链接没有连接到数据库。而是非常奇怪 的没有任何现象,卡在那里。
如果使用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为secondary 节点默认是不可读的,通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。