如何使mongoose全球连接

我使用Express 3.x和mongoose3.6.4。

到目前为止,我一直在我的快速apps.js文件中创build一个mongoose连接,如下所示:

var mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1:27017/mytest'); 

然后我将模型分成不同的文件,如models / user,如下所示:

 var mongoose = require("mongoose"); var Schema = mongoose.Schema; var ObjectId = Schema.ObjectId; var userSchema = new Schema({ userId: ObjectId, givenName:String ... }); exports.User = mongoose.model('User', userSchema); 

然后在多个路由文件中,我使用了如下的User模型:

 var User = require('./models/user').User; User.findById(id, function(err, user){ ... 

这对当地的发展非常有效。 所有的模型共享相同的连接。

但是现在我想使用mongoose.createConnection()并创build一个可以类似方式使用的连接池。 我想在应用程序启动时build立一个连接池,并为所有模型使用池。 所以,我试过这个:

 var conn = mongoose.createConnection("localhost","dpatest", 27017,{user:"???",pass:"???"}); 

但是模型不会自动共享连接。 所以,我已经尝试了各种各样的东西,如导出连接,并试图在模型中使用它。 但除了为每个模型设置单独的连接外,没有任何工作。

有人可以解释如何使用mongoose.createConnection()来创build单个连接池吗?

这是关于我的问题的更多信息:

 /************ app.js *****************/ var http = require('http'); var path = require('path'); var express = require('express'); //these are my routing files var auth = require('./src/auth'); var profile = require('./src/profile'); var admin = require('./src/admin'); var tx = require('./src/tx'); var system = require('./src/system'); var servicing = require('./src/servicing'); var dbUri; var dbUser = "?????"; var dbPass = "?????"; //here are my configurations for development and production app.configure('development', function(){ app.set('port', 3460); app.use(express.errorHandler()); dbUri = "mongodb://mongodb://127.0.0.1:27017/dpatest"; }); app.configure('production', function(){ app.set('port', 3461); dbName = 'dpa'; dbUri = "mongodb://"+dbUser+":"+dbPass+"@ds052525.mongolab.com:51437/dpa"; }); /* this is what I was originally using for development and want to change for deployment */ mongoose.connect(dbUri); 

这就是我正在计划转移到:

 var conn = mongoose.createConnection(dbUri); 

我的模型(5种不同的模型)位于应用程序根目录下的一个名为src / models的目录中。 例如用户模型:

 /************ user.js *************/ var mongoose = require("mongoose"); var Schema = mongoose.Schema; var ObjectId = Schema.ObjectId; var userSchema = new Schema({ userId: ObjectId, givenName: String, ... }); 

出口情况如下:

user = mongoose.model('User',userSchema);

然后,在各种路由文件中使用模型,如下所示:

 /****************auth.js**************/ var User = require('./models/user').User; exports.createAccount = function(req, res){ var user = new User({}); . . . user.save(function(err, usr){ }); }; 

我正在寻找一个具体的例子,如何用mongoose.createConnectionreplacemongoose.connect(),并让它在多个模块中工作。 谢尔盖的答案看起来很有希望,但我不明白如何引用路由文件中的模型。 我试过了:

 var User = require(../models).User 

但不能得到它的工作。 它一直抛出一个参考错误。

谢谢!

       

网上收集的解决方案 "如何使mongoose全球连接"

在您的模型文件夹中创buildindex.js

例如

  module.exports = function (mongoose, dbconn) { return { modelname: require("./file" )(mongoose, dbconn), modelname2: require("./file2" )(mongoose, dbconn), }; }; 

然后加载它在你创build你的数据库连接的主要启动文件文件中

 var models = require("./models")(mongoose,dbconn); 

模型文件夹中的示例模型文件应该如下所示:

 module.exports = function (mongoose, dbconn) { /* * */ var schema = new mongoose.Schema({ /** * field * @type String */ field: String...... }); return dbconn.model("modelname", schema, "collectioname"); }; 

等等….

GitHub上的这个示例项目是一个非常简单的方法来实现您的目标。 这是优雅和有效的: https : //github.com/fbeshears/register_models 。 主要代码是:

 (function(){ module.exports = function(){ var mongoose = require('mongoose'); var Schema = mongoose.Schema; var files = ['kitten.js', 'comments.js']; var fn = 0; for(fn in files) { var path_fn = "./" + files[fn]; var exported_model = require(path_fn); exported_model(mongoose, Schema); } }; })(); 

我在我的主要应用程序目录下创build一个名为'models'的dir,并将其放在该文件夹中,然后调用register_models();

我知道这已经有一段时间了,但是我发现了这篇文章,我想知道你们是怎么想的,它看起来很优雅。 https://productbuilder.wordpress.com/2013/09/06/using-a-single-global-db-connection-in-node-js/

它基本上说是使用Node.js的global.varName机制来全局共享连接。

顺便说一句,我已经试过了我的自我,它无缝工作。

我希望现在能解决这个问题,但以防万一有人发现它有帮助。 总之转换到

 var conn = mongoose.createConnection(..) 

要求所有的模式注册这个连接。 意思是,而不是User = db.model(...)你需要User = db.model(...)

有关链接的更多细节: .createConnection与.connect之间的差异