如何在 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
使用 Node.js 连接到 MongoDB 的最佳方式 [重复]
Kubernetes node.js 容器无法连接到 MongoDB Atlas