Promise and nodejs MongoDB driver
mongodb, node.js, promise
Solution
Manually promisifying an API is dangerous, I suggest something along the lines of:
TaskBroker.prototype._connectMongo = Q.nfcall(MongoClient.connect,
'mongodb://127.0.0.1:27017/test',
{});
TaskBroker.prototype.connectMongo = function(){
return this._connectMongo().then(function(db){
console.log("Hello");
// self.stuff...
return 42;
}).catch(function(e){
console.err("connection error",e); // log the connection error, or handler err
throw e; // don't mark as handled, propagate the error.
});
};
With Bluebird promises, that'd look something like:
var MongoClient = Promise.promisifyAll(require("mongodb").MongoClient);
TaskBroker.prototype.connectMongo = function(){
return MongoClient.connectAsync().then(...
// Bluebird will automatically track unhandled errors
};
Problem
I would like to make a promise with the MongoDB driver. I wrote the following code: ``` var TaskBroker = function () { this.queueName = 'task_queue'; this.rabbit = {}; this.mongo = {}; }; TaskBroker.prototype.connectRabbit = function() { var self = this; return amqp.connect('amqp://localhost') .then(function(connection) { self.rabbit.connection = connection; return connection.createChannel() }) .then(function(channel) { self.rabbit.channel = channel; return channel.assertQueue(self.queueName, {durable: true}); }) }; TaskBroker.prototype.connectMongo = function() { console.log('Connect Mongo'); var self = this; var defer = q.defer(); MongoClient.connect('mongodb://127.0.0.1:27017/test', {}, defer.makeNodeResolver()); return defer.promise.then(function(db) { self.mongo.db = db; console.log('hello'); return 42; }); }; TaskBroker.prototype.connect = function () { var self = this; return this.connectRabbit() .then(self.connectMongo); }; ``` Do you have any idea why I don't have the output `hello` when I call the method `connect`: ``` taskBroker.connect() .then(function(result) { console.log('Disconnected'); taskBroker.disconnect(); }); ```