2013-07-15 4 views
6

J'utilise node-mongodb-native driver avec mongodb pour écrire un site web.Comment réutiliser la connexion mongodb dans node.js

J'ai une question sur la façon d'ouvrir la connexion MongoDB une fois, puis utilisez les utilisateurs de nom de collection en user.js et des postes de nom de collection en comment.js

Je veux ouvrir la connexion db dans db.js puis insérer/enregistrer des données pour les utilisateurs et les messages collection

code Actuellement, mon 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}) 
); 

je db.js dans un user.js s suivre

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

et 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); 
     }); 
    }); 
    }); 
}; 
+0

Votre question ne ressemble pas à une question. Ce qui ne se passe pas, et s'il vous plaît poster le défi exact que vous faites face. – moka

Répondre

8

Vous pouvez connecter une fois, puis le réutiliser autant de fois que vous le souhaitez:

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

Et puis le réutiliser:

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({ ... 
}); 
+0

Ma réponse fait exactement ce que vous venez de demander. Lisez-le s'il vous plaît. – moka

+0

Avez-vous essayé de comprendre et d'appliquer les idées et le code de la réponse ci-dessus? Si non, merci de le faire. Si oui, veuillez partager ce qui ne fonctionne pas dans votre cas. – moka

+0

Parce que vous devez d'abord vous connecter à la base de données, avant de faire votre logique. – moka

0

Réponse acceptée er a 3 ans et ne fonctionnera pas avec le dernier pilote natif-mongodb-natif. J'ai modifié la réponse @moka et ajouté un peu de retard et réessayer la logique.

var MongoClient = require('mongodb').MongoClient; 
var events = require('events'); 
var event = new events.EventEmitter(); 
var database = null; 
var retries = 0; 
var delay = 300; 

setTimeout(connect,delay); 

// Use connect method to connect to the server 
function connect(){ 
    MongoClient.connect(process.env.MONGODB_URL, function(err, db) { 
     if(!err){ 
      console.log("Connected successfully to server"); 
      database = db; 
      event.emit('dbconnect'); 

     } else { 
      if(retries < 4){ 
       console.log('Retrying to connect db %s', retries++); 
       setTimeout(connect,delay); 
      } else { 
       console.log('Unable to connect db'); 
      } 
     } 
    }); 
} 


exports.get = function(fn) { 
    if(database !== null) { 
     fn(database); 
    } else { 
     event.on('dbconnect', function() { 
      fn(database); 
     }); 
    } 
}; 
Questions connexes