'Setting up dotenv in firebase functions

I am trying to move the tiny node-express app I made into firebase functions.

The file have dotenv variables. Earlier I thought If I just deploy and put dotenv in dependency, It will work but that didn't happen so..

So, I went to environment configuration article of firebase to understand how I can set .env

Which states to set things by doing something like this

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

But I have so many environment configuration and doing that some what seems to be cumbersome task.

So let's say this is environment file

# 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 

How Can I best set up so that when I do firebase firebase serve --only functions,hosting it doesn't throw any errors such as

OAuth2Strategy requires a clientID option



Solution 1:[1]

As of Feb 16, 2022 Firebase now supports .env, .env.prod, .env.dev files natively!

https://firebase.google.com/docs/functions/config-env

Set your variables in the corresponding environment, and then run firebase use dev or firebase use prod before you deploy.

Your variables can be accessed via process.env.VARIABLE_NAME

Solution 2:[2]

UPDATED 2019-06-04

I'm very sorry. This solution is wrong.

I found the correct way.

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

You should put a .runtimeconfig.json into the functions directory. Your dotenv variables move to .runtimeconfig.json with json format.


This is my solution.

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

The functionConfig() was called by your Firebase Function.

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

.env.json is like:

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

Finally, run the command with the RUN_LOCALLY variable.

RUN_LOCALLY=1 firebase serve

When we will deploy functions, don't forget to update the environment configuration in Firebase using the .env.json.

Solution 3:[3]

If you want to have your functions use the process.env variables, you you can set them by going to google cloud console and cloud functions. You will be able to find the deployed firebase functions there. You can select each function one by one and then set the environment variables there.

Solution 4:[4]

what I did was create a env.json file into functions FOLDER:

//env.json
{
   "send_email_config": {
       "FOW_ADMIN_EMAIL": "[email protected]",
       "FOW_ADMIN_EMAIL_PASSWORD": "adminPassExample",
       "FOW_ADMIN_RECEIVER_EMAIL": "[email protected]"
   }
}

then I created a file called env.js where I created a function to return the value of functions.config() which is kind of env module

//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();

then I just call PROCESS_ENV to access the values that I set on env.json file for example:

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
    }
}

IMPORTANT!!!!

for this to work you have to deploy functions.config().env with the values of the env.json file

to deploy functions.config().env you just have to run INSIDE the functions FOLDER the next command: firebase functions:config:set env="$(cat env.json)"

and also don't forget to add env.json in your .gitignore

if you have firebase functions FOLDER inside your react project just add */env.json into your react .gitignore file

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 d-_-b
Solution 2 benomatis
Solution 3 Anant Anand Gupta
Solution 4 TylerH