javascript/从db&;返回用户信息的函数;全局变量
我试图从Firestore中获取用户数据作为变量。使用此代码,我得到了错误: ReferenceError:未定义user1 是否可以生成一个函数,在firebase中查找javascript/从db&;返回用户信息的函数;全局变量,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我试图从Firestore中获取用户数据作为变量。使用此代码,我得到了错误: ReferenceError:未定义user1 是否可以生成一个函数,在firebase中查找user.uid,并使用信息回调一个变量,以便我可以通过“user1.username”访问数据 当我把它放在 res.render('site', { username: user1.username}); 在函数(doc)中,但我确信有一种方法可以生成函数并通过在开始时添加函数来调用变量,如 ("app.get
user.uid
,并使用信息回调一个变量,以便我可以通过“user1.username
”访问数据
当我把它放在
res.render('site', { username: user1.username});
在函数(doc)
中,但我确信有一种方法可以生成函数并通过在开始时添加函数来调用变量,如
("app.get('/site', getuserinfos, function (req, res)")
任何需要从数据库访问数据的代码都需要在数据可用时调用的回调中 因此:
如果您正在努力阅读此代码,可以使用
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
});
});
请记住,虽然这段代码读起来可能更熟悉,但它仍在对数据库执行异步调用,您需要注意这一点。任何需要从数据库访问数据的代码都需要在数据可用时调用的回调中 因此:
如果您正在努力阅读此代码,可以使用
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
});
});
请记住,虽然这段代码读起来可能更熟悉,但它仍在执行对数据库的异步调用,您需要注意这一点。@Frank van Puffelen的回答很好,因为您可能没有在中间件方面使用太多 然而,我会确保像这样回报承诺
app.get('/site', (req, res) => {
return db.collection("users").doc(
firebase?.auth()
?.currentUser
?.uid
)
.get()
.then((doc) => doc.exists ?
res.render(
'site',
{
username: doc.data().username
}
) : console.log("No such document!")
, (error) =>
console.log( "Error getting document:", error )
);
});
等待也会是类似的
app.get('/site', async (req, res) => {
return await db.collection("users").doc(
firebase?.auth()
?.currentUser
?.uid
)
.get()
.then((doc) => doc.exists ?
res.render(
'site',
{
username: doc.data().username
}
) : console.log("No such document!")
, (error) =>
console.log( "Error getting document:", error )
);
});
@Frank van Puffelen的答案很好,因为您可能没有在中间件方面使用太多 然而,我会确保像这样回报承诺
app.get('/site', (req, res) => {
return db.collection("users").doc(
firebase?.auth()
?.currentUser
?.uid
)
.get()
.then((doc) => doc.exists ?
res.render(
'site',
{
username: doc.data().username
}
) : console.log("No such document!")
, (error) =>
console.log( "Error getting document:", error )
);
});
等待也会是类似的
app.get('/site', async (req, res) => {
return await db.collection("users").doc(
firebase?.auth()
?.currentUser
?.uid
)
.get()
.then((doc) => doc.exists ?
res.render(
'site',
{
username: doc.data().username
}
) : console.log("No such document!")
, (error) =>
console.log( "Error getting document:", error )
);
});
数据库操作是异步的,因此将
res.render()
放入中。然后()
回调是正确的做法。感谢您的快速响应。我会考虑你的答案。是否没有简单的方法将其放入函数并将信息作为返回变量?这是一个一直被问到的问题,答案基本上是“否”。在现代JavaScript环境中,有一些工具可以使异步API的处理变得更简洁,但最终不能使异步API表现为同步。数据库操作是异步的,因此将res.render()
放在中。然后()
回调是正确的做法。感谢您的快速响应。我会考虑你的答案。是否没有简单的方法将其放入函数并将信息作为返回变量?这是一个一直被问到的问题,答案基本上是“否”。现代JavaScript环境中有一些工具可以使异步API的处理变得更干净,但最终不能使异步API表现得像同步API一样。如果是第一个,我建议返回承诺;-)。第二个承诺是包装implicit@JGleason我添加了一个没有冒泡结果的示例,我想这就是你的意思。如果您有进一步的改进,我建议您将其作为备选答案发布。如果您正在做第一个,我建议退还承诺;-)。第二个承诺是包装implicit@JGleason我添加了一个没有冒泡结果的示例,我想这就是你的意思。如果您有进一步的改进,我建议将其作为备选答案发布。