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

Firebase函数部署报错:functions.firestore.document is not a function 求助解决

Firebase函数部署报错:functions.firestore.document is not a function 求助解决

嘿,这个报错我之前也碰到过,大概率是你用的Firebase Functions SDK版本和代码语法不兼容导致的!下面给你两种解决方案,你可以根据情况选:

方案一:降级SDK到v1版本(不用改代码)

如果不想调整代码结构,直接把firebase-functions降级到v1.x版本就行,因为你的代码是v1的语法:

  1. 先卸载当前版本:
npm uninstall firebase-functions
  1. 安装v1版本:
npm install firebase-functions@1
  1. 重新部署函数:
firebase deploy --only functions

方案二:升级代码到v2版本语法(推荐,更适配最新特性)

Firebase Functions v2版本重构了触发器的写法,旧的functions.firestore.document()语法不再适用,改成下面的写法就行:

修改你的函数代码:

const admin = require("firebase-admin");
// 注意这里的导入方式变了
const { onDocumentCreated } = require("firebase-functions/v2/firestore");
admin.initializeApp();

exports.sendNotificationOnNewMessage = onDocumentCreated("messages/{s}/messages/{r}/pm/{id}", async (event) => {
  // v2里用event.data.data()获取文档数据
  const messageData = event.data.data();
  // 参数从event.params里取
  const { s, r } = event.params;
  
  const u = await admin.firestore().collection("users").doc(r).get();
  if (!u.exists) {
    console.log(`User ${r} not found in users collection.`);
    return null;
  }
  
  const receiverToken = u.data().token;
  if (!receiverToken) {
    console.log(`Skipping notification.`);
    return null;
  }
  
  const payload = {
    notification: {
      title: `New message from ${s}`,
      body: messageData.content,
    },
    token: receiverToken,
  };
  
  try {
    await admin.messaging().send(payload);
    console.log("Notification sent successfully");
  } catch (error) {
    console.error("Error sending notification:", error);
  }
  return null;
});

另外记得同步升级firebase-admin到最新版本,避免版本兼容问题:

npm install firebase-admin@latest

最后,你的Firestore规则是没问题的,和这个报错无关,不用调整~

备注:内容来源于stack exchange,提问作者Eren

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 09:18:03