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 - 当在开发中调用该函数时,我希望该函数使用沙箱凭据。在产品中,我想使用实时沙箱凭据。
如果想要检测当前运行的云函数是否被模拟,可以检查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 PROD或npm run deploy。
确保在编辑功能配置(值)时,使用适当的键在和functions.config()上设置它们。TEST_PROJECT_IDPROD_PROJECT_ID
有许多环境变量可用于执行 Cloud Functions,但只有Google Cloud和Firebase包含的环境变量具有保证值:
| 钥匙 | 描述 | 笔记 |
|---|---|---|
FUNCTION_TARGET |
保留:要执行的函数。 | |
FUNCTION_SIGNATURE_TYPE |
保留:函数的类型:http用于 HTTP 函数和event事件驱动函数。 |
|
K_SERVICE |
保留:功能资源的名称。 | 替换FUNCTION_NAME遗留代码 |
K_REVISION |
保留:函数的版本标识符。 | |
PORT |
保留:调用该函数所使用的端口。 | |
FIREBASE_CONFIG |
保留:Firebase 项目配置 | JSON 编码的字符串 |
| 归档时间: |
|
| 查看次数: |
2541 次 |
| 最近记录: |