如何避免节点中的单例

时间:2018-09-29 14:46:32

标签: node.js dependency-injection singleton

我有一个npm依赖项,我将其导入到服务器节点的文件中。我希望它不是单例,因为它不应在每个请求之间共享。

导入依赖项的文件:

const dependency = require('dependency');

export class dependencyFactory {

  public static getDependency() {
    return dependency;
  }

}

node_modules中依赖项的index.js:

const path = require('path');
const createApi = require('./createApi');

module.exports = createApi(path.join(__dirname, './lib/providers'));

我该怎么做?谢谢。

1 个答案:

答案 0 :(得分:1)

模块在Node中导致单例。如果不希望这样做,那么解决方法始终取决于特定的软件包。

一种更好的方法是从可以在需要时创建新实例的包中导出工厂函数或构造函数类。

如果这不可能,则可能的解决方法可能包括:

  • 使用程序包内部模块创建新实例
  • 使模块缓存无效以重新导入软件包
  • 从单例中获取类构造函数并创建一个新实例

所有这些都可以视为黑客,应尽可能避免使用。例如。依靠内部软件包的结构可能会在新的软件包版本中引入重大更改,即使软件包changelog不假定重大更改也是如此。缓存失效的一个陷阱是,一个包可能包含许多应该或不应该重新导入的模块。

第一个解决方法似乎适用于此。

const createApi = require('dependency/createApi');
const instance = createApi(require.resolve('dependency/lib/providers'));

更清洁的解决方案是派生一个程序包,并添加创建多个实例的功能。