I'm using node-mongodb-native driver with mongodb to write a website.

I have a question about how to open mongodb connection once, then use it in collection name users in user.js and collection name posts in comment.js

I want to open db connection in db.js then to insert / save data for users and posts collection

Currently code,my db.js

var Db = require('mongodb').Db,
    Connection = require('mongodb').Connection,
    Server = require('mongodb').Server;
module.exports = new Db(
    'blog', 
    new Server('localhost', Connection.DEFAULT_PORT, {auto_reconnect: true})
);

I used db.js in user.js as follow

var mongodb = require('./db');

function User(user){
  this.name = user.name;
  this.password = user.password;
  this.email = user.email;
};

module.exports = User;

User.prototype.save = function(callback) {//save user information
  //document to save in db
  var user = {
      name: this.name,
      password: this.password,
      email: this.email
  };
  mongodb.close();
  //open mongodb database
  mongodb.open(function(err, db){
    if(err){
      return callback(err);
    }
    //read users collection
    db.collection('users', function(err, collection){
      if(err){
        mongodb.close();
        return callback(err);
      }
      //insert data into users collections
      collection.insert(user,{safe: true}, function(err, user){
        mongodb.close();
        callback(err, user);//success return inserted user information
      });
    });
  });
};

and comment.js

var mongodb = require('./db');

function Comment(name, day, title, comment) {
  this.name = name;
  this.day = day;
  this.title = title;
  this.comment = comment;
}

module.exports = Comment;

Comment.prototype.save = function(callback) {
  var name = this.name,
      day = this.day,
      title = this.title,
      comment = this.comment;
  mongodb.open(function (err, db) {
    if (err) {
      return callback(err);
    }
    db.collection('posts', function (err, collection) {
      if (err) {
        mongodb.close();
        return callback(err);
      }
      //depend on name time and title add comment
      collection.findAndModify({"name":name,"time.day":day,"title":title}
      , [ ['time',-1] ]
      , {$push:{"comments":comment}}
      , {new: true}
      , function (err,comment) {
          mongodb.close();
          callback(null);
      });   
    });
  });
};
share|improve this question
    
Your question does not sound like a question. What is not happening, and please post exact challenge you are facing. – moka Jul 15 '13 at 8:31
up vote 8 down vote accepted

You can connect once, and then reuse it as many times as you want:

var mongodb = require('mongodb');
var events = require('events');
var event = new events.EventEmitter();
var access = new mongodb.Server(host, port, { });
var client = null;

new mongodb.Db('YOUR DATABASE', access, { safe: true, auto_reconnect: true }).open(function (err, c) {
  if (!err) {
    client = c;
    console.log('database connected');
    event.emit('connect');
  } else {
    console.log('database connection error', err);
    event.emit('error');
  }
});

exports.get = function(fn) {
  if(client) {
    fn(client);
  } else {
    event.on('connect', function() {
      fn(client);
    });
  }
};

And then reuse it:

var db = require('./db');
var items;
db.get(function(client) {
  items = new mongodb.Collection(client, 'collection');
});

// then anywhere in your code
db.get(function() {
  // items.find({ ...
});
share|improve this answer
    
My answer does exactly what you've just asked. Please read it. – moka Jul 15 '13 at 11:05
    
Have you tried to understand and apply ideas and code from answer above? If no, please do so. If yes - please share what is exactly failing in your case. – moka Jul 16 '13 at 14:11
    
Because you need first to actually connect to database, before you do any of your logic. – moka Jul 17 '13 at 9:41
    
Connection happens asynchronously, so if you call .open - it is not going to be available straight away after. – moka Jul 17 '13 at 10:40
    
I've improved the code above, so please review it, and let me know results of your attempts. Async singleton pattern is used. – moka Jul 17 '13 at 15:01

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.