Search code examples
node.jsnpmenvironment-variablesdotenv

How to run NPM run script passing env variable (calling the appropriate env.{env} file)?


I'm on NodeJs app, I've create two files:

.env
.env.production

on the first I have dev settings, on the later prod settings.

Now, running on local, I'd like to do this:

npm run jobs_orders

Configured this way within package.json:

"scripts": {
    "job_orders": "supervisor --mode production jobs/job_orders.js",
},

But later on app, when doing:

import 'dotenv/config';
...
process.env.DATABASE_CONNECTION_STRING

it always read the DATABASE_CONNECTION_STRING settings on .env file, not the one on env.production.

Where am I wrong? And how do I fix it?


Solution

  • Because dotenv will load the environment variables located in path.resolve(process.cwd(), '.env') by default.

    You can set the process.env.NODE_ENV variable to determine which .env to load for different environments.

    index.mjs:

    import { config } from 'dotenv';
    import path from 'path';
    
    const nodeEnv = process.env.NODE_ENV || '';
    
    config({ path: path.resolve(process.cwd(), `.env${nodeEnv ? '.' + nodeEnv : ''}`) });
    
    console.log('process.env.DATABASE_CONNECTION_STRING: ', process.env.DATABASE_CONNECTION_STRING);
    

    .env

    DATABASE_CONNECTION_STRING=dev
    

    .env.production

    DATABASE_CONNECTION_STRING=prd
    

    Development:

    $ node index.mjs 
    process.env.DATABASE_CONNECTION_STRING:  dev
    

    Production:

    $ NODE_ENV=production node index.mjs 
    process.env.DATABASE_CONNECTION_STRING:  prd
    

    Reference:

    Node version: v14.21.3