Reputation: 23
I'm trying to implement an elegant code to resolve the pool of connections with node-mongoldb-native. However, I'm not succeeding to do a module for this. I'm sure that is something about hoisting, but I can't get it.
Mongodb.js
'use strict';
var client = require('mongodb').MongoClient;
var connectionString = undefined;
var db = undefined;
switch(process.env.NODE_ENV) {
case 'production':
connectionString = process.env.MONGOLAB_URI;
break;
case 'test':
connectionString = 'mongodb://localhost:27017/test';
break;
default:
connectionString = 'mongodb://localhost:27017/development';
}
client.connect(connectionString, function(err, database) {
if (err) throw err;
console.log('MongoDB running on ' + (process.env.NODE_ENV || 'development') + ' environment');
database.on('error', function(err) {
throw err;
});
db = database;
});
module.exports = db;
App.js
var express = require('express');
var app = express();
var db = require('./lib/mongodb');
var professional = require('./routes/professional');
app.use('/professional', professional);
db.listCollections().toArray()
.then(function(items) {
console.log(items);
});
module.exports = app;
Console
Julios-MacBook-Air:klou juliocoelho$ ./bin/www
/Users/juliocoelho/Projects/klou/app.js:10
db.listCollections().toArray()
^
TypeError: Cannot read property 'listCollections' of undefined
at Object.<anonymous> (/Users/juliocoelho/Projects/klou/app.js:10:3)
at Module._compile (module.js:435:26)
at Object.Module._extensions..js (module.js:442:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:311:12)
at Module.require (module.js:366:17)
at require (module.js:385:17)
at Object.<anonymous> (/Users/juliocoelho/Projects/klou/bin/www:3:11)
at Module._compile (module.js:435:26)
at Object.Module._extensions..js (module.js:442:10)
Upvotes: 2
Views: 170
Reputation: 103455
Because of the asynchronous nature of node.js, you need to export a callback assignation method to get the variable, and call it on the async execution. The following code explains it better:
'use strict';
var client = require('mongodb').MongoClient;
var connectionString = undefined;
var db, callback;
switch(process.env.NODE_ENV) {
case 'production':
connectionString = process.env.MONGOLAB_URI;
break;
case 'test':
connectionString = 'mongodb://localhost:27017/test';
break;
default:
connectionString = 'mongodb://localhost:27017/development';
}
client.connect(connectionString, function(err, database) {
if (err) throw err;
console.log('MongoDB running on ' + (process.env.NODE_ENV || 'development') + ' environment');
database.on('error', function(err) {
throw err;
});
db = database;
if( typeof callback == 'function' ){
callback(db);
}
});
module.exports = function(cb){
if(typeof db != 'undefined'){
cb(foo); // If db is already defined, don't wait.
} else {
callback = cb;
}
}
App.js
var dbModule = require('./lib/mongodb');
dbModule(function(db){
//Here code using db;
db.listCollections()
.toArray()
.then(function(items) {
console.log(items);
});
});
Upvotes: 1