我的模块注入了一个mongoose实例,但现在它们都使用了最后一个猫鼬上设置的数据库。
例如,我的主模块创建了许多模块,然后在它们上调用init。
var mongoose = require('mongoose');
//...
mongoose.connect(connString);//specific to finance
var finance = require('finance').init({db:mongoose});
在我注入mongoose实例之前,财务模块本身需要mongoose,因为它位于node_modules中,它获得了它自己的mongoose。现在;无论我制作了多少个主要模块以及我多少次调用它都需要它总是得到它第一次获得的实例。
因此,创建的所有模块都将连接到最后一次连接设置的任何模块。
可以使用createConnection,但仍然不确定如何注入mongoose,我试过了:
var mongoose = require('mongoose');
//...
var c = mongoose.createConnection(connString);//specific to finance
mongoose.connection=c;
var finance = require('finance').init({db:mongoose});
现在我收到错误like Cannot overwrite
finance model once compiled.
不知何故,在同一模块中获取另一个mongoose实例非常困难。这很有趣,因为根据猫鼬,你应该能够为不同的模型使用不同的连接,但是因为你需要一个mongoose实例来定义模型,那么你如何注入它?要求不断反复返回同一个实例。
尝试以下但两个都不起作用。
console.log('deleting mongoose cache:',require.cache.mongoose=undefined);
//or this one
console.log('deleting mongoose cache:',delete require.cache.mongoose);
所以问题是:如何在我的模块中注入mongoose,这些模块具有需要唯一数据库的模型?如果main设置了mongoose实例和连接以注入到模型中,那么如何防止它一遍又一遍地创建相同的?
如果可以使用createConnection创建唯一的连接,那么我将如何注入模块?通过这种连接,我无法创建模型,需要一个mongoose实例。如果每个模型需要调用require来获取它,那么mongoose是不可注射的。
答案 0 :(得分:2)
所以猫鼬使用单身模式。当您执行require("mongoose")
时,每次都会在mongoose/lib/index.js
(source code link here)的底部看到相同的构造函数实例。 var mongoose = module.exports = exports = new Mongoose;
要获取唯一实例,请使用以下模式:
var singleton = require("mongoose")
var unique = new singleton.constructor();
//now use "unique" just as you would "mongoose"