mongoskin封装mongdo驱动的调用方式

来源:互联网 发布:修改linux字符集编码 编辑:程序博客网 时间:2024/06/03 07:38

    最近在看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类的),这样解释就合理了。后续的代码就好分析了,到此为止吧,不足之处敬请谅解。

0 0
原创粉丝点击