如何从 Cloud Function 获取 Firebase 项目名称或 ID

Posted

技术标签:

【中文标题】如何从 Cloud Function 获取 Firebase 项目名称或 ID【英文标题】:How to get Firebase Project Name or ID from Cloud Function 【发布时间】:2017-10-20 01:19:57 【问题描述】:

我正在使用 Cloud Functions 并希望从我的一个 javascript 服务器文件中获取项目名称。我知道该值存储在 .firebaserc 中,但我认为该文件在服务器上不可用,对吗?我想做这样的事情:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.getProjectName();  // or getProjectID()

functions.getProjectName(); 

【问题讨论】:

在firebase-samples repo 上的快速搜索似乎暗示了process.env.GCLOUD_PROJECT 您还可以将自己的配置值填充到您的 Cloud Functions 环境中。 firebase.google.com/docs/functions/config-env 【参考方案1】:

谢谢@Frank。答案是: process.env.GCLOUD_PROJECT. 我不确定变量process 来自哪里,但这确实可以获取项目名称。

【讨论】:

进程是节点中的全局对象。见:nodejs.org/api/globals.html#globals_process 似乎不适用于 GCF Node 10 运行时。转储时看不到process.env 现在使用process.env.GCP_PROJECT 可能会更好,因为GCLOUD_PROJECT 已在此处标记为已弃用:cloud.google.com/functions/docs/… GCLOUD_PROJECT 和 GCP_PROJECT 在 Node 10 运行时都不可用。 GCLOUD_PROJECT 现在似乎可以工作了,它也已在 node10 运行时中修复 github.com/firebase/firebase-functions/issues/437【参考方案2】:

Firebase 管理员 SDK 可以为您访问该信息。

const admin = require('firebase-admin');
const projectId = admin.instanceId().app.options.projectId

【讨论】:

这可能不存在,具体取决于 admin 的初始化方式 admin.instanceId() 已弃用 firebase.google.com/docs/reference/admin/node/…【参考方案3】:

这对我有用。 (节点 10)

const FIREBASE_CONFIG = process.env.FIREBASE_CONFIG && JSON.parse(process.env.FIREBASE_CONFIG);
const projectId = FIREBASE_CONFIG.projectId;

【讨论】:

【参考方案4】:

试试这个:

const projectId = admin.instanceId().app['options_'].credential.projectId

【讨论】:

【参考方案5】:

对于在较新版本的 Node 上运行的云功能:

import firestore from "@google-cloud/firestore";

const client = new firestore.v1.FirestoreAdminClient();
const projectId = await client.getProjectId();

【讨论】:

【参考方案6】:

使用 admin SDK 获取项目 ID 的方式是

admin.appCheck().app.options.credential.projectId

这也适用于设置环境变量 GOOGLE_APPLICATION_CREDENTIALS 的 Docker 等无头设置。

【讨论】:

【参考方案7】:

目前我正在使用app.INTERNAL.credential_.projectId。 这显然不是保存,但到目前为止还没有凝聚力的方法来获得它(AFAIK)

【讨论】:

【参考方案8】:

这是上面给出的答案的组合:

function getProjectID() 
  return firebaseInstance.options.projectId ||
    (firebaseInstance.options.credential && firebaseInstance.options.credential.projectId) || '';

或者在 TypeScript 中:

function getProjectID(): string 
  return firebaseInstance.options.projectId ||
    (firebaseInstance.options.credential && (firebaseInstance.options.credential as unknown as  projectId: string ).projectId) || '';

【讨论】:

【参考方案9】:

来自the Firebase docs:

process.env.FIREBASE_CONFIG:提供以下 Firebase 项目配置信息:


  databaseURL: 'https://databaseName.firebaseio.com',
  storageBucket: 'projectId.appspot.com',
  projectId: 'projectId'

请注意,由于它是 JSON 字符串,因此您需要像这样解析它:

const projectId = JSON.parse(process.env.FIREBASE_CONFIG).projectId;

或者,您可以使用 Cloud Functions 中 firebase-functions 包中的 the undocumented firebaseConfig() method,如下所示:

import  firebaseConfig  from "firebase-functions";
const projectId = firebaseConfig().projectId;

此外,Google Cloud Platform(Firebase 在其上运行)将根据您使用的运行时自动填充 environment variables documented here。

【讨论】:

【参考方案10】:

您可以使用functions.config().firebase.projectId

PS 初始化应用最简单的方法是admin.initializeApp(functions.config().firebase);

【讨论】:

functions.config().firebase.projectId 没有为我定义。我只在 functions.config().firebase 对象上看到字段:databaseURL、storageBucket、apiKey、authDomain 和 credential。 functions.config() 返回用户设置的环境配置,这就是你被否决的原因。

以上是关于如何从 Cloud Function 获取 Firebase 项目名称或 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cloud Function with Flutter 从新图像中获取 URL?

从请求中获取用户信息到 Firebase 中的 Cloud Function

Cloud Function 构建错误 - 无法从配置文件获取映像的操作系统

如何在 Google Cloud Function 上的 Spring Cloud 函数中获取 Pub/Sub 事件的元数据

如何在 Google Cloud Function 中获取原始请求正文?

如何从 afterSave 函数中获取解析用户