ошибка: невозможно прочитать свойство 'широта' неопределенного в ioni c 4 и в базе данных огня - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь создать приложение с помощью c 4 и firebase. Существует два типа пользователей: простые пользователи и администраторы. Как администратор, я хочу видеть на карте, где находятся пользователи, но только в определенной области. Я смог отобразить свою позицию на карте и обновить маркер с помощью watchPosition (). Я добавил несколько мест в свою базу данных для простых пользователей, чтобы посмотреть, смогу ли я получить к ним доступ, а затем отобразить их на карте. Все работало хорошо, маркеры были отображены на карте, но теперь я получил эту ошибку: не могу прочитать свойство 'широта' неопределенного, но я ничего не изменил в своем коде (где я получил доступ к местоположениям пользователей). Это странно, потому что Несколько дней go это работало хорошо, и это тоже работало на android. Это проблема с Firebase или геолокации, у кого-нибудь есть идея?

Это мой код:

 getMarkers() {

let usersLocations =[];
firebase
  .firestore()
  .collection("users")
  .get()
  .then(userProfileSnapshot => {
      userProfileSnapshot.docs.forEach(doc => {
        if (doc.data().isAdmin==false)
        usersLocations.push(doc.data());
      });
  }).then((x) => {
    if(this.isAdmin==true)
    for(let i=0; i<usersLocations.length; i++) {
      let userPosition = new google.maps.LatLng(usersLocations[i].Location.latitude, usersLocations[i].Location.longitude);
      let userMarker = new google.maps.Marker({
        position: userPosition,
        icon: {
          url: "http://maps.google.com/mapfiles/ms/icons/yellow-dot.png"
        },
        map: this.map
      });

  //     if(this.haversine_distance(this.locationMarker, userMarker)>1)
  //       userMarker.setVisible(false);
    }
  });

}

1 Ответ

0 голосов
/ 14 марта 2020

Все, что мы можем сказать из кода, которым вы поделились, это то, что для некоторого значения i, usersLocations[i] не имеет свойства Location. Если вы не изменили свой код, вам нужно проверить, в каком документе отсутствует это свойство.

Кроме того, вы можете пропустить такие документы и зарегистрировать их идентификатор, изменив второй then на:

for(let i=0; i<usersLocations.length; i++) {
  if (!usersLocations[i] || !usersLocations[i].Location) {
    console.error("Missing Location data in "+i+": "+JSON.stringify(usersLocations[i]));
    continue; // skip further processing of this user
  }
  let userPosition = new google.maps.LatLng(usersLocations[i].Location.latitude, usersLocations[i].Location.longitude);
  let userMarker = new google.maps.Marker({
    position: userPosition,
    icon: {
      url: "http://maps.google.com/mapfiles/ms/icons/yellow-dot.png"
    },
    map: this.map
  });
}

Несколько более современный / идиоматический c способ сделать это:

firebase
  .firestore()
  .collection("users")
  .get()
  .then(querySnapshot => {
    // Convert the snapshot to an array of IDs and data
    return querySnapshot.docs.map(doc => { doc.id, ...doc.data() });
  })
  .then(documents => {
    // Remove admins
    return documents.filter(doc => doc.isAdmin==false);
  })
  .then(documents => {
    // Remove and log documents that have no location field
    return documents.filter(doc => {
      if (!doc.Location) {
        console.error(`Document ${doc.id} doesn't have a Location`);
        return false; // remove this document from the array
      }
      return true;
    });
  .then(documents => {
    documents.forEach(doc => {
      let userPosition = new google.maps.LatLng(doc.Location.latitude, doc.Location.longitude);
      let userMarker = new google.maps.Marker({
        position: userPosition,
        icon: {
          url: "http://maps.google.com/mapfiles/ms/icons/yellow-dot.png"
        },
        map: this.map
      });
    });
  });
...