【问题标题】:ASYNC AWAIT function .find() mongodb异步等待函数 .find() mongodb
【发布时间】:2021-07-25 06:17:45
【问题描述】:

如何从 mongodb 中保存来自异步函数 .find 的变量?在函数 console.log 内部它的工作(打印正确的值)和在函数外部它是未定义的。

var list;
MongoClient.connect(uri, function(err, db) {
    var dbc = db.db("chat");
    dbc.collection("chat_messages").find({user1: data.from, user2: data.to}).toArray(function (err, result){
         console.log(result[0].msgs);    <---- here its working
                
         list = result[0].msgs;
    });
            
    db.close();
});
console.log(list);     <---- here its not working

【问题讨论】:

标签: javascript mongodb


【解决方案1】:

以下是使用异步等待的方法。

async function getList() {
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() 来使用上例中的 Promise。

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

【讨论】:

    【解决方案2】:

    尝试使用 Promises,看看那个示例:

    const list = new Promise(function (resolve, reject) {
      MongoClient.connect(uri, function(err, db) {
        var dbc = db.db("chat");
        dbc.collection("chat_messages").find({user1: data.from, user2: data.to}).toArray(function (err, result){
             if(err) {
                 reject(err);
             } else {
                 resolve(result);         
             }
             db.close();
        });   
      });
    });
    

    如果你需要,可以使用作为 promise:

    list.then(arrayList => {
      console.log(arrayList[0].msgs);
    }).catch(err => console.log(err.message));
    

    或者,强制运行同步

    const msgs = (await list)[0].msgs;
    

    【讨论】:

    • 它说: const list = new Promise(resolve, reject, function (); ReferenceError: resolve is not defined
    • 我的错,我修好了,再试一次!
    【解决方案3】:

    您需要将整个代码块制作成async-await代码块,或者借助then块的帮助

    let conn = await client.connect(url);
    let db = conn.db("test");
    const results =  await db.collection("cars").find({}, { projection: { _id: 0, name: 1} }).toArray()
    

    这里results 会有你的输出

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-22
      • 2023-03-13
      • 2013-11-13
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      相关资源
      最近更新 更多