I am trying to get data from Firestore using multiple queries, but the returned data is always undefined, even though console.log(data) in .then() block shows the data exist.
JavaScript
x
26
26
1
const getPeers = async () => {
2
let query = firestore.collection("users");
3
if (country !== "") query = query.where("country", "==", country);
4
if (gender !== "") query = query.where("gender", "==", gender);
5
if (age !== "") query = query.where("age", "==", age);
6
if (religion !== "") query = query.where("religion", "==", religion);
7
if (budget_low !== "") query = query.where("budget_low", ">=", Number(budget_low));
8
if (budget_high !== "") query = query.where("budget_high", "<=", Number(budget_high));
9
query
10
.get()
11
.then((querySnapshot) => {
12
var data = [];
13
querySnapshot.forEach((doc) => {
14
data.push(doc.data());
15
});
16
console.log(data) // data exist here after console log.
17
return data;
18
})
19
.catch((error) => {
20
console.log("Error getting documents: ", error);
21
});
22
};
23
24
let d = await getPeers();
25
console.log(d); // gets undefined
26
Advertisement
Answer
You have to return the promise in your function getPeers()
:
JavaScript
1
23
23
1
const getPeers = async () => {
2
let query = firestore.collection("users");
3
if (country !== "") query = query.where("country", "==", country);
4
if (gender !== "") query = query.where("gender", "==", gender);
5
if (age !== "") query = query.where("age", "==", age);
6
if (religion !== "") query = query.where("religion", "==", religion);
7
if (budget_low !== "") query = query.where("budget_low", ">=", Number(budget_low));
8
if (budget_high !== "") query = query.where("budget_high", "<=", Number(budget_high));
9
return query // here return the promise
10
.get()
11
.then((querySnapshot) => {
12
var data = [];
13
querySnapshot.forEach((doc) => {
14
data.push(doc.data());
15
});
16
console.log(data) // data exist here after console log.
17
return data;
18
})
19
.catch((error) => {
20
console.log("Error getting documents: ", error);
21
});
22
};
23
EDIT:
A little advice when handling errors in async functions, in your code you have the catch()
handler with a console.log
:
JavaScript
1
15
15
1
return query.get() // here return the promise
2
.then((querySnapshot) => {
3
4
})
5
.catch((error) => {
6
console.log("Error getting documents: ", error);
7
// If query.get() fails, then 'await getPeers();'
8
// will return 'undefined'.
9
});
10
};
11
12
let d = await getPeers();
13
console.log(d); // will be undefined if query.get() returns an error.
14
15
To avoid this you could throw an error in catch()
like this:
JavaScript
1
4
1
.catch((error) => {
2
throw "An error occurred";
3
});
4
So then you can check if an error ocurred like this:
JavaScript
1
10
10
1
let d = await getPeers().catch(error => {
2
// here you can throw the error or do something else like return null for example.
3
console.error(error);
4
return null;
5
});
6
7
if (d){ // now you can validate that your data exists
8
9
}
10
You can see more about async functions here.
Remember this:
Async functions always return a promise. If the return value of an async function is not explicitly a promise, it will be implicitly wrapped in a promise.