Я пытаюсь создать веб-приложение для парикмахерских, в котором клиент может видеть список бесплатных встреч, и когда они резервируют бесплатную встречу, я хочу удалить это поле из 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"
Когда вы пытаетесь получить несколько документов, используя ссылку на коллекцию или запрос, вы должны использовать 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() ?
FirebaseError: функция updateDoc() вызвана с неверными данными. Неподдерживаемое значение поля: пользовательский объект Map (найден в поле radno_vrijeme в документе Ana Lončar/pBrrw16ZIO5UeFhfhBDv)
@ avuji31, это совсем другая проблема. Почему бы не попробовать { radno_vrijeme: radnoVrijeme } и убрать логику radnoVrijemeMap? Я не вижу его варианта использования там
Я попробовал это решение из-за chatGPT, я пробовал много вещей. Это работает сейчас, но я также пробовал просто radno_vrijeme : radnoVrijeme, но это не сработало, теперь это работает с вашим кодом. Это было что-то с функцией обновления, как я и говорил, все работает, кроме строки обновления. Спасибо
ИИ не знает обо всех последних обновлениях. .update() — это старый синтаксис для updateDoc(), который использовал ChatGPT.
@ avuji31 это так. Вы не можете использовать getDoc() со ссылкой на коллекцию. Я обновил свой ответ, указав полную функцию. Можешь попробовать запустить это?