Firebase Functions配置.env部署报默认Firebase应用不存在错误
Firebase Cloud Functions原生支持.env文件配置,无需安装dotenv等第三方依赖包。
在项目的functions目录下创建了.env文件,目录结构如下:
/app /functions .env .eslintrc.js package.json /src ...
.env文件配置内容如下:
FIREBASE_PROJECT_ID=aaaaa FIREBASE_KEY_ID=bbbbb FIREBASE_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\nxxxxxxxx\n-----END PRIVATE KEY-----\n FIREBASE_CLIENT_EMAIL=zzzzz FIREBASE_CLIENT_ID=ddddd FIREBASE_AUTH_URI=qqqqqq FIREBASE_TOKEN_URI=jjjjjj FIREBASE_AUTH_PROVIDER_X509_CERT_URI=lllllll FIREBASE_CLIENT_X509_CERT_URI=nnnnnnnn FIREBASE_STORAGE_BUCKET_URI=mmmmmmm
部署函数时抛出如下报错:
Error: Error occurred while parsing your function triggers.
The default Firebase app does not exist. Make sure you call initializeApp() before using any of the Firebase services.
当前使用如下方式初始化Firebase Admin SDK:
try { const googleCloudServiceAccount = require("./credentials"); admin.initializeApp({ credential: admin.credential.cert(googleCloudServiceAccount), storageBucket: process.env.FIREBASE_STORAGE_BUCKET_URI, }); } catch (err) { functions.logger.error(`Error initializing firebase: ${err}`); } // Initialize Firebase Services const auth = admin.auth(); const firestore = admin.firestore(); const storage = admin.storage(); // Storage Bucket const storageBucket = storage.bucket(process.env.FIREBASE_STORAGE_BUCKET_URI);
module.exports = { type: "service_account", project_id: process.env.FIREBASE_PROJECT_ID, private_key_id: process.env.FIREBASE_KEY_ID, private_key: process.env.FIREBASE_PRIVATE_KEY.replace(/\\n/g, "\n"), client_email: process.env.FIREBASE_CLIENT_EMAIL, client_id: process.env.FIREBASE_CLIENT_ID, auth_uri: process.env.FIREBASE_AUTH_URI, token_uri: process.env.FIREBASE_TOKEN_URI, auth_provider_x509_cert_url: process.env.FIREBASE_AUTH_PROVIDER_X509_CERT_URI, client_x509_cert_url: process.env.FIREBASE_CLIENT_X509_CERT_URI, };
备注:如果不使用.env+credentials.js的配置方式,直接将所有密钥等配置硬编码写入credentials.json文件,所有功能可正常运行。
报错本质是admin.initializeApp()根本没执行成功,失败的错误被你写的catch块吞了,代码继续往下跑调用Firebase服务,就触发了默认app不存在的提示。
先改你初始化部分的catch逻辑,不要吞错,把初始化阶段的真实错误抛出来:
} catch (err) { functions.logger.error(`Firebase初始化失败: ${err}`); throw err; // 加这行,不要让失败的初始化流程继续往下走 }
改完重新部署就能看到初始化失败的真实原因,90%概率是下面两个问题:
- 私钥解析错误:你在.env里写的
\n是字面量的反斜杠+n字符,你写的替换正则/\\n/g匹配的是转义后的换行符,匹配不到你.env里写的字面量\n,导致私钥格式不对,admin.credential.cert()校验直接抛错。最稳妥的私钥写法是在.env里用双引号包裹多行私钥,不需要做任何换行替换:
对应credentials.js里直接取FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY----- 你的私钥正文第一行 你的私钥正文第二行 -----END PRIVATE KEY-----"process.env.FIREBASE_PRIVATE_KEY就行,不用加replace逻辑。 - 环境变量没被正确加载:Firebase CLI从v10.0版本才开始自动加载functions目录下的.env文件,先升级本地Firebase CLI到最新版本。另外注意环境文件的加载规则:通用配置放
.env,本地调试配置放.env.local,生产部署配置放.env.production,别放错文件导致部署时读不到变量。
额外提一句:Cloud Functions运行环境默认自带当前项目的服务账号凭证,不需要手动传service account参数,直接写admin.initializeApp()就能完成初始化,省掉维护私钥的麻烦,安全性也更高。
内容的提问来源于stack exchange,提问作者Raul

