如何在全球范围内提供mongoose连接

时间:2013-04-11 20:02:05

标签: node.js express mongoose

我使用快递3.x和mongoose 3.6.4。

到目前为止,我一直在我的express apps.js文件中创建一个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()并创建一个可以类似方式使用的连接池。我想在应用程序启动时建立一个连接池,并为所有模型使用池。所以,我试过这个:

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

但模型不会自动共享连接。所以,我尝试了各种各样的东西,比如导出连接并尝试在模型中使用它。但除了为每个模型建立单独的连接之外,没有任何其他工作。

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

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

/************ 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, ...
});

按以下方式导出:

exports.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.createConnection替换mongoose.connect()并让它在多个模块中工作的具体示例。谢尔盖的答案看起来很有希望,但我不明白如何在路由文件中引用该模型。我试过了:

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

但无法让它发挥作用。它不断抛出引用错误。

谢谢!

3 个答案:

答案 0 :(得分:2)

在模型文件夹中

创建index.js

e.g。

    module.exports = function (mongoose,  dbconn) {
        return {

            modelname:  require("./file" )(mongoose, dbconn),
            modelname2:  require("./file2" )(mongoose,  dbconn),
   };
};

然后将其加载到您通过

创建数据库连接的主启动文件文件中
var models    = require("./models")(mongoose,dbconn);

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

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

  return dbconn.model("modelname", schema, "collectioname");
};

依旧......

答案 1 :(得分:1)

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);
        }

    };
})();

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

答案 2 :(得分:-1)

我希望现在能够解决这个问题,但万一有人发现它有用。 简而言之,改为

var conn = mongoose.createConnection(..)

要求为此连接注册所有模式。意思是,而不是User = mongoose.model(...),您需要User = db.model(...)

有关此处链接的更多详细信息:diff between .createConnection vs .connect