Запрос Firebase? - PullRequest
       3

Запрос Firebase?

1 голос
/ 05 мая 2020

У меня проблема с запросом в моей базе данных firebase. Я пытаюсь получить все данные аутентифицированного пользователя с моей конечной точки «... / api / user». Это маршрут в моем коде:

// GET DATA OF USER
router.route("/user").get(FBAuth, getAuthenticatedUser);

Здесь я использую промежуточное ПО, которое декодирует токен и устанавливает его в req.user, и, конечно же, проверяет, аутентифицирован ли пользователь:

// FBAuth middleware    
module.exports = (req, res, next) => {
      admin
        .auth()
        .verifyIdToken(idToken)
        .then((decodedToken) => {
          req.user = decodedToken;
          return db
            .collectionGroup("users")
            .where("idUser", "==", req.user.uid)
            .limit(1)
            .get();
        })
        .then((data) => {
          req.user.name = data.docs[0].data().name
          return next();
        })
        .catch((err) => {
          console.error("Error while verifying token", err);
          return res.status(403).json(err);
        });
    };

Все вышеперечисленное работает нормально, но после успешной установки req.user мы go переходим к функции "getAuthenticatedUser", которая не работает:

//Controller
exports.getAuthenticatedUser = (req, res) => {
  let userData = {};

  db.collectionGroup("users")
    .where("email", "==", req.user.email) //".where("idUser", "==", req.user.uid)" nothing works here
    .limit(1)
    .get()
    .then((doc) => {
      if (doc.exists) {                   // Always goes to the else no matter what query i do
        userData.credentials = doc.data();
        return db
          .collection("comptes")
          .doc(req.user.name)
          .collection("courses")
          .get();
      }else{
        return res.status(400).json({email: 'Email not found => ' + req.user.email}); 
// the req.user.email does exist and contain the right email, and also exists in the database...
          }
        })
        .then((data) => {
          if (data.exists) {
            userData.courses= [];
            data.forEach((doc) => {
              userData.courses.push(doc.data());
            });
          }
          return res.json(userData);
        })
        .catch((err) => {
          console.error(err);
          return res.status(500).json({ error: err.code });
        });
    };

Я не понимаю, как запрос может работать для регистрации, для промежуточного программного обеспечения, но не для фактического контроллера, который должен использовать эту настройку, потому что это частный маршрут ..? Спасибо за вашу помощь, ребята!

1 Ответ

0 голосов
/ 06 мая 2020

Я наконец исправил это, если у кого-то есть такая же проблема, вот решение:

exports.getAuthenticatedUser = (req, res) => {
  let userData = {};

  db.collectionGroup("users")
    .where("email", "==", req.user.email)
    .limit(1)
    .get()
    .then((doc) => {
      if (doc.docs[0].exists) { // <----- doc.docs contain a list of data
        userData.credentials = doc.docs[0].data();
        return db
          .collection("comptes")
          .doc(req.user.name)
          .collection("courses")
          .get();
      }
        })
        .then((data) => {
          if (data.exists) {
            userData.courses= [];
            data.forEach((doc) => {
              userData.courses.push(doc.data());
            });
          }
          return res.json(userData);
        })
        .catch((err) => {
          console.error(err);
          return res.status(500).json({ error: err.code });
        });
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...