我如何告诉 firebase 我是处于开发阶段还是生产阶段?(对于 firebase 功能沙箱/实时切换)

Joe*_*ger 2 environment-variables node.js firebase google-cloud-functions next.js

我有一些在本地测试的 firebase 函数,但我真的不想依赖记住切换标志或显式设置值。我可以在 firebase 中检查一个值来判断它是在 dev 还是 prod 中吗?我也在使用 NextJS,所以我也不介意在下边更改它。无论哪种方式在 firebase 生态系统中最有意义。谢谢!

在我的函数内调用客户端(在 firebase 上):

const env = new checkoutNodeSDK.core.SandboxEnvironment(clientId, clientSecret)
Run Code Online (Sandbox Code Playgroud)

我的 firebase.js 文件:

import firebase from 'firebase/app'
import 'firebase/auth'
import 'firebase/firestore'
import 'firebase/functions'
const dev = true


export const app = !firebase.apps.length ? firebase.initializeApp({
  apiKey: "REDACTED",
  authDomain: "edit-elements.firebaseapp.com",
  databaseURL: "https://edit-elements-default-rtdb.firebaseio.com",
  projectId: "edit-elements",
  storageBucket: "edit-elements.appspot.com",
  messagingSenderId: "340652433701",
  appId: "1:340652433701:web:a26472592c1538bbac7acc",
  measurementId: "G-945XC7348K"
}) : firebase.app()

const auth = app.auth()
const db = app.firestore()
const functions = app.functions()
if (process.env.NODE_ENV === 'development') {
  functions.useEmulator('localhost', 5001)
  db.useEmulator('localhost', 8080)
}
export { auth, db, functions }
Run Code Online (Sandbox Code Playgroud)

我想设置类似:

const env = flagDev ? new checkoutNodeSDK.core.SandboxEnvironment(clientId, clientSecret) : new checkoutNodeSDK.core.LiveEnvironment(clientId, clientSecret)
Run Code Online (Sandbox Code Playgroud)

TL;DR - 当在开发中调用该函数时,我希望该函数使用沙箱凭据。在产品中,我想使用实时沙箱凭据。

sam*_*man 7

如果想要检测当前运行的云函数是否被模拟,可以检查FUNCTIONS_EMULATOR环境变量。

const isEmulated = process.env.FUNCTIONS_EMULATOR === "true";
Run Code Online (Sandbox Code Playgroud)

然而,正如 Doug 所说,你不应该盲目相信这个值。虽然它现在有一个值并且可以工作,但这是 Firebase 模拟器套件内部使用的未记录的环境变量。

最好的做法是为PROJECT_ID您的本地环境使用完全不同的环境,并且仅在一切正常时部署到您的生产项目。

PROJECT_ID使用活动的云功能,请使用:

const PROJECT_ID = JSON.parse(process.env.FIREBASE_CONFIG).projectId;
Run Code Online (Sandbox Code Playgroud)

然后假设您有一个TEST_PROJECT_IDand PROD_PROJECT_ID,您现在可以使用以下命令检查您是否在生产中:

const isProduction = PROJECT_ID === PROD_PROJECT_ID;
Run Code Online (Sandbox Code Playgroud)

在您的系统上进行测试时,您应该使用TEST_PROJECT_ID

firebase use TEST_PROJECT_ID
Run Code Online (Sandbox Code Playgroud)

一旦您批准了更改,您就可以部署到PROD_PROJECT_ID

firebase deploy --project PROD_PROJECT_ID
Run Code Online (Sandbox Code Playgroud)

您还可以将这些项目 ID 添加到.firebaserc

{
  "projects": {
    "default": "TEST_PROJECT_ID",
    "TEST": "TEST_PROJECT_ID",
    "PROD": "PROD_PROJECT_ID"
  }
}
Run Code Online (Sandbox Code Playgroud)

在主项目目录中,创建一个package.json文件:

{
  "name": "my-firebase-project",
  "version": "1.0.0",
  "private": true,
  "description": "",
  "main": "",
  "scripts": {
    "deploy": "firebase deploy -P PROD"
  },
  "keywords": [],
  "author": "You",
  "license": "NONE"
}
Run Code Online (Sandbox Code Playgroud)

将相同的"deploy"脚本添加到您的functions/package.json

"scripts": {
  "deploy": "firebase deploy -P PROD"
}
Run Code Online (Sandbox Code Playgroud)

现在,当您想要部署到生产环境时,您可以使用:firebase deploy -P PRODnpm run deploy

确保在编辑功能配置(值)时,使用适当的键在和functions.config()上设置它们。TEST_PROJECT_IDPROD_PROJECT_ID

有许多环境变量可用于执行 Cloud Functions,但只有Google CloudFirebase包含的环境变量具有保证值:

钥匙 描述 笔记
FUNCTION_TARGET 保留:要执行的函数。
FUNCTION_SIGNATURE_TYPE 保留:函数的类型:http用于 HTTP 函数和event事件驱动函数。
K_SERVICE 保留:功能资源的名称。 替换FUNCTION_NAME遗留代码
K_REVISION 保留:函数的版本标识符。
PORT 保留:调用该函数所使用的端口。
FIREBASE_CONFIG 保留:Firebase 项目配置 JSON 编码的字符串