Подтвердить что ты не робот

Как сделать доступное соединение мангуста глобально

Я использую express 3.x и mongoose 3.6.4.

До сих пор я создавал соединение mongoose в моем экспресс файле apps.js следующим образом:

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

И затем я разделил свои модели на отдельные файлы, например модели/пользователя, следующим образом:

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

который экспортировался следующим образом:

export.User = mongoose.model('Пользователь', userSchema);

Затем модели используются в различных файлах маршрутизации, например:

/****************auth.js**************/
var User = require('./models/user').User;

exports.createAccount = function(req, res){
    var user = new User({});
    . . . 
    user.save(function(err, usr){

    });
};

Я ищу конкретный пример того, как заменить mongoose.connect() на mongoose.createConnection и заставить его работать с несколькими модулями. Ответ Сергея выглядит многообещающим, но я не понимаю, как ссылаться на модель в файле маршрутизации. Я пробовал:

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

Но он не мог заставить его работать. Он продолжает бросать опорную ошибку.

Спасибо!

4b9b3361

Ответ 1

Я знаю, что прошло какое-то время, но я нашел эту статью, и мне было интересно, что вы, ребята, думаете об этом, выглядит элегантно. https://productbuilder.wordpress.com/2013/09/06/using-a-single-global-db-connection-in-node-js/

В основном говорят использовать механизм Node.js global.varName для общего доступа к глобальному соединению.

Кстати, я пробовал это сам, и он работал без проблем.

Ответ 2

в вашей папке моделей создайте index.js

например.

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

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

затем загрузите его в файл основного файла запуска, где вы создаете соединение с db через

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

и т.д....

Ответ 3

Этот примерный проект на 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);
        }

    };
})();

Я делаю dir, называемый "моделями" в моем основном каталоге приложений, и помещаю его в папку и требую, а затем вызываю register_models();

Ответ 4

Я надеюсь, что это разрешится к настоящему времени, но на всякий случай кто-то найдет его полезным. Короче говоря, переход на

var conn = mongoose.createConnection(..)

Требуется, чтобы все схемы были зарегистрированы для этих соединений. Значение вместо User = mongoose.model(...) вам нужно User = db.model(...)

Подробнее со ссылками здесь: diff между .createConnection vs .connect