Return MongoDB 查询结果作为变量而不是控制台

Return MongoDB query result as variable instead of to console

在名为 db_to_var.js 的 javascript 文件中,我有以下函数成功打印数组 return 通过查询数据库 test_db,到 console.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 实际上并未 return 编辑到 car_and_name_parent。这促使我进行调查,我调查了:

  1. The documentation of .toArray(),一开始就不应该有争论。因此,我检查了 dbo.collection("cars").find({}, { projection: { _id: 0, name: 1} }).toArray() 实际上是 return,这是一个 [object Promise]

    1.a 不能直接计算 Promise,必须使用 thenawaitasync.

    1.b 我可以将 Promise 转换成 function then() { [native code] } 使用 .then 但我还没有找到如何进一步评估它 从“[native code]”中检索列表的表达式。这 await returns 错误说 SyntaxError: await is only valid in async function,而 async car_and_name.then returns 错误 SyntaxError: Unexpected identifier.

  2. 我也试过将名为carNames的全局变量传递给函数,并为其赋值car_and_name,但我目前无法成功传递全局变量在 .toArray(..) 内部,因为 console.log(carNames); 在我这样做时未定义,在那个位置。

如何return将car_and_name变量转换为函数外的变量listCars()

下面是使用 async await 的方法。

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 查询像上面的查询是异步的,所以你不能直接在变量中获取 return 值。您要么必须使用回调函数,要么 .then() 像上面的示例一样使用承诺。

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

希望对您有所帮助!

您的方法正在进行异步调用,该调用会在检索到您要查找的值之前立即作为 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({}, { projection: { _id: 0, 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;
 }
};