我正在尝试从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);
输出按以下顺序: 输入数据库 退出数据库 查询成功
预期订单: 输入数据库 查询成功 退出数据库
答案 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
});
});
此处有一些要点