编写ENV变量来配置npm模块

时间:2016-09-08 19:03:17

标签: node.js npm

我目前有一个松散的ES6模块格式的项目,我的数据库连接是硬编码的。我想把它变成一个npm模块,我现在面临着如何最好地允许最终用户配置代码的问题。我的第一次尝试是将其重写为要实例化的类,但它使代码的使用比以前更复杂,所以我正在寻找替代方案。我正在探索我的配置选项。看起来像写入流程env会是方式,但我正在思考潜在的问题,no-nos和其他我没有考虑过的选项。

让用户编写配置来处理env配置npm模块的可接受方法吗?这有点像全局写,所以我正在处理一个名称空间考虑因素。我也考虑使用package.json,但这不适用于凭证之类的东西。同样地使用rc文件很麻烦。我没有找到任何关于正确方法的文档。

process.env['MY_COOL_MODULE_DB'] = ...

我认为基本上有5种选择:

  1. 硬编码 - 不是选项
  2. 创建一个配置的范围,例如类 - 我现在拥有的和bleh
  3. 使用诸如node-config之类的配置 - 对于npm
  4. 来说并不是一个用户友好的选项
  5. 以globals / env存储。正如评论中所建议的那样,我可以将该过程包装在导出的函数中,从而确保我在从最终用户抽象时具有复杂的非冲突命名空间
  6. 要求用户创建一些.rc文件 - 如果我像AWS这样的大时间,我会这样做,但不是在这种情况下。
  7. 我提到了这个npm用例,但这确实适用于配置导出为函数的代码的一般挑战。我有类的用例,但是当唯一的需要是在更复杂的代码的代价(在我的情况下)创建一个配置的范围时,我不确定它是否值得。

    更新我意识到这是一个讨论问题,但它帮助我将我的大脑包围在各种选项中。我想是这样的:

    // options.js
    let options = {}
    export function setOptions(o) { options = o }
    export function getOptions(o) { return options }
    

    然后让用户致电setOptions()并在内部调用此getOptions。我意识到,由于Node只需要模块一次,因此我将options对象保持配置状态,因为我传递它。

1 个答案:

答案 0 :(得分:0)

NPM模块应该IMO不知道配置存储的位置。这应该留给开发人员,他们可能会选择他们喜欢的方法(env vars,rc文件,JSON文件,等等)。

可以通过各种方式将配置传递给您的模块。一种常见的方法是导出一个带有选项对象的函数:

export default options => {
  let db = database.connect(options.database);
  ...
}

从那里,它实际上取决于您的模块究竟提供了什么。如果它只是一堆松散耦合的函数,你可以只返回一个对象:

export default options => {
  let db = database.connect(options.database);
  return {
    getUsers() { return db.getUsers() }
  }
}

如果要允许同时存在该对象的多个版本,可以使用类:

class MyClass {
  constructor(options) {
    ...
  }
  ...
}

export default options => {
  return new MyClass(options)
}

或者导出整个班级。

如果配置选项的数量有限(例如3或更少),您也可以允许它们作为单独的参数传递,而不是传递对象。