部署Nuxt 3+VueFire应用至Firebase后遇凭据文件读取错误
问题
将Nuxt 3应用部署到Firebase后出现以下错误:
Error: Failed to read credentials from file service-account.json: Error: ENOENT: no such file or directory, open 'service-account.json' at .readCredentialFile ( /workspace/node_modules/firebase-admin/lib/app/credential-internal.js:507 ) at .credentialFromFile ( /workspace/node_modules/firebase-admin/lib/app/credential-internal.js:480 ) at .getApplicationDefault ( /workspace/node_modules/firebase-admin/lib/app/credential-internal.js:401 ) at .AppStore.initializeApp ( /workspace/node_modules/firebase-admin/lib/app/lifecycle.js:34 ) at .initializeApp ( /workspace/node_modules/firebase-admin/lib/app/lifecycle.js:102 ) at undefined. ( file:///workspace/node_modules/firebase-frameworks/dist/firebase-aware.js:10 ) at .ModuleJob.run ( node:internal/modules/esm/module_job:195 )
使用Nuxt 3 + VueFire开发,已在.env中设置GOOGLE_APPLICATION_CREDENTIALS=service-account.json,项目根目录也存在内容正确的service-account.json文件,但部署后Cloud Function日志仍报上述错误,网站返回500错误,怀疑是构建/部署时环境变量或文件丢失。
项目创建流程:
- 通过
npx nuxi@latest init <project-name>初始化Nuxt项目 - 执行
firebase init关联Firebase项目 - 按照VueFire官方文档配置(包括认证部分),下载服务账户文件并命名为
service-account.json放在根目录,配置.env环境变量
解决方案
1. 检查文件是否被部署忽略
- 查看项目根目录的
.gitignore文件,确认是否包含service-account.json规则,如果有,要么移除该规则,要么改用Firebase Secrets管理凭证(更安全) - 检查
firebase.json中的functions配置,确认是否设置了ignore规则排除了该文件
2. 改用环境变量注入凭证内容(替代文件路径)
将service-account.json的内容转为Base64编码,在Firebase控制台的项目设置 > 环境变量中添加新变量(如FIREBASE_ADMIN_CREDENTIALS),值为Base64后的内容。
修改Nuxt配置:
// nuxt.config.ts export default defineNuxtConfig({ runtimeConfig: { firebaseAdminCredentials: process.env.FIREBASE_ADMIN_CREDENTIALS, }, })
服务端初始化代码调整:
import { initializeApp, cert } from 'firebase-admin/app' const credentials = JSON.parse(Buffer.from(process.env.FIREBASE_ADMIN_CREDENTIALS!, 'base64').toString()) initializeApp({ credential: cert(credentials) })
3. 确认Firebase环境变量已正确上传
- 运行
firebase functions:config:get检查是否能获取到设置的环境变量 - 若使用本地
.env,可执行firebase functions:config:set env.google_application_credentials="$(cat service-account.json | base64)"同步到Firebase,或直接在控制台手动添加
4. 配置Nuxt runtimeConfig隔离环境变量
确保凭证相关变量被注入到服务端可用的runtimeConfig中(Nuxt 3客户端与服务端环境变量隔离):
// nuxt.config.ts export default defineNuxtConfig({ runtimeConfig: { // 仅服务端可访问 googleApplicationCredentials: process.env.GOOGLE_APPLICATION_CREDENTIALS, public: { // 客户端可访问变量(无需放置凭证) } } })
5. 使用Firebase默认凭证(推荐)
在Firebase Functions环境中,无需手动提供服务账户文件,平台会自动注入默认凭证。修改初始化代码:
import { initializeApp } from 'firebase-admin/app' // 直接初始化,无需指定cert参数 initializeApp()
此方式会自动使用Firebase内置的服务账户权限,彻底避免文件路径相关问题。
内容的提问来源于stack exchange,提问作者starleaf1
相关产品推荐
相关产品推荐

