异步mongoDB find()方法出现问题

时间:2019-06-22 16:26:27

标签: javascript node.js mongodb express ejs

我正在尝试从mongoDB中获取一些数据并将其存储在一个数组中,然后将该数组传递到ejs文件中。问题似乎是,当mongo查询结果时,执行db Code之后的代码将空数组发送给ejs。结果是在执行render函数后得出的,因此没有数据发送到ejs。

   // First create your listener instance
   mAuthListner = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    Intent intent = new Intent(Login.this, NavigationMenu.class);
                    startActivity(intent);
                    finish();
                }
            }
        };

   // And so, add it to the addAuthStateListener() method
   mAuth.addAuthStateListener(mAuthListner);

输出按以下顺序: 输入数据库 退出数据库 查询成功

预期订单: 输入数据库 查询成功 退出数据库

2 个答案:

答案 0 :(得分:0)

batData被声明为数组,但随后在代码中将其设置为等于find查询。您应该改为.push()或将其保存到新变量,然后再.push()。

此外,在batData上使用const(而不是var)会抛出错误,从而显示此错误。除非您使用var支持较旧的代码,否则请使用const并让它代替。

答案 1 :(得分:0)

在此处使用承诺

//change your query to function

functon query(){
 //now here return a promise
 return new Promise((resolve, reject) => {
   MongoClient.connect(url, (err,db)=>{
    if(err) reject(err) // reject the err

    var dbo = db.db("MatchDB");

    dbo.collection("Batting").find( (err, data) => {
            console.log("Query Success");
            batData = data//save your data here or do anything
            db.close(); //close the db
            resolve(batData) //this will get returned to the caller
    });//dbo find ends

  }) //mongo client ends
 })//promise end
}//function ends

//now in your app.get route

// see here i marked this async, for using await
app.get('/', async (req, res) => {

    let batData = await query() // this will wait until it gets resove or rejected

    res.render('index', {
        batting: batData // now you will have data here
    });


});

此处有一些要点

  • 承诺得到解决或被拒绝
  • promise的调用者函数将等待,直到它从promise函数返回结果为止,如果您不想等待promise完成就可以再次处理
  • 异步等待只是以更简洁的方式处理promise的一种方式,可从代码中删除回调地狱
  • 每当需要使用await时,都必须标记它处于异步状态的功能,就像我在app.get回调函数中看到的那样
  • 现在等待将阻止代码,直到代码完成,被拒绝或解决
  • 然后将转到代码的res.render部分