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

时间:2013-12-19 02:08:12

标签: node.js mongoose npm

如何在位于/node_modules npm 模块中使用 Mongoose 已打开的连接?

例如:

app.js触发器通过requir common/db.js并执行connect()方法打开连接。

稍后在app.js中调用a_model/index.js,其中需要a_model.js文件,然后发出findOne()调用,该调用永远不会执行,因为它检测到否连接已打开,因此呼叫将永久排队,永远不会执行。

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

值得注意的是,我能够使类似的设置正常工作,但不是让a_module成为npm模块,而是app文件夹下的常规目录。

最后,我在下面很棒的家伙的帮助下正常工作。

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

db.js:

global.db = mongoose;

a_model.js:

mongoose = global.db;

和voilá!

参考:http://productbuilder.wordpress.com/2013/09/06/using-a-single-global-db-connection-in-node-js/

2 个答案:

答案 0 :(得分:5)

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

http://nodejs.org/docs/latest/api/modules.html#modules_caching

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

http://nodejs.org/docs/latest/api/modules.html#modules_module_caching_caveats

mongoose连接依赖于此缓存机制来保持与MongoDB的开放连接。因此,在您的情况下,当您将a_module移动到其自己的模块中时,您实际上是实例化两个mognoose对象,并且只有您的第一个mongoose对象正在打开连接。第二个对象永远不会打开连接。

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

答案 1 :(得分:1)

选项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