Firestore文档上传函数异常求助:键值未正确引用问题
问题分析与解决方案
首先,你碰到的是JavaScript/TypeScript对象字面量的典型陷阱:当你在update方法里写{ keyValue: valueValue }时,这里的keyValue是一个固定字符串键名,而非引用你之前声明的keyValue变量。这直接导致两个问题:
- Firestore会创建一个名为
keyValue的字段,完全不符合你要更新对应doc.data()键名的预期 - 因为变量
keyValue没有被真正使用(字面量里的是字符串,不是变量),所以编译器/IDE会抛出"已声明但未使用"的错误
修正核心代码
只需要把对象字面量里的keyValue改成计算属性名(用方括号包裹变量),就能让Firestore使用变量的值作为字段名:
function createObjectDocument(document: any, caseNumber: String) { document.get().then(function(doc: any) { if (doc.exists) { console.log("Document data:", doc.data()); for (let [key, value] of Object.entries(doc.data())) { // 无需额外声明keyValue/valueValue变量,直接用循环里的key和value即可 if (key != "CaseRefArray") { db.collection("casesToExport").doc(caseNumber).update({ [key]: value // 用方括号包裹变量,将其值作为字段名 }) .then(() => { console.log("Successfully updated document!"); }).catch((error: any) => { console.error("Error updating document: ", error); }); } } } else { console.log("No such document!"); } }).catch(function(error: any) { console.log("Error getting document:", error); }); }
额外性能优化建议
当前代码会在循环里多次调用update,如果doc.data()包含多个字段,会发起多次Firestore请求。更高效的做法是先构建完整的更新对象,再一次性调用update:
function createObjectDocument(document: any, caseNumber: String) { document.get().then(function(doc: any) { if (doc.exists) { console.log("Document data:", doc.data()); const updateData: { [key: string]: any } = {}; // 先收集所有需要更新的字段 for (let [key, value] of Object.entries(doc.data())) { if (key != "CaseRefArray") { updateData[key] = value; } } // 一次性提交更新,减少网络请求次数 db.collection("casesToExport").doc(caseNumber).update(updateData) .then(() => { console.log("Successfully updated document!"); }).catch((error: any) => { console.error("Error updating document: ", error); }); } else { console.log("No such document!"); } }).catch(function(error: any) { console.log("Error getting document:", error); }); }
内容的提问来源于stack exchange,提问作者Andrei Enache
相关产品推荐
相关产品推荐

