2013-07-15 8 views
6

Korzystam z mongołowego sterownika node-mongodb z mongodb do napisania strony internetowej.Jak ponownie wykorzystać połączenie mongodb w węźle node.js

Mam pytanie jak otworzyć połączenie MongoDB raz, a następnie używać go w kolekcji użytkowników nazwisko w user.js i posty nazwa kolekcji w comment.js

chcę otworzyć połączenia db w db.js następnie włożyć/zapisywać dane dla użytkowników i posty kolekcja

kod Obecnie, moja 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}) 
); 

użyłem db.js w user.js się s śledzić

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

i 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

Twoje pytanie nie brzmi jak pytanie. Co się nie dzieje i proszę postawić dokładnie wyzwanie, przed którym stoisz. – moka

Odpowiedz

8

można podłączyć jeden raz, a następnie używać go tyle razy, ile chcesz:

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

A następnie używać go:

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

Moja odpowiedź spełnia dokładnie to, o co prosiłeś. Proszę przeczytaj to. – moka

+0

Czy próbowałeś zrozumieć i zastosować pomysły i kod z odpowiedzi powyżej? Jeśli nie, zrób to. Jeśli tak, proszę podzielić się tym, co dokładnie nie udaje się w twoim przypadku. – moka

+0

Ponieważ musisz najpierw połączyć się z bazą danych, zanim wykonasz jakąkolwiek logikę. – moka

0

Przyjęto odpowiedź er ma 3 lata i nie będzie działać z najnowszym rodzimym sterownikiem node-mongodb. Zmodyfikowałem odpowiedź @moka i dodałem trochę opóźnień i logikę ponowną.

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