Search code examples
node.jsenvironment-variableslocaldotenv

Why are my custom process.env not working within dotenv?


Learning that it is a bad practice to include API secret keys I've done some research and trying to learn how to create custom process.env.

After reading:

I'm trying to set an env file locally based on process.env.NODE_ENV. The application would be hosted on Heroku and in my .gitignore I have dev.env but when I try to use dotenv locally I'm getting an undefined. I have set the environment locally with export NODE_ENV=development in my terminal. When I run the command npm start or nodemon both return undefined but in env.js I get Testing for: development, example:

nodemon

[nodemon] 1.19.1
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: *.*
[nodemon] starting `node app.js`
Testing for: development
undefined

Here is what I have:

app.js:

const keys = require('./config/env')
return console.log(process.env.PORT)

config/env.js:

const env = process.env.NODE_ENV
console.log(`Testing for: ${env}`)
try {
  switch(env) {
    case 'undefined':
      Error('Environment undefined, if local in terminal: export NODE_ENV=development')
      break
    case 'development':
      require('dotenv').config({
        path: './dev.env'
      })
      break
    case 'production':
      require('dotenv').config({
        path: './prod.env'
      })
      break
    default:
      Error('Unrecognized Environment')
  }  
} catch (err) {
  Error('Error trying to run file')
}

config/dev.env:

## Port number to run Application
PORT=4321

but in app.js when I test with return console.log(process.env.PORT) or return console.log(keys.PORT) they both log undefined, why? I seem to be doing something wrong in env.js when using dotenv.

To clarify I'm not even pushing to Heroku yet and prod.env will be validation. If there is a better approach please educate me.


Solution

  • I've figured where I was going wrong after re-reading the documentation regarding path, example:

    require('dotenv').config({ path: '/full/custom/path/to/your/env/vars' })
    

    After changing:

    case 'development':
      require('dotenv').config({
        path: './dev.env'
      })
      break
    

    to:

    case 'development':
      require('dotenv').config({
        path: `${__dirname}/dev.env`
      })
      break
    

    it works. So my error was a scope issue. No need to set const keys so just using require('./config/env') I can access any custom processes, example:

    process.env.CUSTOM
    

    or in this case it would be:

    process.env.PORT
    

    from app.js