-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmongo.js
66 lines (56 loc) · 1.86 KB
/
mongo.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
var util = require('util')
, EventEmitter = require('events').EventEmitter
, mongodb = require('mongodb')
, Db = mongodb.Db
, Connection = mongodb.Connection
, Server = mongodb.Server
, BSON = mongodb.BSONNative;
function Mongo(options) {
var self = this
, env = options.env || process.env.NODE_ENV || 'development'
, name = options.name
, host = options.host || process.env.MONGO_HOST || 'localhost'
, port = options.port || process.env.MONGO_PORT || Connection.DEFAULT_PORT
, user = options.user || process.env.MONGO_USER
, pass = options.password || process.env.MONGO_PASSWORD
, collections = options.collections
, server = new Server(host, port, {})
, db = new Db(name + '_' + env, server, { native_parser: true })
, objs = {
server: server,
connection: db,
lib: mongodb,
BSON: BSON }
, ready = false;
EventEmitter.call(self);
// open the database connection, authenticating if necessary
db.open(function(err, db) {
if (err) return self.emit('error', err);
if (user) {
db.authenticate(user, pass, loadCollections);
} else {
loadCollections();
}
});
// still fire ready if a new "ready" listener comes in after load
self.on('newListener', function(evt, listener) {
if ((evt === 'ready') && ready) listener(objs);
});
function loadCollections() {
var threads = collections.length;
// load collections
collections.forEach(function(name) {
db.collection(name, function(err, collection) {
if (err) return self.emit('error', err);
objs[name] = collection;
console.log('loaded collection ' + name);
if (--threads === 0) {
ready = true;
self.emit('ready', objs);
}
});
});
}
};
util.inherits(Mongo, EventEmitter);
module.exports = function(options) { return new Mongo(options); };