如何在node.js中重用mongodb连接
我正在使用mongodb的node-mongodb本地驱动程序来编写一个网站。
我有一个关于如何打开一次mongodb连接的问题,然后将它用在user.js
中的集合名称用户和comment.js
集合名称文章中
我想在db.js
打开数据库连接,然后插入/保存用户和post集合的数据
目前的代码,我的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
使用了user.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); }); }); }); };
您可以连接一次,然后根据需要多次重复使用它:
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({ ... });
接受的答案是3岁,它不会使用最新的节点mongodb本地驱动程序。 我修改了@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); }); } };
- 对于mongodb-native NodeJS中的每个subprocess,使用单连接池进行群集vs多连接池
- node-mongodb-native – 在每次调用期间,游标将返回null作为最后一个值
- 使用计数器集合在node-mongodb-native中自动增量
- 如何处理node-mongodb-native中的连接问题
- node-mongodb-native,callback,范围和TypeError
- 蓝鸟Promisfy.each,for循环和if语句?
- GridFS:清理所有未被引用的文件
- 将运行Node.js脚本作为CRON作业,而不closures数据库连接最终会杀死所有的RAM?
- MongoDB / Javascript范围问题