# #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
не существует на самом деле, поэтому их данные будут заданы как неопределенные. Таким образом, вполне вероятно, что основная причина этой проблемы находится где-то в другом месте вашего приложения.