4

I've started using the Q Promise package in a simple node.js application. So I'm interested in how I can close the db connection after all promise sequence is complete.

Example:

var toDbConnectionString = function(dbSettings) {
    return "mongodb://" +
        dbSettings.user + ":" +
        dbSettings.password + "@" +
        dbSettings.url;
};

var connectionString = toDbConnectionString(dbSettings);

Q.nfcall(
    MongoClient.connect,
    toDbConnectionString(dbSettings))
.then(function(db) {
    return Q.ninvoke(db, "collectionNames");
})
.then(function(collections) {
    console.log(collections);
})
.catch(function() {
    console.log(arguments);
});

I want to close the connection after displaying the collection names but there's no db context in this anonymous function.

Is there the way how to handle such cases with the promise pattern?

4
  • Why not capture the value of db and use it in the final step? Commented Oct 1, 2013 at 11:03
  • I can use this solution but maybe there's a more elegant way. Commented Oct 1, 2013 at 14:20
  • Since you should generally have only one connection to the DB per Node instance, it certainly would be expected. Further, you've got to consider that normally you'll need to use it in other places in your code, so it will need to be accessible. For example, what if you wanted to later count the number of documents per collection (using their collection names)? Commented Oct 1, 2013 at 14:41
  • You may well be interested in mongojs which offers a much friendlier API and auto-connects for you and mongod which builds on top of that by providing promises instead of callbacks as the API Commented Oct 7, 2013 at 22:39

2 Answers 2

4

If you don't want to do nesting (I certainly don't...) then you can just do like so:

var toDbConnectionString = function(dbSettings) {
    return "mongodb://" +
        dbSettings.user + ":" +
        dbSettings.password + "@" +
        dbSettings.url;
};

var connectionString = toDbConnectionString(dbSettings);
var db;

Q.nfcall(
    MongoClient.connect,
    toDbConnectionString(dbSettings))
.then(function(_db) {
    db = _db;
    return Q.ninvoke(db, "collectionNames");
})
.then(function(collections) {
    console.log(collections);
})
.catch(function() {
    console.log(arguments);
})
.finally(function() {
    if (db) db.close();
});
Sign up to request clarification or add additional context in comments.

Comments

3

You can nest then-callbacks arbitrarily. It's getting closer to the pyramid of doom, yes, but it's the only way to keep arguments in scope. In your case:

Q.nfcall(
    MongoClient.connect,
    toDbConnectionString(dbSettings))
.then(function(db) {
    return Q.ninvoke(db, "collectionNames")
    .then(function(collections) {
        console.log(collections);
    }).finally(function() {
        db.close();
    });
})
.catch(console.log.bind(console));

However, notice that you usually wouldn't connect and close too often.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.