将MongoDB查询结果作为变量而不是返回控制台

在名为db_to_var.js的javascript文件中,我具有以下函数,该函数成功将查询返回的数组打印到数据库test_dbconsole.log()中。 (例如,一个名为cars的数据库,其中有一个密钥name描述了品牌名称,例如toyota,hyunday,volvo。)该方法使用以下命令调用:console.log("listCars function call="+listCars());,其中包含:

function listCars() { 
    car_and_name_grandparent = MongoClient.connect(url,function(err,db) {
        if (err) throw err;
        var dbo = db.db("testdb");

        car_and_name_parent = dbo.collection("cars").find({},{ projection: { _id: 0,name: 1} }).toArray(function(err,result) {
            if (err) throw err;
            car_and_name = result;
            db.close();

            console.log("car_and_name="+car_and_name);
            return car_and_name;
        });

        return car_and_name_parent;
    });

    return car_and_name_grandparent;
}; 

但是,car_and_name_parent仍未定义,因为正确填充的car_and_name实际上并未返回到car_and_name_parent。这促使我进行调查,然后调查了:

  1. The documentation of .toArray(),它不应该放在第一位。因此,我检查了dbo.collection("cars").find({},name: 1} }).toArray()实际返回的内容,即[object Promise]

    1.a无法直接评估Promise,而必须使用thenawaitasync

    1.b我可以将Promise转换为function then() { [native code] } 使用.then,但我尚未找到如何进一步评估 表达式以检索“ [native code]”中的列表。的 await返回错误,提示SyntaxError: await is only valid in async function,而async car_and_name.then返回错误 SyntaxError: Unexpected identifier

  2. 我还尝试将名为carNames的全局变量传递给函数,并为其分配值car_and_name,但是我目前无法成功将全局变量传递给{在该位置上,{1}}和.toArray(..)一样是未定义的。

如何将console.log(carNames);变量返回到函数car_and_name之外的变量?

yexi831020zqymy 回答:将MongoDB查询结果作为变量而不是返回控制台

这是异步等待的方式。

async function listCars() {
    let db = await MongoClient.connect(url);
    let dbo = db.db("testdb");
    return await dbo.collection("cars").find({},{ projection: { _id: 0,name: 1} }).toArray()
}

listCars().then(cars => {
    console.log(cars); //You will get your results here
})

nodejs中的mongoDB查询与上面的查询一样是异步的,因此您不能直接在变量中获取返回值。您必须使用回调函数或.then()才能使用上例中的承诺。

您使用的toArray()函数是MongoDB方法,您在问题中提到的方法是jQuery。这是正确的文档供您参考-> https://docs.mongodb.com/manual/reference/method/cursor.toArray/

希望有帮助!

,

您的方法正在进行异步调用,该异步调用会在检索到您要查找的值之前立即作为Promise执行。

我建议将您的方法包装在Promise中。

function listCars() { 
    return new Promise((resolve,reject) => {
       MongoClient.connect(url,function(err,db) {
        if (err) reject(err);
        var dbo = db.db("testdb");

        dbo.collection("cars").find({},name: 1} }).toArray(function(err,result) {
            if (err) reject(err);
            db.close();
            resolve(result);
        });
    });
  })
};

然后您可以像这样使用它。

listCars()
    .then(carNames => {
        // Use your variable here.
    })
    .catch(err => throw err);

您还可以像这样在异步方法中将listCars用作辅助方法。

const carWork = async function() {
    try {
       const carNames = await listCars();
       // ....
    } catch (err) {
        throw err;
    }
}
,

您可以使用async / await。但是您没有正确使用它。您收到语法错误,提示您只能在异步函数中使用await。所以您可以这样编写代码,

async function listCars() { 
 try{
    db = await MongoClient.connect(url);
    var dbo = db.db("testdb");
    car_and_name_parent = await dbo.collection("cars").find({},{ 
      projection: { _id: 0,name: 1} }).toArray();
   return car_and_name_parent
}catch(err){
  throw err;
 }
}; 
本文链接:https://www.f2er.com/3086877.html

大家都在问