如何在位于/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/
答案 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