user4495602
user4495602

Reputation:

Wait until MongoDB has completed its query without using callbacks

I have an issue with the asynchrous programming model in Node.js.

I know this has been asked before, but so far I haven't found anything that I can use to solve my issue.

How do I force console.log from running before dbQueryName has been invoked and username has gotten its value from it?

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

function dbQueryName() {
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("mydb");

        dbo.collection("users").findOne({}, function(err, result) {
            if (err) throw err;

            return result.name
            db.close();
        });
    });
}

var username = dbQueryName();

// Wait until dbQueryName() has been invoked and username has gotten its value before running this
console.log(username);

I have managed to get it working using a callback parameter in the function, but is there a way to do this with less code and indentation?

function dbQueryName(callback) {
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        var dbo = db.db("mydb");

        dbo.collection("users").findOne({}, function(err, result) {
            if (err) throw err;

            callback(result.name)
            db.close();
        });
    });
}


dbQuery(function(result){
    var username = result
    console.log(username);
});

Upvotes: 2

Views: 4669

Answers (1)

Donskelle
Donskelle

Reputation: 66

Yes if you are not passing a callback to MongoClient.connect or collection.findOne, it returns a promise.

But you need to add another function to use async await

init()


async function dbQueryName() {
    const db = await MongoClient.connect(url);
    const dbo = db.db("mydb");


    const user = await dbo.collection("users").findOne({})
    return user.name
}
async function init() {
    try {
        const name = await dbQueryName()
    } catch (error) {
        console.log(error);
    }
}

Upvotes: 2

Related Questions