Не удалось получить фамилию и имя из документа firestore в VueJS

# #javascript #firebase #vue.js #google-cloud-firestore

Вопрос:

введите описание изображения здесьЯ пытаюсь отобразить фамилию и имя из документа, сохраненного при регистрации, с помощью поля DisplayName. Я думал, что наличие DisplayName в качестве общего ключа позволит мне получить фамилию и имя пользователя, зарегистрировавшегося, отправив запрос в firestore, используя свойство DisplayName, хранящееся в объекте CurrentUser, которое возвращается после того, как я вошел в систему. Однако я не могу получить доступ к фамилии из документов firebase и был бы очень признателен за помощь.

 <template>
  <p>Process Payroll</p>
  <h1>{{ user.displayName }} </h1>
  <h1>{{ docs }} </h1>
</template>

<script>
import getUser from '@/composables/getUser'
import { ref, onMounted, watch } from 'vue'
import { projectFirestore, projectAuth } from '@/firebase/config'
import { useRouter, useRoute } from 'vue-router'

export default {
    setup() {
    const { user } = getUser();

    watch(()=> user, () => returnUser())

    const lastName = ref("");
    const firstName = ref("");
    const docs = ref([]);

    const returnUser = async () => {
      const res = await projectFirestore
        .collection("users")
        .where("displayName", "==", "Abe")
        .get();
      if (!error.value) {
        // check your response here.
        console.log(res);
        const doc = res.filter((userObj) => {
          if ("Abe" === userObj.data().displayName) {
            return userObj.data().lastName;
          }
        });
        docs.value = doc;
      }
    };

    onMounted(returnUser)

    return { user, docs, returnUser};
  },
}
</script>
 

Вместо фамилии возвращается только пустой массив. Я также не вижу никаких запросов от firebase для получения необходимой информации. Я получаю ссылку на ошибку:ошибка не определена в моей консоли, а также не может прочитать свойство DisplayName значения null, несмотря на использование часов, чтобы убедиться, что объект пользователя загружен позже. Может кто-нибудь, пожалуйста, помочь с основными изменениями кода, чтобы помочь мне справиться с моими ошибками и отобразить фамилию из firebase. Пожалуйста, помогите! Я новичок в Vuejs.

введите описание изображения здесь

 import { ref } from 'vue'
import { projectAuth } from '../firebase/config'

// refs
const user = ref(projectAuth.currentUser)

// auth changes
projectAuth.onAuthStateChanged(_user => {
  console.log('User state change. Current user is:', _user)
  user.value = _user
});

const getUser = () => {
  return { user } 
}

export default getUser
 

введите описание изображения здесь

введите описание изображения здесь

Комментарии:

1. Здесь у вас есть только один запрос, который извлекает документы с displayName точностью до Abe . Хранится ли фамилия в том же поле? Вы можете поделиться скриншотом своего документа? Кроме того if ("Abe" === userObj.data().displayName) , это излишне, так как ваш запрос включает .where("displayName", "==", "Abe") в себя .

2. Строка ‘Abe’ изначально была user.DisplayName, где пользователь-это объект, который определяется при входе пользователя в систему. Я добавил скриншот документа, как вы просили

Ответ №1:

Если вы хотите зарегистрировать все комбинации «Имя фамилия», попробуйте сделать это:

 const returnUser = async () => {
  const res = await projectFirestore
    .collection("users")
    .where("displayName", "==", "Abe") // Case sensitive
    .get();

  const lastNameList = res.docs.map(d => `Abe ${d.data().lastName}`)
  console.log(lastNameList)
  docs.value = lastNameList;
}
 

Попробуйте изменить функцию getUser таким образом, чтобы имя дисплея всегда было определено.

 const getUser = () => {
  // set default value to null
  return user ? { user } : { displayName: "NoUser" } 
}
 

Комментарии:

1. Я добавил скриншот ошибок, которые я вижу в своей консоли. Я не хочу регистрировать все комбинации Имя фамилия. Только имя и фамилия, соответствующие имени пользователя.Отображаемое имя, где пользователь является текущим зарегистрированным пользователем. Мне нужна помощь в устранении ошибок, которые я вижу, и отображении user.DisplayName, для которого я настраиваю watch(()=> user, () => returnUser()) , но я все еще не могу использовать свойство user.DisplayName.

2. Я получаю сообщение об ошибке не удается прочитать родительский узел свойства null. Вы знаете, почему это может быть? @Дхармарадж

3. @BilalHussain каково значение пользователя по умолчанию getUser ? Который не обладает этим свойством. Попробуйте изменить на <h1>{{ user.displayName ? user.displayName : "No name" }} </h1>

4. Я поделился составным файлом getUser, который возвращает пользователя, как только пользователь вошел в систему (как показано в консоли). Я прошу вас помочь мне получить имя пользователя.DisplayName в части сценария компонента. В шаблоне, где вы упомянули об изменении h1, я правильно вижу имя пользователя.DisplayName. Я прикрепил пользователя, составляемого для вашей справки. Я мог бы вызвать returnUser до того, как обратный вызов projectAuth обновит пользователя, поэтому я не могу использовать его в сценарии, но он доступен в шаблоне.

5. Это заняло у меня некоторое время, но вот хранилище для вас github.com/Bilolhussain/VueJsFirebase @Дхармарадж