Node.js 如何在内部npm模块上使用Mongoose

Node.js 如何在内部npm模块上使用Mongoose,node.js,mongoose,npm,Node.js,Mongoose,Npm,如何在驻留在/node_modules中的npm模块内使用已打开的Mongoose连接 例如: 应用程序 普通的 节点单元 a_模块 模型 app.js触发器通过requiringcommon/db.js并执行connect()方法打开连接 稍后在app.js中,调用a_model/index.js其中需要a_model.js文件,然后发出一个findOne()调用,该调用从未执行过,因为它检测到没有连接打开,所以该调用永远排队,永远不会执行 我已经通过检查日志检

如何在驻留在
/node_modules
中的npm模块内使用已打开的Mongoose连接

例如:

  • 应用程序
    • 普通的
    • 节点单元
      • a_模块
        • 模型
app.js
触发器通过
requir
ing
common/db.js
并执行
connect()
方法打开连接

稍后在
app.js
中,调用
a_model/index.js
其中需要
a_model.js
文件,然后发出一个
findOne()
调用,该调用从未执行过,因为它检测到没有连接打开,所以该调用永远排队,永远不会执行

我已经通过检查日志检查了连接是否已经打开,因此问题是其他的

值得注意的是,我能够很好地进行类似的设置,但是没有将
a_模块
设置为
npm
模块,而是将其设置为
app
文件夹下的常规目录

解决方案

最后,在下面这些令人敬畏的家伙的帮助下,我终于让它正常工作了

通过使用
global
nodejs对象,我能够公开数据库连接,而不会使代码混乱:

db.js:

global.db = mongoose;
mongoose = global.db;
a_model.js:

global.db = mongoose;
mongoose = global.db;

参考:选项1:

// app.js
var mongoose = require('mongoose');
var db = require('db')(mongoose);
var a_module = require('a_module')(mongoose);
备选案文2:

re-check package.json for each modules. Make sure they are resolvable to a single version of mongoose.

BAD DEPENDENCIES:
app.js need  {"mongoose": "3.8"}
a_module need {"mongoose": "3.7"}
=> npm install will download 2 separated version of mongoose. 

GOOD DEPENDENCIES:
app.js need {"mongoose": ">= 3.8"}
a_module need {"mongoose": ">= 3.7"}
=> npm install will download 1 mongoose version for all app and a_module

节点缓存对
require
的调用,这样您就不必在每个
require
上重新输入模块

但是,不能保证子依赖项使用相同的对象:

mongoose
连接依赖于此缓存机制来保持与MongoDB的开放连接。因此,在您的例子中,当您将
a_模块
移动到它自己的模块中时,实际上您正在实例化两个
mognose
对象,并且只有您的第一个
mongoose
对象正在打开连接。第二个对象从不打开连接


你可以通过让每个模块建立自己的连接来解决这个问题,或者你必须返回到
a\u模块
而不是一个独立的包。

a\u模块是否有自己的
node\u模块
文件夹,其中包含自己的
mongoose
实例?@jibsales:是的。这可能是问题的根源吗?是的!看看下面我的答案。2017年还会是这样吗?@MatthiasMax不知道,我后来转到了
Sequelize
,而不是
Mongoose
。尝试一下,如果您达到以下要求,请在此处发布更新注释:)我选中了选项2,并且app.js和内部模块之间共享了mongoose版本,问题仍然存在。删除目录app/node\u modules/a\u modules/node\u modules,然后再次调用npm install。它应该是一个版本和一个文件夹的mongoose。是的,它只是一个单一的mongoose模块在整个应用程序,但它仍然不工作。我认为选项1是一个解决方案,但我不想把它传递给mongoose对象的内部回调,因为当应用程序有几个嵌套级别(比如我的,有3个)时,可能会变得非常糟糕。哦,我不知道,谢谢diosney。我现在必须阅读文件。这并不能回答传递连接的问题。。。。换句话说,猫鼬的例子。有了这条信息,我可以跟踪并解决这个问题。谢谢