我有一些在本地测试的 firebase 函数,但我真的不想依赖于记住切换标志或显式设置值。我可以在 firebase 中检查一个值来判断它是在开发中还是在生产中?我也在使用 NextJS,所以我也不介意在下一个方面改变它。在 Firebase 生态系统中任何最有意义的方式。谢谢!
在我的函数中调用客户端(在 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 - 在开发中调用该函数时,我希望该函数使用 Sandbox 凭据。在产品中,我想使用实时沙箱凭据。
最佳答案
如果目的是检测当前运行的 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
使用适当的键。
有许多环境变量可用于执行 Cloud Functions,但只有 Google Cloud 包含的那些和 Firebase有保证值:
FUNCTION_TARGET
FUNCTION_SIGNATURE_TYPE
http
用于 HTTP 函数,以及 event
用于事件驱动函数。K_SERVICE
FUNCTION_NAME
在遗留代码中K_REVISION
PORT
FIREBASE_CONFIG
关于node.js - 如果我正在开发或生产中,如何告诉 firebase? (对于 firebase 函数沙箱/实时开关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68310042/