javascript / функция, которая отправляет информацию о пользователе обратно из базы данных и глобальной переменной - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь получить данные пользователя из Firestore как переменную. С помощью этого кода я получаю сообщение об ошибке:

ReferenceError: user1 не определен

Можно ли сгенерировать функцию, которая ищет в firebase для user.uid и обратного вызова переменная с информацией, поэтому я могу получить доступ к данным через «user1.username»?

app.get('/site', function (req, res) {

    var user = firebase.auth().currentUser;

    // get userdata from db and set to variable
    db.collection("users").doc(user.uid)
    .get().then(function(doc) {
      if (doc.exists){
        // Convert to user object
        user1 = doc.data();
      } else {
        console.log("No such document!")
      }}).catch(function(error) {
        console.log("Error getting document:", error)
      });
res.render('site', { username: user1.username});
});

Он работает, когда я помещаю

res.render('site', { username: user1.username});

внутри function(doc), но я Я уверен, что есть способ сгенерировать функцию и вызвать переменные, добавив функцию в начале, например ...

("app.get('/site', getuserinfos, function (req, res)")

Ответы [ 2 ]

1 голос
/ 05 августа 2020

@ Ответ Фрэнка ван Пуффелена в порядке, потому что вы, вероятно, не слишком много используете промежуточное ПО.

Тем не менее, я бы обязательно вернул обещание, подобное этому ...

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 )
    );
});
1 голос
/ 05 августа 2020

Любой код, которому требуется доступ к данным из базы данных, должен быть в обратном вызове, который вызывается, когда эти данные доступны.

Итак:

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
    });
});

Просто имейте в виду, что, хотя этот код может показаться более знакомым, он по-прежнему выполняет асинхронный вызов базы данных, и вам нужно об этом знать.

...