如何使用 Firebase Cloud Functions 检测环境是开发环境还是生产环境?

Bre*_*dan 14 node.js firebase google-cloud-functions

如何使用 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

}
Run Code Online (Sandbox Code Playgroud)

Gui*_*ira 30

process.env.FUNCTIONS_EMULATOR

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

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

process.env.FUNCTIONS_EMULATOR === true
Run Code Online (Sandbox Code Playgroud)

Obs:在某些环境中,变量可能是 String 'true'而不是 Boolean true

  • 值得指出的是,该问题询问的是**服务器**环境,而不是本地模拟器。该答案仅适用于检测本地使用模拟器的情况。它无助于确定正在使用哪个项目。模拟器无法知道正在使用的项目是指定用于开发还是生产,还是其他用途。模拟器甚至真正关心您要使用哪个项目,因此仍然可能会犯一个以不良方式影响项目的错误。 (5认同)
  • @DougStevenson如果您针对不同的环境有不同的项目,那么您可以通过检查“process.env['GCLOUD_PROJECT']”轻松确定它是否是临时生产环境,这将返回项目的名称。使用名称可以确定函数在哪个环境中运行。 (2认同)

sul*_*rza 22

你可以依靠 process.env

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

"dependencies": {
    "firebase-admin": "^8.10.0",
    "firebase-functions": "^3.6.1"
},
Run Code Online (Sandbox Code Playgroud)

如果您使用 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"
Run Code Online (Sandbox Code Playgroud)

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

firebase emulators:start --only functions

然后process.env将具有类似的属性

"FUNCTIONS_EMULATOR": "true",
Run Code Online (Sandbox Code Playgroud)

用例

基于 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"
      );
    }
  }
);
Run Code Online (Sandbox Code Playgroud)


Dou*_*son 5

所有 Google Cloud 项目都只是项目,除非您指定其用途不同。由于 Cloud Functions 无法了解 dev 和 prod 之间的区别,因此您需要检查项目的名称,因为这是环境中唯一发生变化的内容。使用自动填充的环境process.env.GCLOUD_PROJECT变量。

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

  • 嗯,项目名称与 localhost 相同,仅供参考 (2认同)