最近在看MEAN框架,在学习过程中想对mongoskin接口再进行一次封装,实现的目标:是数据库连接信息写入配置文件,在实调用过程中不涉及数据库的打开和关闭等操作,具体的封装接口在后续的文章中呈现。封装接口就会涉及到对原接口的了解,但是mongoskin接口的文档又不是很完善,因此就需要对mongodb接口的了解。
先说一下,本文使用的mongoskin的版本号是1.4.13,大家可以参照源码进一步了解。
在index.js文件的末尾36行处exports.db = exports.MongoClient.connect;定义我们连接数据库的db方法(例如:mongo.db('mongodb://localhost/test');),但是这里请注意MongoClient是mongoskin模块定义的MongoClient。
接着在mongo_client.js文件中会创建SkinDb的实例,在实际操作中我们会调用collection方法。在阅读collection方法的源码时,其中会调用collection.open方法(db.js文件的64行处collection.open(callback);),而collection.open方法中又会调用db.open方法(collection.js文件49行处this._skin_db.open(function(err, db)),但是在这两个文件找了半天也没找到open函数。内心苦思冥想,难道是nodejs的prototype是否加下划线的函数同等,这个想法明显是错误的,上网搜索一下无解。灵机一动,加console.log打印,之前的调用流程也是加打印信息跟踪得出的。在db.js文件63行处添加console.log("", collection.open, collection._open);打印信息,注意要输出空字符串,否则输出内容为[Function] [Function]。打印信息输出为:
function (callback) {
switch (this._state) {
case STATE_OPEN:
callback(null, this._native);
break;
case STATE_OPENNING:
this._emitter.once('open', callback);
break;
default:
this._emitter.once('open', callback);
this._state = STATE_OPENNING;
var self = this;
<strong>this._open(function(err, p_native)</strong> {
if (err) {
self._state = STATE_CLOSE;
} else {
self._state = STATE_OPEN;
self._native = p_native;
}
self._emitter.emit('open', err, p_native);
});
}
return this;
}
function (callback) {
var collection_args = this._collection_args.concat([callback]);
this._skin_db.open(function(err, db) {
if(err) return callback(err);
db.collection.apply(db, collection_args);
});
}
对照源码发现collection._open函数时后者,而前者对应utils.js中150行处的open方法。原来在前者函数中会调用_open(因为大多数模块都是基于makeSkinClass类的),这样解释就合理了。后续的代码就好分析了,到此为止吧,不足之处敬请谅解。