Запрос Firebase ничего не возвращает

Я закодировал функцию для отправки запроса в мою базу данных и получения результата. Но если он ничего не находит в базе данных, он ничего не возвращает ни undefined, ни null.

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

Какое значение возвращается этой функцией?


Код:

usersRef
  .where("nickname", "==", nickname)
  .get()
  .then((querySnapshot) => {
    querySnapshot.forEach((doc) =>
      doc.data() ? console.log("a") : console.log("b")
    );// i wrote this line for testing the issue
    querySnapshot.size == 0 ? (flag = true) : (flag = false);
  })
  .catch((err) => console.log("err2"))

Если данные существуют в базе данных, он печатает a, но если нет, он ничего не печатает, ни a, ни b.

Я использовал этот код в своем проекте React-Native, он также использует базу данных Firebase Firestore, а usersRef означает:

const db = firebase.firestore();
const usersRef = db.collection("Users");

Примечание. querySnapshot всегда возвращает объект firebase в формате JSON. Параметры doc в forEach возвращают объект, если он существует в формате JSON, но в противном случае его нельзя обработать.

Примечание 2: я также пробовал doc.data()== null, doc.data()== undefined или doc.data()== "". Но они ничего не печатают в console.log(). Я тоже пробовал console.log(doc.data()) и ничего не изменилось.

console.log(doc.data()) ничего не регистрирует?   —  person Leo S    schedule 20.01.2021

Если данные существуют в моей базе данных, он возвращает данные, в противном случае они не регистрируются. @ Daniel_Knights   —  person Leo S    schedule 20.01.2021

Вы входите вне forEach? Единственная причина, по которой я ничего не вижу, это querySnapshot имеет длину 0.   —  person Leo S    schedule 20.01.2021

См. также:  Как запустить приложение Angular в качестве контейнера на виртуальной машине Azure
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Leo S

    если данные существуют в базе данных, он печатает a, но если он не существует, он ничего не печатает ни a, ни b

    Это потому, что вы запрашиваете базу данных и получаете обратно массив. Если в вашем массиве 1 или более элементов, ваш вызов .forEach будет перебирать их и выполнять ваше тернарное выражение, что приводит к вызову журнала консоли — либо a, либо b. Однако, если ваш массив пуст, тогда .forEach нечего будет перебирать, и поэтому функция, которую вы ему передаете, никогда не будет выполнена.

    [].forEach(item => console.log(item)) // nothing
    [1].forEach(item => console.log(item)) // 1
    

    Итак, проблема в том, что ваш запрос к базе данных просто возвращается пустым в вашем окне Windows. Проверьте свою flag переменную или член .size, и вы должны увидеть, так ли это:

    usersRef
      .where("nickname", "==", nickname)
      .get()
      .then((querySnapshot) => {
        querySnapshot.forEach((doc) =>
          doc.data() ? console.log("a") : console.log("b")
        );
        querySnapshot.size == 0 ? (flag = true) : (flag = false);
        console.log(querySnapshot.size);
      })
      .catch((err) => console.log("err2"))
    
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: