Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript/从db&;返回用户信息的函数;全局变量_Javascript_Firebase_Google Cloud Firestore - Fatal编程技术网

javascript/从db&;返回用户信息的函数;全局变量

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

我试图从Firestore中获取用户数据作为变量。使用此代码,我得到了错误:

ReferenceError:未定义user1

是否可以生成一个函数,在firebase中查找
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我添加了一个没有冒泡结果的示例,我想这就是你的意思。如果您有进一步的改进,我建议将其作为备选答案发布。