node.js - 在多个 NPM 包之间共享一个 Mongoose 实例

标签 node.js express mongoose npm

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

假设我们有一套 NPM 包,每个包都包含客户端 Assets , 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));

现在,由于 eventsticketsdiscussions 应用程序(单独的 NPM 包 通过主机 package.json 拉入)使用 Mongoose,就像 主机应用程序本身,我们认为我们将传入主机 Mongoose 实例 通过某种 environment 对象,其中还包括其他 主机希望与已安装的应用程序共享的内容。

您是否发现这种方法有任何明显的缺陷?挂载的应用 在这种情况下,将将 Mongoose 指定为它们的依赖项 各自的 package.json,它们将 require('mongoose') 像往常一样,而是从主机获取 Mongoose 实例 负责将其连接到 MongoDB。

如果这是个坏主意并且您建议每个子应用程序都声明一个依赖项 独立于 Mongoose,每个 NPM 包都会有自己的 Mongoose 的副本,每个都必须连接到 MongoDB,对吗?

一些背景信息:

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

编辑:在所有npm installed 之后阐明包结构:

host/
  assets/
  models/
  routes/
  node_modules/
    express/ ...
    mongoose/ ...
    events/
      assets/ ...
      models/ ...
      routes/ ...
    tickets/
      assets/ ...
      models/ ...
      routes/ ...
    discussions/
      assets/ ...
      models/ ...
      routes/ ...

也就是说,eventsticketsdiscussions 应用不包括 他们自己的 Mongoose(或 Express),但被设计为依赖于始终存在的 提供这些依赖项的主机应用程序。

我们在这里假设像 tickets 这样的 NPM 包不能简单地 需要来自 parent 的东西,对吗?

最佳答案

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

在顶层:

var db = require('myMongooseDb'),
    events = require('events')(db),
    ...

然后您的事件包只需要导出一个将数据库作为参数的函数。

关于node.js - 在多个 NPM 包之间共享一个 Mongoose 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12754604/

相关文章:

javascript - 通过 API post 请求将数十万个 JSON 对象发送到数据库

javascript - 有条件地从数据库中按多列获取行的函数

node.js - 如何防止 mongoose 中的字段更新

node.js - 如何动态更改 Mongoose 提供程序中集合或数据库的名称,Nestjs?

Node.js Websockets 套接字.IO

node.js - 如何将 MongoDB 集合中的数据存储为堆?

javascript - Mongoose: TypeError: 无法读取未定义的属性 'findOne'

javascript - 如何在 Cloudant 的 _user 数据库中分配角色

mysql - 更新 ReactJS 中检索的 SQL 数据的有效方法

node.js - Mongodb查找数组长度大于指定大小