Любой код, которому требуется доступ к данным из базы данных, должен быть в обратном вызове, который вызывается, когда эти данные доступны.
Итак:
app.get('/site', function (req, res) {
var user = firebase.auth().currentUser;
db.collection("users").doc(user.uid)
.get().then(function(doc) {
if (doc.exists){
user1 = doc.data();
res.render('site', { username: user1.username});
} else {
console.log("No such document!")
// TODO: send a response
}}).catch(function(error) {
console.log("Error getting document:", error)
// TODO: send a response
});
});
Если вам сложно читать этот код, вы можете сделать его более знакомым, используя ключевые слова async
/ await
:
app.get('/site', async function (req, res) {
var user = firebase.auth().currentUser;
let user1 = await db.collection("users").doc(user.uid)
.get().then(function(doc) {
if (doc.exists){
return doc.data();
} else {
console.log("No such document!")
// TODO: return something to render or throw an error
}}).catch(function(error) {
console.log("Error getting document:", error)
// TODO: send a response
});
res.render('site', { username: user1.username});
});
Или проще:
app.get('/site', async function (req, res) {
var user = firebase.auth().currentUser;
let doc = await db.collection("users").doc(user.uid).get();
if (doc.exists){
res.render('site', { username: doc.data().username});
} else {
console.log("No such document!")
// TODO: send a response
}}).catch(function(error) {
console.log("Error getting document:", error)
// TODO: send a response
});
});
Просто имейте в виду, что, хотя этот код может показаться более знакомым, он по-прежнему выполняет асинхронный вызов базы данных, и вам нужно об этом знать.