簡體   English   中英

Module.export一個'默認'函數

[英]Module.export a 'default' function

我想編寫一個導出默認函數和屬性列表的模塊(它們也是函數)。 基本上這個模塊將允許消費者這種用法:

let db_connection = fake_database_connection_instance()
let db = require('./db.js')(db_connection)
db.find({id:1})

因此,默認函數應該只將數據庫連接實例傳遞給模塊。 這是不可用的代碼

module.exports = {
    //init should go away and replaced by a 'default' function when this module is called
    init: function (connection) {
        this.connection= connection;
        return this;
    },
    find: function (query) {
        return new Promise(function (resolve, reject) {
            this.connection.find(query, function (err, docs) {
                if (err) {
                    return reject(err);
                }
                return resolve(docs);
            });
        });
    }
}

我想避免new關鍵字(消費方),所以我要刪除這些this ,我知道了。 這里的問題是2:

  • 如何導出一個名為require('./db.js')()和其他函數的默認函數,例如require('./db.js').find()
  • 如何將連接實例從默認函數傳遞給find()

編輯 @Igor Raush ES6 Class解決方案我編寫了這個,但仍然db is not defined

class DB {
    constructor(db) {
        this.db = db;
    }
    find(query) {
        return new Promise( (resolve, reject) => {
            this.db.find(query, function (err, docs) {
                if (err) {
                    return reject(err);
                }
                return resolve(docs);
            });
        });
    }
}

您可以向module.exports添加默認函數,並使用外部變量_conn來存儲連接:

let _conn;

module.exports = (connection) => {
  _conn = connection;
};

之后,您可以將find函數添加到module.exports對象:

module.exports.find = (query) => {
  return new Promise(function(resolve, reject) {
    _conn.find(query, function(err, docs) {
      if (err) {
        return reject(err);
      }
      resolve(docs);
    });
  });
}

一種選擇是創建一個類並導出實例工廠函數。

// db.js
function DB(connection) {
    this.connection = connection;
}

DB.prototype.find = function find(query) {
    let connection = this.connection;
    // ...
}

// export instance factory function
module.exports = function (connection) { return new DB(connection); };

或者,如果您在ES6環境中,

// db.js
class DB {
    constructor(connection) {
        this.connection = connection;
    }

    find(query) {
        let connection = this.connection;
        // ...
    }
}

// export instance factory function
module.exports = connection => new DB(connection);

那你可以做

let db = require('./db')(db_connection);
db.find({ id: 1 });

如果您想強制執行單例模式(只能存在一個DB實例),則懶惰地創建一個模塊本地實例並在后續調用時返回引用:

let _instance = null;
module.exports = connection => {
    // return existing instance, or create a new one
    return _instance || (_instance = new DB(connection));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM