[英]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.