Невозможно обновить поле коллекции firebase — ожидался тип «ya», но это было: пользовательский объект Ia

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

У меня есть коллекция, которая представляет одного парикмахера. Вот как это выглядит в firebase.

Как видите, radno_vrijeme — это объект или карта в firebase, которая содержит 6 массивов, и в каждом массиве есть список свободных часов работы.

В моей функции я могу делать все, кроме последней строки, где мне нужно обновить коллекцию firebase.

  const finishReservation = async () => {
    try {
      const freeTimeRef = collection(db, `${barber}`);
      const q = query(freeTimeRef);
      const querySnap = await getDoc(q);
      querySnap.forEach(async (doc) => {
        const radnoVrijeme = doc.data().radno_vrijeme;

        // Find the index of the hour you want to delete
        const index = radnoVrijeme["Mon"].indexOf(hour);
        // Remove the hour from the array
        radnoVrijeme["Mon"].splice(index, 1);
        // Update the document in the collection
        console.info(radnoVrijeme);
        const radnoVrijemeMap = new Map(Object.entries(radnoVrijeme));
        await freeTimeRef.update({ radno_vrijeme: radnoVrijemeMap });
      });
    } catch (error) {
      console.info(error);
    }
  };

Я попытался передать его как строковый объект JSON, но это не сработало. Я всегда получаю эту ошибку:

"FirebaseError: ожидался тип "ya", но это был пользовательский объект Ia"
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Все мы знаем, что [] instanceof Array возвращает true, но почему [] instanceof Object тоже возвращает true?
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
0
0
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы пытаетесь получить несколько документов, используя ссылку на коллекцию или запрос, вы должны использовать getDocs():

const finishReservation = async () => {
  try {
    const freeTimeRef = collection(db, `${barber}`);
    const q = query(freeTimeRef);
    const querySnap = await getDocs(q);
    
    const updates = [];
    
    querySnap.forEach((d) => {
      const radnoVrijeme = d.data().radno_vrijeme;    
      const index = radnoVrijeme["Mon"].indexOf(hour);
      radnoVrijeme["Mon"].splice(index, 1);
    
      const radnoVrijemeMap = new Map(Object.entries(radnoVrijeme));
      
      updates.push(updateDoc(d.ref, { radno_vrijeme: radnoVrijemeMap }))
    });
    
    await Promise.all(updates);
    console.info("Documents updated")
  } catch (error) {
    console.info(error);
  }
};

GetDoc() используется для получения одного документа с использованием ссылки на документ.

@ avuji31 это так. Вы не можете использовать getDoc() со ссылкой на коллекцию. Я обновил свой ответ, указав полную функцию. Можешь попробовать запустить это?

Dharmaraj 10.01.2023 16:22

@avuji31 верно. Можете ли вы попробовать обновленное заявление? Значит, исходная проблема действительно была getDoc() ?

Dharmaraj 10.01.2023 16:24

FirebaseError: функция updateDoc() вызвана с неверными данными. Неподдерживаемое значение поля: пользовательский объект Map (найден в поле radno_vrijeme в документе Ana Lončar/pBrrw16ZIO5UeFhfhBDv)

avuji31 10.01.2023 16:26

@ avuji31, это совсем другая проблема. Почему бы не попробовать { radno_vrijeme: radnoVrijeme } и убрать логику radnoVrijemeMap? Я не вижу его варианта использования там

Dharmaraj 10.01.2023 16:28

Я попробовал это решение из-за chatGPT, я пробовал много вещей. Это работает сейчас, но я также пробовал просто radno_vrijeme : radnoVrijeme, но это не сработало, теперь это работает с вашим кодом. Это было что-то с функцией обновления, как я и говорил, все работает, кроме строки обновления. Спасибо

avuji31 10.01.2023 16:33

ИИ не знает обо всех последних обновлениях. .update() — это старый синтаксис для updateDoc(), который использовал ChatGPT.

Dharmaraj 10.01.2023 16:35

Другие вопросы по теме