为了将大型现有的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));
现在,由于events
,tickets
和discussions
应用程序(独立的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/ ...
也就是说,events
,tickets
,和discussions
应用程序不包括猫鼬(或快递)自己的,而是设计用来依赖于suppliesd这些依赖始终存在的主机应用程序.
我们在这里假设一个NPM包tickets
不能简单地
require
从父母那里收集,对吗?