当前位置: 首页 > 工具软件 > mongoskin > 使用案例 >

mongoskin封装mongdo驱动的调用方式

曹智
2023-12-01

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

 类似资料: