Что я делаю не так, чтобы получить массив с firebase

# #reactjs #firebase #google-cloud-firestore

Вопрос:

У меня есть эта функция в WorkoutController.js

 export async function getFavourites(FavRetrived) {
    var FavList = []
    var snapshot = await firebase
        .firestore()
        .collection("Favourites")
        .doc(firebase.auth().currentUser.uid)
        .collection("userFavourites")
        .get()
    snapshot.forEach((doc) => {
        const favDoc = doc.data()
        favDoc.id = doc.id
        FavList.push(favDoc)
    })
    FavRetrived(FavList)
}
 

Я использовал в основном плоские списки для получения данных из коллекции, и это хорошо работает, но теперь я хочу использовать массив идентификаторов для выполнения некоторых элементов управления.

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

в Screen.js У меня есть

 import { getFavourites } from '../context/WorkoutController'
const [FavList, setFavList] = useState()

 useEffect(() => {
  
    getDataFav()
  }, [])

    function getDataFav() {
    getFavourites(FavRetrieved)
    }

    function FavRetrieved(FavList) {
    setFavList(FavList)
    }

 

Например, если я использую плоский список, передающий список избранных в качестве данных, я могу видеть все элементы коллекции, но что, если я хочу показать только первый идентификатор массива?
Я не хочу использовать функцию where, мне нужно видеть данные в виде массива, например, что-то вроде FavList[0].имя (но это не работает)

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

1. Вы должны использовать where инструкцию в firebase, потому .doc() что она работает только с идентификатором firebase по умолчанию.

Ответ №1:

Во — первых, нам нужно настроить getFavourites его так, чтобы он обрабатывал случай, когда пользователь не вошел в систему со значимой ошибкой, и он не должен использовать обратные вызовы, если вы используете async await синтаксис / — вместо этого просто используйте цепочку обещаний.

 export async function getFavourites() {
    const user = firebase.auth().currentUser;

    if (!user)
        return Promise.reject(new Error("User must be signed in first"));

    const favList = []
    const snapshot = await firebase
        .firestore()
        .collection("Favourites")
        .doc(user.uid)
        .collection("userFavourites")
        .get()

    snapshot.forEach((doc) => {
        const favDocData = doc.data()
        favDocData.id = doc.id
        favList.push(favDocData)
    })

    return favList
}
 

Затем вы бы использовали его в своем компоненте следующим образом:

 import { getFavourites } from '../context/WorkoutController'

// status of favList
const [status, setStatus] = useState("loading")
// array of favourites
const [favList, setFavList] = useState()
// error message to show user
const [errorMsg, setErrorMsg] = useState("")

useEffect(() => { 
    let disposed = false

    getFavourites()
        .then((newFavList) => {
            if (disposed) return // component discarded, do nothing.

            setFavList(newFavList)
            setErrorMsg("")
            setStatus("fetched")
        })
        .catch((err) => {
            if (disposed) return // component discarded, do nothing.

            console.error("getFavourites failed: ", err)
            setErrorMsg("Failed to get favourites")
            setStatus("error")
        });

    // return cleanup function
    return () => disposed = true
}, []);

if (status === "loading")
  return (<Spinner />)

if (status === "error")
  return (<div key="error">{errorMsg}</div>)

// if here, favList is now an array of favourite documents data
return ( /* ... render favList ... */ )
 

Ответ №2:

 export async function getFavourites(FavRetrived) {
    var FavList = []
    var snapshot = await firebase
        .firestore()
        .collection("Favourites")
        .doc(firebase.auth().currentUser.uid)
        .collection("userFavourites")
        .get()
    snapshot.forEach((doc) => {
        const favDoc = doc.data();
        const id = doc.id;
        FavList.push({ id, ...favDoc })
    })
    FavRetrived(FavList)
}
 

Вы можете получить к нему доступ по FavList[0].id