We need to work with environment variables in a Node.js application in different ways. Environment variables are like secret instructions that we can give to our program without hard-coding them into our source code. Think of them as configuration notes that we can change without touching our main program.
Our specific tasks are:
1. Set and read the NODE_ENV environment variable from the command line
2. Configure an Express server using environment variables from a .env file
3. Explore alternative ways to set environment variables
Let's start with the basics. Think of environment variables like temporary notes we pass to our program. When we run our program, we can attach these notes using the command line.
// index.js
// This line reads the 'NODE_ENV' environment variable
console.log(process.env.NODE_ENV);
// To run with environment variable:
// NODE_ENV="production" node index.js
The process.env object is like a special mailbox where Node.js keeps all these environment variables. When we write process.env.NODE_ENV, we're checking that mailbox for a note labeled "NODE_ENV".
Instead of typing environment variables in the command line every time, we can write them down in a special file called .env. Think of this like having a permanent note card with all our configuration information.
// .env file
PORT=5000
SECRET_MESSAGE="Hello from .env"
// app.js
// First, we need to tell our application to read the .env file
require('dotenv').config();
const express = require('express');
const app = express();
app.get('/', (req, res) => {
// Now we can access our environment variables
res.send(process.env.SECRET_MESSAGE);
});
// The port is also read from environment variables
const port = process.env.PORT;
app.listen(port, () => console.log('Server is listening on port', port));
Let's break down how environment variables work in our application:
1. When the application starts:
- dotenv reads the .env file
- It loads each variable into process.env
- Our application can now access these variables anywhere
2. When a request comes in:
- Express handles the request
- Our route handler reads the SECRET_MESSAGE from process.env
- The message is sent back to the client
// Method 1: Command Line Variables
PORT=5000 SECRET_MESSAGE="Hello from command-line" node app.js
// Method 2: Export Commands
export PORT=5000
export SECRET_MESSAGE="Hello from command-line"
node app.js
// Method 3: Using dotenv-cli
npm install dotenv-cli
dotenv node app.js
Environment variables are used extensively in professional development for:
- API keys and secrets
- Database connection strings
- Feature flags
- Configuration for different environments (development, staging, production)
When working with environment variables, remember:
1. Never commit .env files to version control
2. Always include a .env.example file showing required variables
3. Use meaningful variable names
4. Set defaults for non-critical variables
5. Validate environment variables at startup
// Example of environment variable validation
if (!process.env.SECRET_MESSAGE) {
throw new Error('SECRET_MESSAGE must be defined in environment');
}
// Example of providing defaults
const port = process.env.PORT || 3000;
A typical professional project might structure environment variables like this:
# .env.example
NODE_ENV=development
PORT=5000
API_KEY=your_api_key_here
DATABASE_URL=postgresql://user:password@localhost:5432/dbname
# config.js
require('dotenv').config();
module.exports = {
env: process.env.NODE_ENV || 'development',
port: process.env.PORT || 3000,
apiKey: process.env.API_KEY,
dbUrl: process.env.DATABASE_URL
};
Think of environment variables as the control panel for your application - they allow you to adjust settings without changing code, much like how a sound engineer uses a mixing board to adjust different aspects of the sound without changing the instruments or musicians.