从nodejs返回mongodb查询中的值

问题描述 投票:-1回答:2

编辑

好吧,我读了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 }
javascript node.js mongodb scope
2个回答
1
投票

我认为你无法实现你想要的目标。异步等待仅在您处于异步功能范围内时才起作用。您的顶级调用不在异步函数内,因此您将被迫处理返回的Promise或回调。

例如getAllSampleTypes(),然后(功能(响应){})。

以下是一些与您想要的类似的示例,但无论哪种方式,对异步函数的顶级调用都必须将响应作为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);
            });
        });
    });
}

0
投票

getTypes不返回任何内容。你必须把它传递出来如果你要使用async / await尝试类似的东西

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()的连接

© www.soinside.com 2019 - 2024. All rights reserved.