Firebase Functions提取Firestore集合引用至助手文件遇部署栈溢出错误
Firebase Gen 2 Functions 部署栈溢出问题(集合引用导出导致)
开发Gen 2版本Firebase Functions时,为了避免重复代码和拼写错误,我尝试把所有Firestore集合引用集中在一个助手文件里导出,但只要在函数中使用这些引用,部署时就会出现栈溢出错误:
Got response code 400; body Failed to generate manifest from function source: RangeError: Maximum call stack size exceeded
相关代码示例
firestore-collections.ts(原助手文件)
import { getFirestore } from "firebase-admin/firestore"; const firestore = getFirestore(); const getColRef = (collectionName: string) => { const colRef = firestore.collection(collectionName); return colRef; }; export const colRefs = { cities: getColRef("cities"), countries: getColRef("countries"), projects: getColRef("projects"), };
test-function.ts(使用引用的函数)
import { logger } from "firebase-functions/v2"; import { onRequest } from "firebase-functions/v2/https"; import { colRefs } from "./firestore-collections"; export const testFunction = onRequest(async (req, res) => { const docRef = colRefs.cities.doc(); logger.info(docRef.id); res.status(200).send("Success"); });
index.ts(函数导出入口)
import { initializeApp } from "firebase-admin/app"; initializeApp(); export * from "./test-function";
问题原因
模块加载阶段就直接初始化了Firestore集合引用对象,而部署过程中需要序列化函数相关的模块内容,集合引用对象内部存在循环引用,导致序列化时栈溢出。同时,模块加载时Firebase Admin可能尚未完成初始化,也会引发潜在问题。
解决方法
将集合引用的创建改为延迟初始化,只在实际使用时才生成引用对象,避免模块加载阶段的提前初始化。
修改后的firestore-collections.ts(Getter方式)
import { getFirestore } from "firebase-admin/firestore"; const firestore = getFirestore(); const getColRef = (collectionName: string) => { return firestore.collection(collectionName); }; export const colRefs = { get cities() { return getColRef("cities"); }, get countries() { return getColRef("countries"); }, get projects() { return getColRef("projects"); }, };
或者改用函数导出方式
import { getFirestore } from "firebase-admin/firestore"; const firestore = getFirestore(); export const getCitiesCol = () => firestore.collection("cities"); export const getCountriesCol = () => firestore.collection("countries"); export const getProjectsCol = () => firestore.collection("projects");
使用时只需稍作调整,比如改成const docRef = getCitiesCol().doc();即可。
内容的提问来源于stack exchange,提问作者TinyTiger
相关产品推荐
相关产品推荐

