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

如何使用Firebase模拟器写入Firestore与Storage?代码报错排查

Firebase函数模拟器跨集合/存储写入问题

初始正常运行的代码

我的Firebase函数在模拟器中运行正常,可写入触发它的同一集合和文档:

import * as functions from "firebase-functions";

export const MakeUppercase = functions.firestore.document('Messages/{docId}').onCreate((snap, context) => {
  try {
    const original = snap.data().original;
    const uppercase = original.toUpperCase();
    return snap.ref.set({ uppercase }, { merge: true });
  } catch (error) {
    console.error(error);
  }
});

写入另一个Firestore集合时触发错误

现在我想要写入Firestore模拟器中的另一个集合,修改代码如下:

import { initializeApp } from "firebase/app";
import * as functions from "firebase-functions";
import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";

const firebaseConfig = {
  apiKey: "...",
  authDomain: "triggerable-functions-project.firebaseapp.com",
  projectId: "triggerable-functions-project",
  storageBucket: "triggerable-functions-project.appspot.com",
  messagingSenderId: "...",
  appId: "..."
};

const app = initializeApp(firebaseConfig);
const db = getFirestore();
connectFirestoreEmulator(db, 'localhost', 8080);

export const MakeUppercase = functions.firestore.document('Messages/{docId}').onCreate((snap, context) => {
  try {
    const original = snap.data().original;
    const uppercase = original.toUpperCase();
    return db.firestore().collection('AnotherCollection').doc(context.params.docId).set({ uppercase }, { merge: true });
  } catch (error) {
    console.error(error);
  }
});

此时抛出错误:

TypeError: db.firestore is not a function

我怀疑是Firestore文档引用错误,或是缺少必要模块导入。

使用Admin SDK仍触发相同错误

尝试更换为Admin SDK写入Cloud Firestore,修改代码如下:

import * as admin from "firebase-admin";
...
return admin.firestore().collection('AnotherCollection').doc(context.params.docId).set({ uppercase }, { merge: true });

仍出现相同错误:

TypeError: admin.firestore is not a function

写入Storage模拟器的错误

尝试写入Storage模拟器,代码如下:

import { getStorage, connectStorageEmulator, ref, uploadString } from "firebase/storage";
...
const storage = getStorage();
connectStorageEmulator(storage, "localhost", 9199);
...
return storage.collection('AnotherCollection').doc(context.params.docId).set({ uppercase }, { merge: true });

同样抛出错误:

TypeError: storage.collection is not a function

写入Cloud Storage的问题

修改代码尝试写入Cloud Storage:

const storageRef = ref(storage, 'Messages');
...
return uploadString(storageRef, uppercase);

日志显示函数执行无错误,但在Firebase控制台中看不到Cloud Storage中的文件。

最终代码疑问:声明的app为何从未使用?

以下是我的最终代码,请问为什么声明了app却从未使用?

import { initializeApp } from "firebase/app";
import * as functions from "firebase-functions";
import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";
import { getStorage, connectStorageEmulator, ref, uploadString } from "firebase/storage";
import * as admin from "firebase-admin";

const firebaseConfig = {
  apiKey: "...",
  authDomain: "triggerable-functions-project.firebaseapp.com",
  projectId: "triggerable-functions-project",
  storageBucket: "triggerable-functions-project.appspot.com",
  messagingSenderId: "...",
  appId: "..."
};

const app = initializeApp(firebaseConfig);
const db = getFirestore();
connectFirestoreEmulator(db, 'localhost', 8080);
const storage = getStorage();
const storageRef = ref(storage, 'Messages');
connectStorageEmulator(storage, "localhost", 9199);

export const MakeUppercase = functions.firestore.document('Messages/{docId}').onCreate((snap, context) => {
  try {
    const original = snap.data().original;
    const uppercase = original.toUpperCase();
    return uploadString(storageRef, uppercase);
  } catch (error) {
    console.error(error); // emulator always throws an "unhandled error": "Your function timed out after ~60s."
  }
});

内容的提问来源于stack exchange,提问作者Thomas David Kehoe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:45:34