Node.js TypeError:admin.firestore调用中data不是函数问题
解决Firebase Cloud Functions中TypeError: data is not a function的问题
错误原因
你遇到的TypeError是因为get()方法是异步的,它返回的是一个Promise对象,而不是直接的文档快照。你不能直接在Promise后面链式调用.data(),因为Promise没有这个方法。
另外你的代码还有几个潜在问题:
- 当
reviews文档是首次创建时,change.before会是null,调用change.before.data()会直接报错 - 没有检查
change.after.data()是否存在,如果文档被删除,data()会返回null - 没有处理
websites文档不存在的情况,读取不存在文档的data()会返回null,再访问.url会报错
修复后的代码
把函数改成async函数,用await处理异步操作,同时加上必要的空值检查:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); admin.initializeApp(); exports.writeToClay = functions .region("europe-west1") .firestore .document("/reviews/{documentId}") .onWrite(async (change, context) => { // 改成async函数 // 处理change.before可能为null的情况 const websiteId = change.before?.data()?.websiteId; if (!websiteId) { console.log("没有获取到有效的websiteId"); return null; } console.log("websiteID:", websiteId); const afterData = change.after.data(); // 检查文档是否存在,以及code是否为"1" if (afterData && afterData.code === "1") { // 用await等待get()返回文档快照 const websiteDoc = await admin.firestore().collection("websites").doc(websiteId).get(); if (!websiteDoc.exists) { console.log(`websites文档${websiteId}不存在`); return null; } const url = websiteDoc.data().url; console.log("url:", url); } return null; // Cloud Functions需要返回Promise或值,避免超时 });
关键改动说明
- 函数声明加上
async,用await等待get()的结果,确保拿到DocumentSnapshot后再调用.data() - 使用可选链操作符
?.处理change.before和data()可能为null的情况 - 检查
websiteDoc.exists,避免读取不存在的文档数据 - 最后返回
null,确保Cloud Functions有明确的返回值,防止函数超时
内容的提问来源于stack exchange,提问作者le Minh Nguyen
相关产品推荐
相关产品推荐

