node.js - 如果我正在开发或生产中,如何告诉 firebase? (对于 firebase 函数沙箱/实时开关)

标签 node.js firebase google-cloud-functions environment-variables next.js

我有一些在本地测试的 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_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_ID 上都设置了它们和 PROD_PROJECT_ID使用适当的键。

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

<表类="s-表"> <头> 键 描述 注意 <正文> FUNCTION_TARGET 预留:待执行的函数 FUNCTION_SIGNATURE_TYPE 保留:函数类型:http用于 HTTP 函数,以及 event用于事件驱动函数。 K_SERVICE 预留:函数资源名称 替换 FUNCTION_NAME在遗留代码中 K_REVISION 保留:函数的版本标识。 PORT 保留:调用函数的端口。 FIREBASE_CONFIG 转载:Firebase项目配置 JSON编码字符串

关于node.js - 如果我正在开发或生产中,如何告诉 firebase? (对于 firebase 函数沙箱/实时开关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68310042/

相关文章:

json - 如何更改 JSON 中字段的顺序

node.js - dynamodb Node aws-sdk 简单的 getItem() 调用

java - 为什么我不能正确检索数据?

http - Google Cloud Function 请求被中止,因为没有可用的实例

javascript - Passport-facebook 策略回调函数永远不会被调用

node.js - 动态更改elasticsearch查询定义

android - 更新到 Firebase Android 版本 15.0.0,将用户注销

android - 如何从共享首选项 (Android) 中禁用 bool 值的 Firebase 消息传递

使用谷歌云函数的 Python Flask 应用程序

json - 使用 Firebase Cloud Functions 部署/测试函数