react evironment variables .env return undefined
Asked Answered
C

23

189

I am building a react app and i need to fetch data from my api, now i want to store the api url as an environment variable. I have my .env file, i have dotenv installed, here is my code process.env.API_URL is returning undefined.

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import Home from '../src/components/Home'
import dotenv from  'dotenv'
import path from 'path'


class App extends Component {
  render() {
    console.log(process.env.API_URL)
    return (
      <div>
        <Home/>
      </div>
    );
  }
}

export default App;
Correia answered 10/11, 2018 at 8:31 Comment(2)
Are you using Webpack build or create-react-app? Usually, environment variables are loaded as part of build process, usually a Node process. The code you are trying to run above runs in the browser. And .env is not packaged!Inhospitality
To add another reason: check you don't have a function / variable called process in your react codeFarrish
D
534

Three things to note here

  1. the variable must be prefixed with REACT_APP_

    eg: REACT_APP_WEBSITE_NAME=hello

  2. You need to restart the server to reflect the changes.

  3. Make sure you have the .env file in your root folder(same place where you have your package.json) and NOT in your src folder.

After that you can access the variable like this process.env.REACT_APP_SOME_VARIABLE

Additional tips

  1. No need to wrap your variable value in single or double quotes.
  2. Do not put semicolon ; or comma , at the end of each line.

Read more here(my own post) and the official docs

Dragster answered 10/11, 2018 at 9:11 Comment(9)
Needing to prefix with "REACT_APP_" fixed it for me. Thx!Doggerel
Thanks @kianvj I actually put this off for some days but now it works. It would be crazy to build an app without the .env file workingNepotism
in CRA the REACT_APP_ prefix is a must not a should. See the second link provided by op: "Apart from a few built-in variables (NODE_ENV and PUBLIC_URL), variable names must start with REACT_APP_ to work."Extrauterine
Also make sure your terminal from where you are launching is in the source root directory.Planksheer
I found out that the .env file was located inside /src which caused every value to be undefined. After moving it to root it worked like expected.Lemuellemuela
Another very important point is that REACT_APP_IS_COOL=false in process.env.REACT_APP_IS_COOL will be of string type and there for true (Boolean("false") === true)Michaelmichaela
wow wrong folder root....so simple. not my first cra either -_-Gig
not putting semicolon ; and comma , solved my problem. Thank you.Badtempered
Crazy what a simple restart does and makes complete sense given the nature of env. Much appreciated for keeping us young. +1Rasberry
B
33

You will probably need to call dotenv.config() as suggested by the document

If you are using create-react-app, you don't need dotenv package. You will need to add REACT_APP_ prefix to the variable name in .env file. See the document here

Burwell answered 10/11, 2018 at 8:48 Comment(0)
K
28

when calling a .env variable from a JS file you need to call it by process.env. prefix before you write the .env variable

thus it would look like process.env.REACT_APP_NOT_SECRET_CODE

and do not forget to start your variable name by REACT_APP_ prefix as mentioned in previous answers, otherwise react will ignore it for security reasons.

Kittrell answered 22/8, 2021 at 18:57 Comment(1)
o this such a small thing, easy to miss 😄 - thank uVelate
K
23
  • Add prefix REACT_APP_ on React environment variables.

    apiKey: process.env.REACT_APP_API_KEY
    
  • Make sure .env file is in the root directory.

    src/
    .env
    .gitignore
    package.json
    package-lock.json
    
  • Restart the development server after making changes in .env file.

  • Copy only the value inside the quotation marks and don't forget to remove trailing commas(It haunted me for several hours). These examples will give you an error.

    REACT_APP_API_KEY=Ach2o1invVocSn25FcQhash209,
    REACT_APP_API_KEY="Ach2o1invVocSn25FcQhash209",
    REACT_APP_API_KEY="Ach2o1invVocSn25FcQhash209"
    
Krakau answered 7/4, 2020 at 7:47 Comment(0)
S
11
  • Make sure you used the prefix REACT_APP on every variable

  • Confirm that the variable names on the .env file match the ones on
    your js file.For example,REACT_APP_KEY in .env versus process.env.REACT_APP_KY

  • If the development server was running, stop it then rerun using npm start it. I really struggled with this (variable is an undefined error).
  • Every time you update the .env file, you need to stop the server and rerun it, as the environment variables are only updated during build (variable is an undefined error).
  • Remove quotations from the values of the variables.
// Wrong: 
REACT_APP_KEY=”AHEHEHR”

// Right:
REACT_APP_KEY=AHEHEHR
Simonnesimonpure answered 5/4, 2020 at 10:22 Comment(0)
I
7
  1. restart the vscode (close the project, close the editor)
  2. open it again
  3. launch the project

In my case it help a lot. Also remember to start the name of your key with REACT_APP_YOUR_NAME_KEY

Inion answered 7/4, 2021 at 13:47 Comment(1)
thank you! restarting vscode worked for me. restarting just the backend and the front end server wasnt enough for me.Posting
M
4

If the above solutions don't work for you then please check where is your ".env" file place. Like in my case everything I had done correctly but the mistake is I had placed the ".env" outside my project directory due to which I'm getting error.

Note: Your ".env" file should be in the same directory in which your "package.json" is.

Massage answered 28/10, 2020 at 7:12 Comment(0)
C
2

Hey thanks guy what i did and worked was create a config.js file

 const dev={
    API_URL:"http://localhost:300"
}

const prod={
    API_URL:"llll"
}
const config=process.env.NODE_ENV=='development'?dev:prod
export default  config

Then i import wherever maybe in a component and get my data.

Correia answered 12/11, 2018 at 20:36 Comment(0)
B
2

Another possible trap in which I fell was to define the variables not under the create-react-app folder but one above(where the Node server/backend .env is located). Make sure you don't do that because you will waste precious time, as I did today.

Baryta answered 16/8, 2019 at 14:19 Comment(1)
Hi, I'm using Heroku to host my MERN stack and I believe Heroku keeps all the env vars in the root(where Node server/backend is), but now React doesn't get access to the env vars anymore. Do you know how I can give my /client folder(React) access to the env vars in Heroku?Euchre
L
2

Solution:
1.Remove double quotation.("...").
2.Prefix Must be REACT_APP on every variable.

Right way:

REACT_APP_API_URL=http://localhost:8002

I hope its work.

Lehmann answered 4/8, 2021 at 12:44 Comment(0)
J
2

In my case I started with naming the file process.env. As it happen and as the doc clearly states, the file should simply be named .env

Jocose answered 15/4, 2022 at 11:55 Comment(0)
P
1

try by clearing the cache also.

npx react-native start --reset-cache
Priam answered 16/1, 2021 at 1:47 Comment(0)
C
0

FIX:

in babel.config.js, if you're using the optional configuration:

    {
  "plugins": [
    ["module:react-native-dotenv", {
      "moduleName": "@env",
      "path": ".env",
      "blacklist": null,
      "whitelist": null,
      "safe": false,
      "allowUndefined": true
    }]
  ]
}

you should then import:

import {API_URL, API_TOKEN} from "@env"

instead of:

import {API_URL, API_TOKEN} from "react-native-dotenv"

the NPM Package description itself has this inconsistency

Callista answered 10/5, 2021 at 15:18 Comment(0)
C
0

DO NOT STORE OR USE API KEYS IN FRONTEND CODE SINCE IT IS EASILY READABLE THROUGH DEV TOOLS

Saving API keys in .env and using them in your React app will still be unsecured since the API key can be read from DevTools.

Use some simple backend code that will act as a proxy to your service.

Send required data through a request and then the backend should use that data including the API key stored on the backend, and then make a request to some particular service that needs that API key.

Catacaustic answered 11/5, 2021 at 0:36 Comment(0)
F
0

No need to prefix it with REACT_APP_, just identify your environment -

  • if you are on development environment (npm start), you should be adding an environment variable in .env.development like - API_URL=http://example.com
  • if you are on production environment, updating .env should work

Then use the same in your JS file as process.env.API_URL

Note: I've tested this on React JS v16.8

Fascicule answered 3/8, 2021 at 9:38 Comment(0)
T
0

If you are using dev server on localhost know this that .env doesn't work here, you need to deploy website on "normal" server, it is a safety reason to not allow browser to see .env in staging

Trephine answered 4/11, 2021 at 11:49 Comment(0)
P
0

I investigated a couple of options on how to set environment-specific variables and ended up with this:

You can directly use the dotenv-webpack(npm install dotenv-webpack --save) available in webpack to have access to any environment variable.

You just have to declare the plugin in your webpack.config.js file:

const path = require('path')
const Dotenv = require('dotenv-webpack')

module.exports = {
  /*...*/
  plugins: [
    new Dotenv()
  ]
}

Just create the .env file in your root directory and set the variables there,

REACT_APP_API_URL=https://localhost:8080/api
REACT_APP_LOG_PATH=/usr/share/

Then you call it in your js file in the following way:

process.env.REACT_APP_API_URL
process.env.REACT_APP_LOG_PATH
Pelson answered 12/6, 2022 at 14:55 Comment(0)
P
0

I just found that I used different names for the variables :)

Phlogistic answered 27/1, 2023 at 23:16 Comment(0)
O
0

When I was trying to access the .env variable it was throwing error: "process is not defined"

I have read all the StackOverflow articles and the official documentation as well but still haven't found the solution.

So, my solution is: mistakenly process is defined as a variable in my code. That is why was getting errors. You have to change the process variable name to another name. And it will work fine.

Hope it helps you. Thanks.

Onfre answered 17/1, 2024 at 13:28 Comment(0)
P
0

When you have two .env folders with same name, it will not work. For both frontend and backend, either you should use .env.development or .env.local in the frontend and .env for the backend. This setup works for me.

Platinic answered 22/3, 2024 at 12:0 Comment(0)
G
0

I also got the same error but in my case I wasn't getting the env variable which I recently added. This Error was fixed by stopping and restarting the react app.

Greer answered 30/3, 2024 at 12:48 Comment(0)
K
0

For those who have same issue in react native-expo app make sure that your variable starts with EXPO_PUBLIC_

ex for .env'

EXPO_PUBLIC_VARIABLE=12324

Kuroshio answered 27/4, 2024 at 7:36 Comment(0)
H
-2

Also make sure that when you enter process.env.REACT_APP_YOURVARIABLE, your IDE don't add at the top of your file:

import process from "process";

This was my problem, I received undefined until I removed the accidentally added import

Hoecake answered 26/5, 2022 at 15:28 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.