
在 firebase firestore 中,`doc.data` 是一个方法而非属性,若直接访问 `doc.data` 而未加括号调用,将返回函数定义本身,导致后续字段读取为 `undefined`;正确做法是调用 `doc.data()` 获取实际数据对象。
当你从 Firestore 读取文档时,每个 QueryDocumentSnapshot(即 doc)对象提供一个 data() 方法——注意是带括号的函数调用——用于提取文档的实际字段数据。而 doc.data(无括号)只是对该方法的引用,打印出来就是类似 data(e={}){return super.data(e)} 的函数体,这正是你控制台中看到的重复输出来源。
在你的代码中,问题出在这一行:
var fields = doc.data; // ❌ 错误:未调用方法,fields 指向函数本身
它应修正为:
var fields = doc.data(); // ✅ 正确:调用方法,返回包含字段的对象
完整修复后的 fetchRows 函数如下:
const fetchRows = async () => {
try {
const querySnapshot = await getDocs(collection(firestore, "pdf"));
querySnapshot.forEach((doc) => {
const fields = doc.data(); // ✅ 关键修复:添加括号
rows.push({
id: doc.id,
title: fields.subject, // 现在能正确读取 subject 字段
link: fields.link // 同样适用于 link 等其他字段
});
});
console.log(rows); // 此时每项的 title 和 link 将不再为 undefined
} catch (error) { // 注意:原代码中 error 未声明,需补全参数
alert("Notice Download Failed.");
console.error("Firestore fetch error:", error);
}
};⚠️ 额外注意事项:
- catch 块中必须声明 error 参数(如 catch (error)),否则 console.log(error) 会报 ReferenceError;
- 建议使用 const 或 let 替代 var,避免变量提升和作用域问题;
- 若某些文档确实缺失 subject 或 link 字段,fields.subject 仍会是 undefined——此时可添加安全访问逻辑,例如:
title: fields.subject ?? "No title", link: fields.link || "#"
掌握 doc.data() 的函数本质,是正确解析 Firestore 文档数据的基础。务必记住:不是 doc.data,而是 doc.data()。










