如何在Node.js脚本中获取当前选中的Firebase项目?
问题
在CMD终端中,运行firebase projects:list可查看当前选中的项目,示例输出如下:
┌──────────────────────┬──────────────────────┬────────────────┬──────────────────────┐ │ Project Display Name │ Project ID │ Project Number │ Resource Location ID │ ├──────────────────────┼──────────────────────┼────────────────┼──────────────────────┤ │ Canvassing │ canvassing-xx │ xx │ us-west1 │ │ EC1 │ engage-xx │ xx │ us-central │ ├──────────────────────┼──────────────────────┼────────────────┼──────────────────────┤ │ PVBC │ pvbc-xx (current) │ xx │ us-west1
此时pvbc-xx为当前活跃项目。
我有两类Node.js代码场景:
- 部署到Firebase的云函数,通过
firebase deploy部署到当前选中项目:
const functions = require('firebase-functions'); const admin = require('firebase-admin'); firestore = admin.firestore(); exports.updateState = functions.pubsub.schedule('every 1 minutes').onRun((context) => { return bloc.updateActivityState(firestore); });
- 本地命令行操作脚本,目前需手动指定项目配置文件路径:
var fc = require('../firebase_project1_name/config/firebaseConfig.js'); var firebaseConfig = fc.firebaseConfig; var app = firebase.initializeApp(firebaseConfig); var db = firebase.firestore(app); var colDistrict = db.collection('districts'); ...
需求:在同一终端运行Node.js脚本时,自动获取当前通过firebase use选中的项目ID,实现动态加载对应配置;更理想的是无需存储配置文件,直接通过firebase-admin获取项目信息。
解决方案
方法1:通过firebase-tools获取当前项目ID
直接调用Firebase CLI的Node.js API获取当前项目,无需解析终端输出:
- 安装依赖:
npm install firebase-tools --save-dev
- 脚本中调用API:
const firebaseTools = require('firebase-tools'); async function getCurrentFirebaseProject() { try { const projectConfig = await firebaseTools.use.get(); return projectConfig.project; // 返回当前项目ID } catch (error) { console.error('获取当前项目失败:', error); return null; } } // 动态加载配置示例 getCurrentFirebaseProject().then(projectId => { if (projectId) { const fc = require(`../${projectId}/config/firebaseConfig.js`); const firebaseConfig = fc.firebaseConfig; // 执行初始化等后续操作 } });
方法2:firebase-admin自动关联当前项目(无需手动配置)
若本地已完成firebase login认证,且通过firebase use选中目标项目,firebase-admin可自动使用当前项目的默认凭证,无需手动传入配置文件:
const admin = require('firebase-admin'); // 自动关联当前选中项目的凭证,无需传入firebaseConfig admin.initializeApp(); const db = admin.firestore(); const colDistrict = db.collection('districts'); // 执行后续数据库操作
前置条件:
- 本地已安装Firebase CLI并完成
firebase login - 已通过
firebase use <project-id>选中目标项目 - 脚本运行环境有权限访问该项目(本地开发环境默认满足,服务器环境需配置
GOOGLE_APPLICATION_CREDENTIALS环境变量)
方法3:解析firebase projects:list的JSON输出
若不想依赖firebase-tools包,可在脚本中执行命令并解析JSON格式输出:
const { exec } = require('child_process'); function getCurrentFirebaseProject() { return new Promise((resolve, reject) => { exec('firebase projects:list --json', (error, stdout, stderr) => { if (error) { reject(error); return; } const projectsData = JSON.parse(stdout); const currentProject = projectsData.projects.find(project => project.current); resolve(currentProject ? currentProject.projectId : null); }); }); } // 使用示例 getCurrentFirebaseProject().then(projectId => { // 动态加载配置或初始化admin });
内容的提问来源于stack exchange,提问作者david weng
相关产品推荐
相关产品推荐

