Firebase Firestore не отвечает

# #firebase #google-cloud-firestore #firebase-security

Вопрос:

Приветствую, в общем проблема в следующем, я создал веб-приложение с использованием React JS, как базу данных с использованием Firestore Firebase. Все работало нормально, пока не пришло время обновить правила безопасности (они были временными, ну, и время истекло). Он потребовал немедленно изменить правила, иначе база перестанет отвечать после истечения срока. Сначала я просто продлил временные правила, но это сработало только один раз, после чего все подобные попытки оказались тщетными. Прочитав документацию по написанию правил безопасности и просмотрев пару учебных пособий, я решил написать простые правила allow read: if true; allow write: if false; . В проекте пользователь никак не взаимодействует с базой, текст просто исходит из базы и все по сути, так что этих правил более чем достаточно. Я также дополнительно проверил эти правила на эмуляторе, и все прошло хорошо. Я сохранил правила, но приложение не поднялось, я попробовал другие варианты, до такой степени, что я просто поставил true везде и сделал базу полностью открытой, но безрезультатно. Я уже все перепробовал и все обшарил, но так и не смог найти решение.

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

Мой код приложения:

 import React, { useContext, useState } from 'react';
import { useDocumentData } from 'react-firebase-hooks/firestore'
import { CircularProgress } from '@material-ui/core';
import { Context } from '../../../index'
import { Dialog, DialogTitle, DialogContent, DialogActions, makeStyles, Button, FormControl, FormLabel, RadioGroup, FormControlLabel, Radio } from '@material-ui/core'
import langSwitcher from '../../languageSwitcher'

const useStyles = makeStyles({
    modalBlock: {
        backgroundColor: "transparent",
        color: "#308446",
    }
})

export function TestModal(props) {

    const cls = useStyles()

    let result = 0
    const [count, setCount] = useState(1)
    const [qCount, setQCount] = useState(1)
    const [answerArray, setAnswerArray] = useState([])
    const [answer, setAnswer] = useState("");
    const { firestore } = useContext(Context)
    const [test, loading] = useDocumentData(
        firestore.doc(langSwitcher('testEng/test', 'testUa/test'))
    )

    if (loading) {
        return (
            <CircularProgress />
        )
    }

    const handleChange = (e) => {
        setAnswer(e.target.value)
    }

    const handleClick = () => {
        if (answer === "") {
            alert("!")
        } else if (count === test.ra.length) {
            setAnswerArray([...answerArray, answer])
            setCount(count   1)
        } else if (count < test.ra.length) {
            setAnswerArray([...answerArray, answer])
            setAnswer("")
            setQCount(qCount   1)
            setCount(count   1)
        } else {
            for (let i = 0; i < answerArray.length; i  ) {
                if (answerArray[i] === test.ra[i]) {
                      result
                }
            }
            alert(langSwitcher("Your result: ", "Ваш результат ")   result   "/"   test.ra.length   
            langSwitcher(result >= 0 amp;amp; result <= 4 ? " You are Junior!" : result >= 4 amp;amp; result <= 8 ? " You are Middle!" : " You are Master!", "Ваш результат "))
            result = 0
            setCount(1)
            setQCount(1)
            setAnswerArray([])
            setAnswer("")
            props.updateTestState(false)
        }
    }

    const handleClose = () => {
        result = 0
        setCount(1)
        setQCount(1)
        setAnswerArray([])
        setAnswer("")
        props.updateTestState(false)
    }

    return (
        <Dialog open={props.testState} onClose={() => props.updateTestState(false)} aria-labeledby="form-dialog-title">
            <DialogTitle className={cls.modalBlock} id="form-dialog-title">{langSwitcher("Test", "Тест")}</DialogTitle>
            <DialogContent className={cls.modalBlock}>
                <FormControl component="fieldset">
                    <FormLabel component="legend">{test['q'   qCount]}</FormLabel>
                    <RadioGroup aria-label="test" name="test" value={answer} onChange={handleChange}>
                        <FormControlLabel value={test['a'   qCount][0]} control={<Radio />} label={test['a'   qCount][0]} />
                        <FormControlLabel value={test['a'   qCount][1]} control={<Radio />} label={test['a'   qCount][1]} />
                        <FormControlLabel value={test['a'   qCount][2]} control={<Radio />} label={test['a'   qCount][2]} />
                        <FormControlLabel value={test['a'   qCount][3]} control={<Radio />} label={test['a'   qCount][3]} />
                    </RadioGroup>
                </FormControl>
            </DialogContent>
            <DialogActions className={cls.modalBlock}>
                <Button type="submit" onClick={handleClick} color="primary">{count > test.ra.length ? langSwitcher("Result", "Результат") : langSwitcher("Confirm", "Підтвердити")}</Button>
                <Button onClick={handleClose} color="secondary">{langSwitcher("Cancel", "Скасувати")}</Button>
            </DialogActions>
        </Dialog>
    )
} 

Снимок экрана с ошибкой:введите описание изображения здесь

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

1. Не могли бы вы поделиться своим кодом и скриншотом ошибки, которую вы получаете?

2. @Дхармарадж готов

3. Если либо testEng/test или testUa/test (в зависимости от обстоятельств) на самом деле не существует, их данные будут установлены как undefined .

4. @samthecodingman черт возьми, ты прав, это моя небрежность, у меня есть языковой индикатор, и он показал другой язык, для которого пока нет базы. Я проверял это раньше, и все было в порядке, но по какой-то причине индикатор языка изменился. Большое спасибо.

Ответ №1:

Опубликуйте это как вики-страницу сообщества, поскольку она основана на комментариях @samthecodingman и @spectrum_10101.

Ошибка генерируется либо testEng/test тем, либо другим, либо testUa/test не существует на самом деле, поэтому их данные будут заданы как неопределенные. Таким образом, вполне вероятно, что основная причина этой проблемы находится где-то в другом месте вашего приложения.