在Firebase函数中设置Dotenv

时间:2019-01-22 17:15:10

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

我正在尝试将我制作的微型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服务-仅托管功能,它不会引发任何错误,例如

  

OAuth2Strategy需要一个clientID选项

4 个答案:

答案 0 :(得分:2)

我所做的是在函数文件夹中创建一个 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,您只需在函数文件夹内运行下一个命令:firebase functions:config:set env="$(cat env.json)"< /p>

并且不要忘记在 .gitignore

中添加 env.json

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

希望能帮到你。

答案 1 :(得分:1)

Firebase CLI当前不允许您在部署时设置流程环境变量。将来可能会改变。它今天支持的(您链接到的)配置变量实际上不是过程环境变量-它们存储在实际上不是过程环境的其他位置。

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

如果您要使用Firebase工具,建议您以其他方式配置不涉及流程环境变量的功能。

答案 2 :(得分:1)

如果您想让函数使用process.env变量,则可以通过转到Google云控制台和云函数进行设置。您将可以在此处找到已部署的Firebase功能。您可以一个一个地选择每个功能,然后在其中设置环境变量。

答案 3 :(得分:0)

这是我的解决方法。

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

finctionConfig()被Firebase函数调用。

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中的环境配置。