Nuxt3+Github Actions部署Firebase时环境变量无法访问求助
我是Nuxt新手,用Nuxt3开发Web应用,需要在服务端使用Firebase密钥。本地通过.env存储配置,应用运行正常,但通过Github Actions部署到Firebase生产环境后,服务端无法读取环境变量,云控制台日志显示Firebase配置为空。
本地环境配置(.env)
NITRO_PRESET=firebase # Staging FIREBASE_APIKEY=** FIREBASE_AUTHDOMAIN=** FIREBASE_PROJECTID=** FIREBASE_STORAGEBUCKET=** FIREBASE_MESSAGINGSENDERID=** FIREBASE_APPID=**
服务端API代码(server/api/testfirebase.get.js)
import { db } from './libs/firebase' import { collection, getDocs } from "firebase/firestore"; export default defineEventHandler(async (event) => { const querySnapshot = await getDocs(collection(db, "test")); const messages = [] querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); messages.push({ id: doc.id, message: doc.data() }) }); return { data: messages } })
Firebase初始化代码(server/api/libs/firebase.js)
import { initializeApp } from "firebase/app"; import { getFirestore } from "firebase/firestore"; const firebaseConfig = { apiKey: process.env.FIREBASE_APIKEY, authDomain: process.env.FIREBASE_AUTHDOMAIN, projectId: process.env.FIREBASE_PROJECTID, storageBucket: process.env.FIREBASE_STORAGEBUCKET, messagingSenderId: process.env.FIREBASE_MESSAGINGSENDERID, appId: process.env.FIREBASE_APPID } const app = initializeApp(firebaseConfig); console.log("THE FIREBASE CONFIG ---------------------------------------------------------------------") console.log(firebaseConfig) const db = getFirestore(app); export {db};
Github Actions配置(staging-deploy.yml)
name: Staging Deployment workflow # Controls when the workflow will run 'on': push: branches: - staging jobs: deploy_to_production: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: install dependencies run: npm ci --legacy-peer-deps - name: set NITRO_PRESET and run build run: NITRO_PRESET=firebase npm run build env: FIREBASE_APIKEY: ${{ secrets.STAGING_FIREBASE_APIKEY }} FIREBASE_AUTHDOMAIN: ${{ secrets.STAGING_FIREBASE_AUTHDOMAIN }} FIREBASE_DATABASEURL: ${{ secrets.STAGING_FIREBASE_DATABASEURL }} FIREBASE_PROJECTID: ${{ secrets.STAGING_FIREBASE_PROJECTID }} FIREBASE_STORAGEBUCKET: ${{ secrets.STAGING_FIREBASE_STORAGEBUCKET }} FIREBASE_MESSAGINGSENDERID: ${{ secrets.STAGING_FIREBASE_MESSAGINGSENDERID }} FIREBASE_APPID: ${{ secrets.STAGING_FIREBASE_APPID }} FIREBASE_MEASUREMENTID: ${{ secrets.STAGING_FIREBASE_MEASUREMENTID }} - name: create config json uses: jsdaniell/create-json@1.1.2 id: create-config-json with: name: 'config.json' json: '${{ secrets.FIREBASE_SERVICE_ACCOUNT }}' dir: '.output/server' - name: deploy functions to production uses: w9jds/firebase-action@master with: args: use staging && firebase deploy --config staging.firebase.json -P staging env: GCP_SA_KEY: ${{ secrets.FIREBASE_SERVICE_ACCOUNT }} FIREBASE_APIKEY: ${{ secrets.STAGING_FIREBASE_APIKEY }} FIREBASE_AUTHDOMAIN: ${{ secrets.STAGING_FIREBASE_AUTHDOMAIN }} FIREBASE_DATABASEURL: ${{ secrets.STAGING_FIREBASE_DATABASEURL }} FIREBASE_PROJECTID: ${{ secrets.STAGING_FIREBASE_PROJECTID }} FIREBASE_STORAGEBUCKET: ${{ secrets.STAGING_FIREBASE_STORAGEBUCKET }} FIREBASE_MESSAGINGSENDERID: ${{ secrets.STAGING_FIREBASE_MESSAGINGSENDERID }} FIREBASE_APPID: ${{ secrets.STAGING_FIREBASE_APPID }} FIREBASE_MEASUREMENTID: ${{ secrets.STAGING_FIREBASE_MEASUREMENTID }}
Nuxt3官方文档语句解读
In production runtime, you should use platform environment variables and .env is not used.
这句话的意思是:在生产运行阶段,应用不能依赖本地的.env文件读取环境变量,必须使用部署平台(此处为Firebase)提供的环境变量管理机制来配置。因为部署后,本地.env文件不会被打包到生产环境,且平台运行时也不会加载该文件,只能通过平台原生的环境变量注入方式让应用读取。
问题原因与解决方案
问题原因
当前在Github Actions构建阶段注入的环境变量仅在构建时生效,而Nuxt3用NITRO_PRESET=firebase构建后,服务端代码会被打包为Firebase Functions,运行时Firebase Functions不会继承构建阶段的环境变量,导致process.env为空。
解决方案
方式一:配置Firebase Functions环境变量(推荐)
直接在Firebase控制台为Functions配置环境变量:
- 打开Firebase控制台,进入目标项目
- 切换到Functions标签页,点击右上角设置图标选择环境变量
- 添加对应变量:
FIREBASE_APIKEY、FIREBASE_AUTHDOMAIN等,值与Github Secrets一致 - 保存后重新部署Functions即可
这种方式由Firebase托管环境变量,安全可靠,运行时直接可用。
方式二:构建时注入环境变量(不推荐敏感信息)
若必须在构建阶段注入,可修改nuxt.config.ts让Nitro在打包时替换变量:
export default defineNuxtConfig({ nitro: { preset: 'firebase', env: { FIREBASE_APIKEY: process.env.FIREBASE_APIKEY, FIREBASE_AUTHDOMAIN: process.env.FIREBASE_AUTHDOMAIN, FIREBASE_PROJECTID: process.env.FIREBASE_PROJECTID, FIREBASE_STORAGEBUCKET: process.env.FIREBASE_STORAGEBUCKET, FIREBASE_MESSAGINGSENDERID: process.env.FIREBASE_MESSAGINGSENDERID, FIREBASE_APPID: process.env.FIREBASE_APPID } } })
构建时确保环境变量存在,Nitro会将变量替换到代码中。但此方式会把敏感信息打包进代码,存在安全风险,不建议用于密钥类信息。
调整Github Actions
使用方式一的话,可移除Github Actions中部署阶段的环境变量注入,构建阶段仅保留NITRO_PRESET即可:
- name: set NITRO_PRESET and run build run: NITRO_PRESET=firebase npm run build
内容的提问来源于stack exchange,提问作者Milan Lakhani

