【问题标题】:Setting up dotenv in firebase functions在 firebase 函数中设置 dotenv
【发布时间】:2019-06-16 05:19:51
【问题描述】:

我正在尝试将我制作的微型 node-express 应用程序移动到 firebase 函数中。

该文件有 dotenv 变量。早些时候我想如果我只是部署并将 dotenv 置于依赖项中,它会起作用,但事实并非如此......

所以,我去了firebase的环境配置文章to understand how I can set .env

通过做这样的事情来设置哪些状态

firebase functions:config:set someservice.key="THE API KEY" someservice.id="THE CLIENT ID"

但是我有这么多的环境配置,并且做一些看起来很麻烦的任务。

假设这是环境文件

# App port Address
PORT = 8080

# Google Secret 
GOOGLE_CALLBACK_URL =   http://localhost:8080/auth/google/callback
GOOGLE_CLIENT_ID = 4048108-bssbfjohpu69vl6jhpgs1ne0.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET = lTQHpjzY57oQpO

# Client Address 
CLIENT_ADDRESS = http://localhost:3000/


# Meetup Secret 
MEETUP_CALLBACK_URL = http://localhost:8080/auth/meetup/callback
MEETUP_CLIENT_ID = ef6i9f7m6k0jp33m9olgt
MEETUP_CLIENT_SECRET = sk3t5lnss2sdl1kgnt

#EventBrite Secret 
EVENTBRITE_CALLBACK_URL = http://localhost:8080/auth/eventbrite/callback
EVENTBRITE_CLIENT_ID = UU2FXKGYHJRNHLN
EVENTBRITE_CLIENT_SECRET = NA55QG52FAOF6GDMLKSJBKYOPIGQU4R46HHEU4 

我怎样才能最好地设置,以便当我执行 firebase firebase serve --only functions,hosting 它不会抛出任何错误,例如

OAuth2Strategy 需要一个 clientID 选项

【问题讨论】:

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


    【解决方案1】:

    我所做的是在函数文件夹中创建一个 env.json 文件:

    //env.json
    {
       "send_email_config": {
           "FOW_ADMIN_EMAIL": "admin.example@gmail.com",
           "FOW_ADMIN_EMAIL_PASSWORD": "adminPassExample",
           "FOW_ADMIN_RECEIVER_EMAIL": "adminReceiver.example@gmail.com"
       }
    }
    

    然后我创建了一个名为 env.js 的文件,在其中创建了一个函数来返回 functions.config() 的值,这是一种 env 模块

    //env.js
    // TO UPDATE functions.config().env RUN INSIDE functions FOLDER: 
    // firebase functions:config:set env="$(cat env.json)" 
    
    const functions = require('firebase-functions');
    
    const getEnvConfig = () => {
        /* 
           I return functions.config().env cause I set the env.json values into env 
           property running firebase functions:config:set env="$(cat env.json)"
        */
        return functions.config().env
    }
    
    exports.getEnvConfig = getEnvConfig;
    
    exports.PROCESS_ENV = getEnvConfig();
    

    然后我只需调用 PROCESS_ENV 来访问我在 env.json 文件中设置的值,例如:

    const { PROCESS_ENV } = require('./utils/env');
    
    exports.mailCredentials = {
        main: {
            email: PROCESS_ENV.send_email_config.FOW_ADMIN_EMAIL,
            password: PROCESS_ENV.send_email_config.FOW_ADMIN_EMAIL_PASSWORD
        },
        receiver: {
            email: PROCESS_ENV.send_email_config.FOW_ADMIN_RECEIVER_EMAIL
        }
    }
    

    重要!!!!

    为此,您必须使用 env.json 文件的值部署 functions.config().env

    要部署functions.config().env,你只需要在functions FOLDER中运行下一个命令:firebase functions:config:set env="$(cat env.json)"

    别忘了在你的 .gitignore

    中添加 env.json

    如果你的 react 项目中有 firebase 函数文件夹,只需将 */env.json 添加到你的 react .gitignore 文件中

    【解决方案2】:

    2019 年 6 月 4 日更新

    非常抱歉。这个解决方案是错误的。

    我找到了正确的方法。

    https://stackoverflow.com/a/45064266/1872674

    您应该将.runtimeconfig.json 放入函数目录。您的 dotenv 变量以 json 格式移动到 .runtimeconfig.json


    这是我的解决方案。

    const functionConfig = () => {
        if (process.env.RUN_LOCALLY) {
            const fs = require('fs');
            return JSON.parse(fs.readFileSync('.env.json'));
        } else {
          return functions.config();
        }
    };
    

    您的 Firebase 函数调用了 functionConfig()

    exports.helloWorld = functions.https.onRequest((request, response) => {
        response.send("someservice id is: " + functionConfig().someservice.id);
    });
    

    .env.json 就像:

    {
      "someservice": {
        "key":"THE API KEY",
        "id":"THE CLIENT ID"
      }
    }
    

    最后,使用RUN_LOCALLY 变量运行命令。

    RUN_LOCALLY=1 firebase serve
    

    当我们将部署功能时, 不要忘记使用 .env.json 更新 Firebase 中的环境配置。

    【讨论】:

      【解决方案3】:

      如果你想让你的函数使用 process.env 变量,你可以通过谷歌云控制台和云函数来设置它们。您将能够在那里找到已部署的 Firebase 功能。你可以一一选择每个函数,然后在那里设置环境变量。

      【讨论】:

        【解决方案4】:

        Firebase CLI 目前不允许您在部署时设置进程环境变量。这在未来可能会改变。它今天支持的配置变量(您链接到的)实际上不是进程环境变量 - 它们存储在其他地方,实际上不是进程环境。

        如果您绝对需要能够设置进程环境变量,则必须使用 gcloud 部署您的函数,这意味着您也将无法使用 firebase-functions 模块来定义您的函数。从 Google Cloud Functions 文档开始,从云的角度了解部署。

        如果您想使用 Firebase 工具,我建议您找到一种不涉及进程环境变量的不同方法来配置您的函数。

        【讨论】:

          猜你喜欢
          • 2020-08-09
          • 2015-01-14
          • 1970-01-01
          • 2020-08-05
          • 1970-01-01
          • 2021-04-26
          • 1970-01-01
          • 2020-09-28
          • 2018-11-15
          相关资源
          最近更新 更多