从nodejs的mongodb查询返回值

时间:2019-04-01 17:20:00

标签: javascript node.js mongodb scope

编辑

好,我读了here。“您无法使用异步函数返回。必须在回调中处理结果。这是由于异步编程的特性:”立即退出,设置一个将来要调用的回调函数。而且,至少对于当前的ECMAScript 5标准,您无法解决这个问题。由于JavaScript是单线程的,因此任何等待回调的尝试都只会锁定单线程,从而使回调和返回用户永远挂在事件队列中。”

今天仍然如此吗?

原始问题

在我的node.js应用程序中的函数外部访问变量时遇到问题。

const url = "mongodb://localhost:27017/";
getAllSampleTypes();

// I would like to have the variable "requested" accessible here

function getAllSampleTypes() {
    MongoClient.connect(url, function (err, db) {
        var dbo = db.db("myDb");
        dbo.collection("data").distinct("sample_type", {}, (function (err, requested) {
// variable "requested" is accessible here

            })
        );

    });
}

我尝试了async / await,但仍然遇到同样的问题。

function getTypes() {
    MongoClient.connect(url, async function (err, db) {
        let dbo = db.db("myDb");
        return await dbo.collection("data").distinct("sample_type", {});

    });
}
console.log(getTypes()); //Promise { undefined }

2 个答案:

答案 0 :(得分:1)

我认为您将无法实现所需的功能。仅当您处于异步功能范围内时,异步等待才有效。您的顶级调用不在异步函数内,因此您不得不处理返回的Promise或回调。

例如getAllSampleTypes()。then(function(response){});

这里有一些与您想要的示例类似的示例,但是无论哪种方式,对异步函数的顶级调用都必须将响应作为Promise处理。

const url = "mongodb://localhost:27017/";

getAllSampleTypes().then(function(sample_types){
    // Do something here.
});


async function getAllSampleTypes() {
    var db = await mongo.connect(url);
    var dbo = db.db("myDb");
    return await dbo.collection("data").distinct("sample_type", {});
}

重要的是要了解,异步等待实际上并不是什么神奇的事情,它在幕后确实被转换为Promises。这就是为什么您对异步函数的顶级调用可以使用.then()处理响应的原因。它真的很干净阅读。上面的代码将大致翻译并执行为:

const url = "mongodb://localhost:27017/";

getAllSampleTypes().then(function(sample_types){
    // Do something here.
});

function getAllSampleTypes() {
    return new Promise(function(resolve, reject){ 
        mongo.connect(url).then(function(db){
            var dbo = db.db("myDb");
            dbo.collection("data").distinct("sample_type", {}).then(function(results) {
                resolve(results);
            });
        });
    });
}

答案 1 :(得分:0)

getTypes不返回任何内容。你必须把它传下去 如果您要使用异步/等待,请尝试类似

async function getTypes() {
  const db = MongoClient.connect(url);
  const dbo = db.db("myDb");
  return await dbo.collection("data").distinct("sample_type", {});
}
console.log(await getTypes());

这些可能会有所帮助: How can I use asyn-await with mongoclienthow-to-use-mongodb-with-promises-in-node-js

此外,您可能应该在某处使用db.close()关闭连接