等到MongoDB完成查询而不使用回调

时间:2018-03-01 11:14:47

标签: node.js mongodb asynchronous

Node.js中的异步编程模型存在问题。

我知道以前曾经问过这个问题,但到目前为止我还没有找到任何可以用来解决问题的方法。

如何在调用console.logdbQueryName从中获取其价值之前强制username运行?

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);

我已经设法让它在函数中使用callback参数工作,但有没有办法用更少的代码和缩进来做到这一点?

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);
});

1 个答案:

答案 0 :(得分:1)

如果您没有将回调传递给MongoClient.connect或collection.findOne,则会返回一个承诺。

但是你需要添加另一个函数来使用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);
    }
}