如何使用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
相关产品推荐
相关产品推荐

