6 votes

Comment réutiliser une connexion mongodb en node.js ?

J'utilise le pilote node-mongodb-native avec mongodb pour écrire un site web.

J'ai une question sur la façon d'ouvrir une connexion mongodb une fois, puis de l'utiliser dans la collection nom utilisateurs dans la base de données. user.js et les postes de nom de collection dans comment.js

Je veux ouvrir une connexion à la base de données dans db.js puis d'insérer / sauvegarder les données pour les utilisateurs et la collection de messages

Code actuel, 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})
);

J'ai utilisé db.js en user.js comme suit

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

8voto

moka Points 6143

Vous pouvez vous connecter une fois, puis la 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 ensuite 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({ ...
});

2voto

Sushil Singh Points 97

La réponse acceptée date de 3 ans et ne fonctionne pas avec le dernier pilote node-mongodb-native. J'ai modifié la réponse de @moka et ajouté un délai et une logique de relance.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X