
在使用 firebase firestore 的 web sdk 时,`doc.data` 是一个方法而非属性,必须加括号调用 `doc.data()` 才能获取文档的实际字段对象;若误写为 `doc.data`(不带括号),将返回函数定义本身,导致后续字段访问全部为 `undefined`。
Firebase Firestore 的 JavaScript SDK 中,QueryDocumentSnapshot.data 是一个方法(function),用于反序列化并返回文档的字段数据对象。这是一个常见但极易被忽略的语法细节——它不是像 doc.id 那样的只读属性,因此不能直接赋值或访问,必须显式调用。
在你的代码中:
var fields = doc.data; // ❌ 错误:赋值的是函数引用,不是执行结果
这行代码实际把 data 方法本身赋给了 fields,所以 fields.subject 相当于 undefined(因为函数对象没有 subject 属性),而 console.log(fields) 输出的正是该函数体内容(如 data(e={}){return super.data(e)}),这也印证了你看到的奇怪日志。
✅ 正确写法是:
var fields = doc.data(); // ✅ 正确:调用方法,返回包含字段的对象
以下是修复后的完整示例代码(含错误处理与现代实践建议):
⚠️ 注意事项:
- catch 块中需声明 error 参数(即 catch (error)),否则 console.log(error) 会报 ReferenceError;
- Firestore 文档字段可能不存在(尤其在非严格模式集合中),建议对关键字段做空值兜底(如 fields.subject || "Untitled");
- 若需响应式更新页面,应在 rows 构建完成后显式调用 DOM 渲染逻辑(如 document.getElementById(...).innerHTML = ...),当前代码仅完成数据采集;
- 生产环境推荐使用 onSnapshot 实现实时监听,而非一次性 getDocs。
掌握 doc.data() 这一调用约定,是正确对接 Firestore 数据层的基础。务必牢记:所有 .data、.get()、.set() 等均为方法,不可省略括号。










