typeoneerror
typeoneerror

Reputation: 56998

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?

Upvotes: 22

Views: 15037

Answers (3)

AntelopeSalad
AntelopeSalad

Reputation: 1726

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.

Upvotes: 29

Ovais Reza
Ovais Reza

Reputation: 86

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.

Upvotes: 2

Subba Rao
Subba Rao

Reputation: 10696

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

Upvotes: 6

Related Questions