Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to share database connection param with mongoose/node.js

I'm using Mongoose to manage a Mongo database. My connection file is quite simple:

var mongoose = require('mongoose')

mongoose.connection.on("open", function(){
  console.log("Connection opened to mongodb at %s", config.db.uri)
});
console.log("Connecting to %s", config.db.uri)
mongoose.connect(config.db.uri)

global.mongoose = mongoose

Then in my app.js I just

require('./database)

and the "mongoose" variable is available globally. I'd prefer not to use globals (at least not directly). Is there a better way of sharing the database connection variable across node (I'm using express.js) via a singleton pattern or some other method?

like image 844
typeoneerror Avatar asked Mar 13 '12 18:03

typeoneerror


3 Answers

I just do the following in my app.js file:

var mongoose = require('mongoose');
mongoose.connect('mongodb://address_to_host:port/db_name');
modelSchema = require('./models/yourmodelname').YourModelName;
mongoose.model('YourModelName', modelSchema);
// TODO: write the mongoose.model(...) command for any other models you have.

At this point any file that needs access to that model can do:

var mongoose = require('mongoose');
YourModelName = mongoose.model('YourModelName');

And finally in your model, you can have the file written normally then export it at the bottom:

module.exports.YourModelName = YourModelName;

I don't know if this the best most awesome solution (just started wrapping my head around exporting modules about 2 days ago) but it does work. Maybe someone can comment if this is a good way to do it.

like image 169
AntelopeSalad Avatar answered Oct 12 '22 20:10

AntelopeSalad


if you follow commonjs exports

exports.mongoose = mongoose

let us say your module name is connection.js

you can require

   var mongoose = require('connection.js')

you can use mongoose connection

like image 31
Subba Rao Avatar answered Oct 12 '22 20:10

Subba Rao


I generally wrap my models like this

var MySchema = (function(){
//Other schema stuff 

//Public methods
GetIdentifier = function() {
return Id;
};

GetSchema = function() {
return UserSchema;
};

return this;
})();

if (typeof module !== 'undefined' && module.exports) {
exports.Schema  = MySchema;
}

And in my main class, I do this var schema = require('./schema.js').Schema; and call conn.model(schema.GetIdentifier(), schema.GetSchema()) and of course after calling connect, or createConnection. This allows me to plugin schema in to standard set of methods. This generalization is good because you can concentrate on your schema after you have mastered connection and error handling. I also extend the schema with plugins, and that allows me to share plugins with other schemas.

I was looking to see if some body has done this better, but can't see to find a good pattern, and I am fairly new to Mongo.

I hope this helps.

like image 2
Ovais Reza Avatar answered Oct 12 '22 22:10

Ovais Reza