我正在寻找一种在javascript文件中定义对象实例的方法,就像这样。
以下内容位于serviceKnex.js
文件中。
import Knex from 'knex'
var knex = Knex({
client: 'mysql',
connection: {
host : '127.0.0.1',
user : 'your_database_user',
password : 'your_database_password',
database : 'myapp_test'
},
migrations: {
tableName: 'migrations'
}
})
export default knex
然后可以import
serviceKnex.js
直接在这样的函数中使用它。
import serviceKnex from '../serviceKnex'
export async function createItem () {
return serviceKnex('table')
.insert({'hello', 'world'})
}
但是,我想将上面的代码设为npm模块,理想情况下可以将对象作为参数接收serviceKnex
。我仍然希望这个函数的使用者能够改变他们正在使用的knex
对象实例。
有没有办法允许一个简单的模块化,可交换的界面来导入和使用全局对象实例?
我试图阻止自己编写这样的函数,传递给knex
对象。
export async function createItem (knex) {
return knex('table')
.insert({'hello', 'world'})
}
答案 0 :(得分:1)
您可以创建一个包装类,它在构造函数中将serviceKnex
作为参数,并另外提供setKnex()
方法。
示例:
export default class DatabaseClass {
constructor(serviceKnex) {
this.serviceKnex = serviceKnex;
}
setKnex(knexService) {
this.serviceKnex = serviceKnex;
}
async createItem() {
return this.serviceKnex('table')
.insert({'hello', 'world'});
}
}
然后你会像这样使用它:
import serviceKnex from '../serviceKnex';
import DatabaseClass from 'database-class';
var dbObject = new DatabaseClass(knexService);
dbObject.createItem();
如果你不想使用类,你可以在修改全局变量的NPM模块代码中添加一个setter函数,但我个人更喜欢包装类方法。
答案 1 :(得分:1)
您是否考虑过原型继承?与jQuery的构建方式类似,类似于:
function serviceKnex (knexInstance) {
return new init(knexInstance)
}
function init (knexInstance) {
this.instance = knexInstance
return this
}
init.prototype = {
createItem () {
return this.instance('table').insert({'hello', 'world'})
}
}
export default serviceKnex
然后您的用户就可以使用不同的实例。
import Knex from 'knex'
import serviceKnex from 'serviceKnex'
const knexOne = Knex({})
const knexTwo = Knex({})
const serviceKnexOne = serviceKnex(knexOne)
const serviceKnexTwo = serviceKnex(knexTwo)
serviceKnexOne.createItem()
serviceKnexTwo.createItem()
编辑:或者以this answer指出ES6课程。