我有一些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_ID
和PROD_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 PROD
或npm run deploy
。
在编辑"功能配置"(functions.config()
值(时,请确保使用适当的键在TEST_PROJECT_ID
和PROD_PROJECT_ID
上设置它们。
有许多环境变量可用于执行云功能,但只有谷歌云和Firebase包含的环境变量才有保证值:
键 | 说明 | |
---|---|---|
FUNCTION_TARGET | 保留:要执行的函数 | |
FUNCTION_SIGNATURE_TYPE | 保留:函数的类型:http 用于HTTP函数,event 用于事件驱动函数 | |
K_SERVICE | 保留:函数资源的名称 | 替换旧代码中的FUNCTION_NAME |
K_REVISION | 保留:函数的版本标识符 | |
PORT | 保留:通过其调用函数的端口 | |
FIREBASE_CONFIG | 保留:Firebase项目配置 | JSON编码字符串 |