如何在 node.js 中重用 mongodb 连接

Posted

技术标签:

【中文标题】如何在 node.js 中重用 mongodb 连接【英文标题】:How to reuse mongodb connection in node.js 【发布时间】:2013-07-12 22:28:01 【问题描述】:

我正在使用node-mongodb-native驱动和mongodb来写一个网站。

我有一个关于如何打开一次mongodb连接的问题,然后在user.js的集合名称用户和comment.js的集合名称帖子中使用它

我想在db.js 中打开数据库连接,然后为用户和帖子集合插入/保存数据

目前正在编码,我的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)
);

我在user.js中使用db.js如下

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

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

【问题讨论】:

你的问题听起来不像一个问题。没有发生什么,请发布您面临的确切挑战。 【参考方案1】:

您可以连接一次,然后根据需要多次重复使用它:

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

然后重复使用它:

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( ...
);

【讨论】:

我的回答完全符合您的要求。请阅读。 您是否尝试过理解和应用上述答案中的想法和代码?如果没有,请这样做。如果是 - 请分享您的案例中到底发生了什么。 因为在执行任何逻辑之前,您首先需要实际连接到数据库。 连接是异步发生的,所以如果你调用.open - 它不会马上可用。 我已经改进了上面的代码,所以请检查它,让我知道你的尝试结果。使用异步单例模式。【参考方案2】:

接受的答案是 3 岁,它不适用于最新的 node-mongodb-native 驱动程序。我修改了@moka 的答案并添加了一些延迟和重试逻辑。

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

【讨论】:

以上是关于如何在 node.js 中重用 mongodb 连接的主要内容,如果未能解决你的问题,请参考以下文章

Node.js - 在 Heroku 上使用 MongoHQ 连接到 MongoDB

如何将 HTML 页面连接到 MongoDB?

使用 Node.js 连接到 MongoDB 的最佳方式 [重复]

Kubernetes node.js 容器无法连接到 MongoDB Atlas

在 MEAN 堆栈中,如何进行一次性 MongoDB 索引?

将 Nowjs 托管的 Node.js 服务器连接到 MongoDB Atlas DB