如何判断 Firebase 是处于开发阶段还是生产阶段?(适用于火力基本功能沙盒/实时切换)



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

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

const env = new checkoutNodeSDK.core.SandboxEnvironment(clientId, clientSecret)

我的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 }

我想设置这样的东西:

const env = flagDev ? new checkoutNodeSDK.core.SandboxEnvironment(clientId, clientSecret) : new checkoutNodeSDK.core.LiveEnvironment(clientId, clientSecret)

TL;DR-当在dev中调用该函数时,我希望该函数使用Sandbox凭据。在prod中,我想使用实时沙箱凭据。

如果目的是检测当前运行的Cloud Function是否正在被模拟,则可以检查FUNCTIONS_EMULATOR环境变量。

const isEmulated = process.env.FUNCTIONS_EMULATOR === "true";

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

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

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

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

然后假设您有一个TEST_PROJECT_IDPROD_PROJECT_ID,您现在可以使用检查您是否在生产中

const isProduction = PROJECT_ID === PROD_PROJECT_ID;

在系统上进行测试时,应使用TEST_PROJECT_ID:

firebase use TEST_PROJECT_ID

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

firebase deploy --project PROD_PROJECT_ID

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

{
"projects": {
"default": "TEST_PROJECT_ID",
"TEST": "TEST_PROJECT_ID",
"PROD": "PROD_PROJECT_ID"
}
}

在您的主项目目录中,创建一个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"
}

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

"scripts": {
"deploy": "firebase deploy -P PROD"
}

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

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

有许多环境变量可用于执行云功能,但只有谷歌云和Firebase包含的环境变量才有保证值:

说明
FUNCTION_TARGET保留:要执行的函数
FUNCTION_SIGNATURE_TYPE保留:函数的类型:http用于HTTP函数,event用于事件驱动函数
K_SERVICE保留:函数资源的名称替换旧代码中的FUNCTION_NAME
K_REVISION保留:函数的版本标识符
PORT保留:通过其调用函数的端口
FIREBASE_CONFIG保留:Firebase项目配置JSON编码字符串

最新更新