You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nuxt3+Github Actions部署Firebase时环境变量无法访问求助

Nuxt3部署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配置环境变量:

  1. 打开Firebase控制台,进入目标项目
  2. 切换到Functions标签页,点击右上角设置图标选择环境变量
  3. 添加对应变量:FIREBASE_APIKEY、FIREBASE_AUTHDOMAIN等,值与Github Secrets一致
  4. 保存后重新部署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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:52:55