【问题标题】:How to detect if environment is development or production with Firebase Cloud Functions?如何使用 Firebase Cloud Functions 检测环境是开发还是生产环境?
【发布时间】:2019-04-10 15:28:00
【问题描述】:

如何使用 Firebase Cloud Functions 检测我的服务器环境是开发还是生产环境?

我需要这样的东西:

if(process.env.NODE_ENV === 'development'){

   //DO STUFF SPECIFIC TO DEV ENVIRONMENT

}
else if(process.env.NODE_ENV === 'production'){

   //DO STUFF SPECIFIC TO PRODUCTION ENVIRONMENT

}

【问题讨论】:

    标签: node.js firebase google-cloud-functions


    【解决方案1】:

    process.env.FUNCTIONS_EMULATOR

    process.env 中,在 firebase 函数项目中,有一个名为 FUNCTIONS_EMULATOR 的布尔变量,它指示进程是在模拟器上还是在服务器上运行。

    这足以确定环境是开发还是生产。

    process.env.FUNCTIONS_EMULATOR === true
    

    Obs:在某些环境中,变量可能是字符串 'true' 而不是布尔值 true

    【讨论】:

    • 值得指出的问题是关于 server 环境,而不是本地模拟器。此答案仅适用于检测何时使用模拟器正在本地使用。这无助于确定正在使用哪个项目。模拟器无法知道正在使用的项目是否被指定用于开发或生产,或者其他什么。模拟器甚至真正关心您要使用哪个项目,因此仍然有可能犯错误以不合需要的方式影响项目。
    【解决方案2】:

    您可以信赖process.env

    截至 2020 年 7 月 28 日和 package.json

    "dependencies": {
        "firebase-admin": "^8.10.0",
        "firebase-functions": "^3.6.1"
    },
    

    如果您使用 firebase 启动您的应用

    firebase emulators:start

    那么process.env 将具有类似的属性

    "FUNCTIONS_EMULATOR": "true",
    "FIRESTORE_EMULATOR_HOST": "0.0.0.0:5002",
    "PUBSUB_EMULATOR_HOST": "localhost:8085"
    "FIREBASE_AUTH_EMULATOR_HOST": "0.0.0.0:9099"
    

    如果您使用 firebase 启动您的应用

    firebase emulators:start --only functions

    那么process.env 将具有类似的属性

    "FUNCTIONS_EMULATOR": "true",
    

    用例

    基于 process.env,您可以编写 firebase.function 来预填充您的 firestore 模拟器(不是生产 firestore)!

    代码示例

    export const prepopulateFirestoreEmulator = functions.https.onRequest(
      (request, response) => {
        if (process.env.FUNCTIONS_EMULATOR && process.env.FIRESTORE_EMULATOR_HOST) {
          // TODO: prepopulate firestore emulator from 'yourproject/src/sample_data.json
          response.send('Prepopulated firestore with sample_data.json!');
        } else {
          response.send(
            "Do not populate production firestore with sample_data.json"
          );
        }
      }
    );
    

    【讨论】:

      【解决方案3】:

      所有 Google Cloud 项目都只是项目,除了您指定其用途的方式。由于 Cloud Functions 无法知道 dev 和 prod 之间的区别,因此您需要检查项目的名称,因为这是环境中唯一发生变化的事情。使用automatically populated env vars 中的process.env.GCLOUD_PROJECT

      似乎这里的其他答案假设这个问题是在询问当地的发展,但事实并非如此。很容易检测代码是否在模拟器中运行,但这并不能帮助您确定底层项目是用于开发还是生产(或其他目的)。在模拟器中运行的某些代码仍然很有可能只对底层项目产生不良影响,这对于指定为生产的项目来说是不利的。强烈建议为不同的部署运行和隔离不同的项目,这样一个项目的更改不会影响另一个项目。

      【讨论】:

      • 嗯,项目名称与 localhost fyi 相同
      • @JimmyKane 如果您想区分在 Cloud Functions 上运行还是在本地模拟器中运行,那是另一个问题。 groups.google.com/forum/#!topic/firebase-talk/ZVGlmFsASW4
      • 最好的方法不是在 Firebase 中创建一个环境变量,例如 isProd,并在每个环境中将其设置为正确的布尔值吗?
      • @DougStevenson 据说here GCLOUD_PROJECT 现在已被弃用。知道要使用什么吗?
      猜你喜欢
      • 2018-10-20
      • 1970-01-01
      • 2020-11-23
      • 2014-07-25
      • 1970-01-01
      • 2016-03-22
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多