在多个NPM包之间共享Mongoose实例

Gre*_*reg 8 mongoose node.js npm express

为了将大型现有的Node + Express + Mongoose应用程序模块化为多个可安装的应用程序,每个应用程序都作为单独的NPM包开发,我们想知道在它们之间共享一个Mongoose实例是否是一个好主意?

假设我们有一套NPM包,每个包含客户端资产,Mongoose模型和使用Express实现的REST-API.它们确实具有一些共同特征,但基本上被认为是单独的可重复使用的人工制品.主机应用程序(也是基于Express的)在各种根URI下安装它们:

var discussions = require('discussions'),
    tickets     = require('tickets'),
    events      = require('events'),
    express     = require('express'),
    app         = express();

var environment = { ...see below... };

...

app.use('/events-api', events(environment));
app.use('/tickets-api', tickets(environment));
app.use('/discussions-api', discussions(environment));
Run Code Online (Sandbox Code Playgroud)

现在,由于events,ticketsdiscussions应用程序(独立的NPM包通过主机被拉package.json)使用猫鼬一样,主机应用程序本身,我们想通我们会在主机猫鼬例如通过某种environment对象,还包括其他的东西主机想要与已安装的应用共享.

你看到这种方法有任何明显的缺陷吗?在这种情况下挂载的应用程序不会将Mongoose指定为各自的依赖项package.json,并且它们不会 require('mongoose') 像通常那样完成,而是从负责将Mongoose实例连接到MongoDB的主机获取Mongoose实例.

如果这是一个坏主意,你建议每个子应用程序自己声明对Mongoose的依赖,每个NPM包将获得自己的Mongoose副本,并且每个都必须连接到MongoDB,对吧?

一些背景信息:

  • 我们确实希望将应用程序包含在主机应用程序中,在单个进程中运行,而不是具有多个Node实例.主机包含用于身份验证和其他事物的中间件.
  • 我们确实希望将应用程序作为单独开发的NPM软件包包含在我们构建的各种主机应用程序的版本化依赖项中,而不是仅将其源代码复制到主机应用程序.
  • 我们意识到在多个安装的应用程序之间重用相同的Mongoose实例将使它们共享相同的模型命名空间.

编辑:编辑完所有内容后澄清包结构npm install:

host/
  assets/
  models/
  routes/
  node_modules/
    express/ ...
    mongoose/ ...
    events/
      assets/ ...
      models/ ...
      routes/ ...
    tickets/
      assets/ ...
      models/ ...
      routes/ ...
    discussions/
      assets/ ...
      models/ ...
      routes/ ...
Run Code Online (Sandbox Code Playgroud)

也就是说,events,tickets,和discussions应用程序不包括猫鼬(或快递)自己的,而是设计用来依赖于suppliesd这些依赖始终存在的主机应用程序.

我们在这里假设一个NPM包tickets不能简单地 require从父母那里收集,对吗?

Bil*_*ill 6

如果要在其他NPM包之间重用Mongoose包,最好的方法是在顶级应用程序中安装共享包,然后使用它来初始化其他NPM包.

在顶层:

var db = require('myMongooseDb'),
    events = require('events')(db),
    ...
Run Code Online (Sandbox Code Playgroud)

然后你的事件包只需要导出一个以db作为参数的函数.