导入对象实例的模块化方式

时间:2016-06-02 20:34:58

标签: javascript node.js

我正在寻找一种在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'})
}

2 个答案:

答案 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课程。