[英]Trying to update a single field in a firestore database
我想要做的是在用户单击按钮时更新所选值。 我有要添加的新值,但出现错误。
<button className='buttonCheck' onClick={checkAnswer}>CHECK MY ANSWER</button>
当我单击按钮时,它会调用“checkAnswer”function
function AnswerComponent(props) {
let totalNoAnswers = props.totalAnswers;
let answers = props.answersarray;
const [valueA, setValue] = useState() // make this mean something better
const [showCongratsModal, setShowCongratsModal] = useState(false);
const [showCongratsURL, setShowCongratsURL] = useState("")
const [showWindowContent, setShowWindowContent] = useState("")
const [selectedAnswerGroup, setSelectedAnswerGroup] = useState("")
const [chosenCount, setChosenCount]= useState()
function checkAnswer() {
setShowCongratsModal(true)
if (valueA === true) {
setShowCongratsURL("https://firebasestorage.googleapis.com/v0/b/assignment219000170.appspot.com/o/videos%2Fcongrat_w3_s.mp4?alt=media&token=034ea1bc-b3e0-4b51-957f-854dae963896")
} else if (valueA === false) {
setShowWindowContent("Incorrect answer - please try again.")
} else {
setShowWindowContent("Please choose an answer before proceeding.")
}
const updateFirestore = async () => {
const db = firebase.firestore();
const collectionId = "Questions";
const documentId = "balances";
const snapshot = db.collection(collectionId).doc(documentId);
console.log("> ", snapshot)
console.log(">> ", selectedAnswerGroup)
const res = await snapshot.set({
balances: {
balances: {
answers: {
[selectedAnswerGroup]: {
chosen: chosenCount
}
}
}
}
}, {merge: true})
console.log("1", res)
}
updateFirestore()
}
变量 selectedAnswerGroup 包含“answer_1” - 而“chosenCount”将包含一个新数字,因此使用上面的内容,我想我会更新数据库。
但是,我在控制台上收到一个错误 Uncaught (in promise) TypeError: firestore.collection(...).doc(...).balances is undefined
我看不出我做错了什么。
我是否需要将其包含在 firebase.auth() 块中?
您收到此错误: TypeError: firestore.collection(...).doc(...).balances is undefined
由于您构建引用的方式。 这是您遇到错误的代码行:
const snapshot = await firestore.collection(collectionId).doc(documentId).balances.balances.answers[selectedAnswerGroup]
TypeError: undefined
当读取属性或在未定义的变量上调用 function 时发生。 您正在使用点符号来访问method
,因此它将balances
读取为一种方法。
您的参考应始终遵循以下模式:
db.collection("main_collection").doc("main_collection's_document").collection("sub_collection").doc("sub_collection's_document");
查看Cloud Firestore 数据 model ,这是开始构建对 Firestore 数据结构的引用的好方法。
要更新 object 的 map 内的特定字段,您必须定义文档标识符并基于您的 Firestore 数据结构构建 map。 请参阅下面的代码:
function checkAnswer() {
setShowCongratsModal(true)
if (valueA === true) {
setShowCongratsURL("https://firebasestorage.googleapis.com/v0/b/assignment219000170.appspot.com/o/videos%2Fcongrat_w3_s.mp4?alt=media&token=034ea1bc-b3e0-4b51-957f-854dae963896")
} else if (valueA === false) {
setShowWindowContent("Incorrect answer - please try again.")
} else {
setShowWindowContent("Please choose an answer before proceeding.")
}
updateFirestore()
.then((snapshot) => {
console.log('updateFirestore() successfully called!');
console.log(snapshot);
})
.catch((e) => {
console.log(e);
});
}
async function updateFirestore() {
const db = firebase.firestore();
const collectionId = "Questions";
const documentId = "balances";
// You could also log something here to ensure that this async function has been ran.
// console.log(selectedAnswerGroup);
// console.log(chosenCount);
const snapshot = db
.collection(collectionId)
.doc(documentId)
.set(
{
balances: {
balances: {
answers: {
[selectedAnswerGroup]: {
chosen: chosenCount
}
}
}
}
}, {merge: true});
return snapshot;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.