You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:23:12