नमस्ते दोस्तों! 🙏
स्वागत है The Easy Master पर!
क्या तुमने कभी सोचा है – Database password, API keys, JWT secrets – ye sensitive data code mein hardcode karna safe kyun nahi hai?
Agar tum GitHub par code push karoge toh sabko dikh jayega! Hackers tumhare database ko access kar sakte hain. Environment variables is problem ka solution हैं।
Express.js environment variables Hindi में समझना बहुत जरूरी है क्योंकि:
- Security – sensitive data code se bahar rakho
- Different environments – development, staging, production ke alag config
- No hardcoding – port, database URL, API keys
- Industry standard – har company env variables use karti है
- 12-factor app – best practice for modern apps
Aaj kya seekhoge?
| Topic | Kya Seekhega? |
|---|---|
| Environment Variables Kya Hain? | Concept aur importance |
| dotenv Package | Installation aur setup |
| .env File | Variables store karna |
| Accessing Variables | process.env se read karna |
| Different Environments | development, production, staging |
| Validation | Required variables check karna |
| Best Practices | Security tips |
| Real Project | Complete setup |
Kya tumhe pata hai?.env file ko never GitHub par push karna chahiye – हमेशा .gitignore में add करो!
तो चलिए शुरू करते हैं – Express.js environment variables Hindi सीखने का सफर! 🚀
Table of Contents
1. Environment Variables क्या Hain? – Introduction
Environment variables key-value pairs होते हैं जो application ke bahar store होते हैं।
Without Environment Variables (❌ Bad Practice):
// ❌ NEVER DO THIS!
const app = require('express')();
// Hardcoded credentials – SECURITY RISK!
const DB_PASSWORD = 'mypassword123';
const JWT_SECRET = 'mysecretkey';
const API_KEY = 'abc123xyz';
const PORT = 3000;
// Database connection with hardcoded password
mongoose.connect(`mongodb://admin:mypassword123@localhost:27017/mydb`);
app.listen(PORT);Problems:
- 🔴 GitHub par push karoge toh sabko dikhega
- 🔴 Hackers easily access kar sakte hain
- 🔴 Different environments (dev/prod) ke liye alag values nahi daal sakte
- 🔴 Code change karna padta hai environment change karne ke liye
With Environment Variables (Good Practice):
// ✅ BEST PRACTICE!
require('dotenv').config();
const app = require('express')();
// Read from environment variables
const DB_PASSWORD = process.env.DB_PASSWORD;
const JWT_SECRET = process.env.JWT_SECRET;
const PORT = process.env.PORT || 3000;
// Database connection
mongoose.connect(`mongodb://admin:${DB_PASSWORD}@localhost:27017/mydb`);
app.listen(PORT);# .env file (never commit to GitHub!)
DB_PASSWORD=mypassword123
JWT_SECRET=mysecretkey
API_KEY=abc123xyz
PORT=3000Benefits:
- 🟢 Secrets code से बाहर
- 🟢 GitHub safe
- 🟢 Different environments ke liye alag .env files
- 🟢 No code change for different configs
Express.js environment variables Hindi में हम professional setup सीखेंगे।
2. Why Environment Variables? – Benefits
Top 5 Benefits:
| Benefit | Explanation |
|---|---|
| Security | Secrets code में नहीं होते, .gitignore में होते हैं |
| Flexibility | Bina code change किए config change कर सकते हो |
| Multi-environment | Dev, staging, production – अलग-अलग configs |
| Team collaboration | हर developer के पास अपनी .env file हो सकती है |
| 12-factor app | Industry standard best practice |
Real-world Scenario:
// Same code, different environments
// Development (.env.development)
DB_HOST=localhost
DB_NAME=dev_db
DEBUG=true
// Production (.env.production)
DB_HOST=cluster.mongodb.net
DB_NAME=prod_db
DEBUG=false
// Code remains the same!
const dbHost = process.env.DB_HOST;
const dbName = process.env.DB_NAME;
const debug = process.env.DEBUG === 'true';What to Store in .env:
# ✅ GOOD to store in .env
PORT=3000
NODE_ENV=development
DB_HOST=localhost
DB_USER=admin
DB_PASSWORD=secret123
JWT_SECRET=very_long_random_string
API_KEY=abc123xyz
EMAIL_HOST=smtp.gmail.com
EMAIL_USER=myapp@gmail.com
EMAIL_PASS=app_password
REDIS_URL=redis://localhost:6379
AWS_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE
AWS_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# ❌ NOT to store in .env
# - Code logic
# - HTML templates
# - Routes
# - Business logic3. dotenv Package – Installation
Step 1: Install dotenv
npm install dotenvStep 2: Create .env File
# .env
PORT=3000
NODE_ENV=development
DB_HOST=localhost
DB_PORT=27017
DB_NAME=mydb
DB_USER=admin
DB_PASSWORD=secret123
JWT_SECRET=my_super_secret_key_2026
JWT_EXPIRES_IN=7d
BCRYPT_ROUNDS=10
API_KEY=abc123xyz
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USER=myapp@gmail.com
EMAIL_PASS=app_password_hereStep 3: Load dotenv in Express
// server.js
// Method 1: Load at the very top (recommended)
require('dotenv').config();
const express = require('express');
const app = express();
console.log('PORT:', process.env.PORT);
console.log('NODE_ENV:', process.env.NODE_ENV);
console.log('DB_HOST:', process.env.DB_HOST);
app.listen(process.env.PORT || 3000);Step 4: Add .env to .gitignore
# .gitignore
node_modules/
.env
.env.*
!.env.example
.DS_Store
*.logStep 5: Create .env.example (for team)
# .env.example (commit to GitHub)
# Copy this file to .env and fill your values
PORT=3000
NODE_ENV=development
DB_HOST=localhost
DB_PORT=27017
DB_NAME=mydb
DB_USER=admin
DB_PASSWORD=your_password_here
JWT_SECRET=your_jwt_secret_here
JWT_EXPIRES_IN=7d
BCRYPT_ROUNDS=10
API_KEY=your_api_key_here
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USER=your_email@gmail.com
EMAIL_PASS=your_app_password4. .env File – Variables Store Karna
.env File Syntax Rules:
# .env file syntax
# 1. Basic key=value (no quotes needed)
PORT=3000
NODE_ENV=production
# 2. Strings with spaces (use quotes)
APP_NAME="My Express App"
WELCOME_MESSAGE='Hello World!'
# 3. Numbers (no quotes)
MAX_USERS=1000
TIMEOUT=5000
# 4. Booleans (as strings, parse manually)
DEBUG=true
ENABLE_LOGGING=false
# 5. Comments (start with #)
# This is a comment
DB_HOST=localhost # inline comment also works
# 6. Multi-line values (use quotes)
CERTIFICATE="-----BEGIN CERTIFICATE-----
MIIDXTCCAkWgAwIBAgIJAKlKjH...
-----END CERTIFICATE-----"
# 7. Empty values
EMPTY_VAR=
# 8. Special characters (use quotes)
PASSWORD="p@ssw0rd#123!"
API_KEY="abc-123_xyz"
# 9. Expand variables (using ${})
DB_URL=mongodb://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}
# 10. Override defaults
# Values can be overridden by system environment variablesMultiple .env Files:
# Different files for different environments
.env # Default (loaded first)
.env.development # Development overrides
.env.production # Production overrides
.env.local # Local overrides (gitignored)
.env.test # Testing environmentLoading Specific .env File:
// server.js
const dotenv = require('dotenv');
const path = require('path');
// Load based on NODE_ENV
const envFile = process.env.NODE_ENV === 'production'
? '.env.production'
: '.env.development';
dotenv.config({ path: path.resolve(process.cwd(), envFile) });
// Or load multiple files (later ones override earlier)
dotenv.config(); // loads .env
dotenv.config({ path: '.env.local', override: true });5. Accessing Variables – process.env
Basic Access:
// server.js
require('dotenv').config();
// Access environment variables
const PORT = process.env.PORT || 3000;
const NODE_ENV = process.env.NODE_ENV || 'development';
const DB_HOST = process.env.DB_HOST;
const DB_PASSWORD = process.env.DB_PASSWORD;
console.log(`Server running on port ${PORT}`);
console.log(`Environment: ${NODE_ENV}`);Complete Express Config with Env Variables:
// config/index.js
require('dotenv').config();
module.exports = {
// Server
port: parseInt(process.env.PORT, 10) || 3000,
nodeEnv: process.env.NODE_ENV || 'development',
// Database
db: {
host: process.env.DB_HOST || 'localhost',
port: parseInt(process.env.DB_PORT, 10) || 27017,
name: process.env.DB_NAME || 'mydb',
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
url: process.env.DB_URL || `mongodb://${process.env.DB_USER}:${process.env.DB_PASSWORD}@${process.env.DB_HOST}:${process.env.DB_PORT}/${process.env.DB_NAME}`
},
// JWT
jwt: {
secret: process.env.JWT_SECRET,
expiresIn: process.env.JWT_EXPIRES_IN || '7d',
refreshSecret: process.env.JWT_REFRESH_SECRET,
refreshExpiresIn: process.env.JWT_REFRESH_EXPIRES_IN || '30d'
},
// Email
email: {
host: process.env.EMAIL_HOST,
port: parseInt(process.env.EMAIL_PORT, 10) || 587,
user: process.env.EMAIL_USER,
pass: process.env.EMAIL_PASS,
from: process.env.EMAIL_FROM || 'noreply@myapp.com'
},
// API Keys
apiKeys: {
google: process.env.GOOGLE_API_KEY,
stripe: process.env.STRIPE_SECRET_KEY,
sendgrid: process.env.SENDGRID_API_KEY
},
// Features
features: {
enableLogging: process.env.ENABLE_LOGGING === 'true',
enableCaching: process.env.ENABLE_CACHING === 'true',
debug: process.env.DEBUG === 'true'
},
// Rate Limiting
rateLimit: {
windowMs: parseInt(process.env.RATE_LIMIT_WINDOW_MS, 10) || 15 * 60 * 1000,
max: parseInt(process.env.RATE_LIMIT_MAX, 10) || 100
}
};Using Config in Server:
// server.js
const config = require('./config');
const express = require('express');
const mongoose = require('mongoose');
const app = express();
// Database connection
mongoose.connect(config.db.url, {
useNewUrlParser: true,
useUnifiedTopology: true
});
console.log(`Connected to ${config.db.name} database`);
// JWT config
const jwt = require('jsonwebtoken');
const token = jwt.sign({ id: 1 }, config.jwt.secret, {
expiresIn: config.jwt.expiresIn
});
// Email service
const nodemailer = require('nodemailer');
const transporter = nodemailer.createTransport({
host: config.email.host,
port: config.email.port,
auth: {
user: config.email.user,
pass: config.email.pass
}
});
// Conditional logging
if (config.features.enableLogging) {
app.use(require('morgan')('dev'));
}
app.listen(config.port, () => {
console.log(`Server running on port ${config.port}`);
console.log(`Environment: ${config.nodeEnv}`);
console.log(`Debug mode: ${config.features.debug}`);
});6. Different Environments – Development vs Production
Environment-Specific Files:
# Project structure
.env.development # Development environment
.env.production # Production environment
.env.staging # Staging environment
.env.test # Testing environment
.env.local # Local overrides (gitignored).env.development:
# .env.development
NODE_ENV=development
PORT=3000
DEBUG=true
LOG_LEVEL=debug
DB_HOST=localhost
DB_NAME=dev_db
ENABLE_SWAGGER=true
JWT_EXPIRES_IN=1h.env.production:
# .env.production
NODE_ENV=production
PORT=8080
DEBUG=false
LOG_LEVEL=error
DB_HOST=cluster.mongodb.net
DB_NAME=prod_db
ENABLE_SWAGGER=false
JWT_EXPIRES_IN=7dLoading Based on Environment:
// config/env.js
const dotenv = require('dotenv');
const path = require('path');
// Determine which env file to load
const env = process.env.NODE_ENV || 'development';
const envFile = `.env.${env}`;
// Load environment file
dotenv.config({ path: path.resolve(process.cwd(), envFile) });
// Also load .env.local if exists (for local overrides)
dotenv.config({
path: path.resolve(process.cwd(), '.env.local'),
override: true
});
console.log(`Loaded environment: ${env}`);
console.log(`Config file: ${envFile}`);Running with Different Environments:
// package.json scripts
{
"scripts": {
"start": "node server.js",
"dev": "NODE_ENV=development nodemon server.js",
"prod": "NODE_ENV=production node server.js",
"staging": "NODE_ENV=staging node server.js",
"test": "NODE_ENV=test jest"
}
}# Run development
npm run dev
# Run production
npm run prod
# Or manually set
NODE_ENV=production node server.js7. Validation – Required Variables Check
Basic Validation:
// config/validate.js
require('dotenv').config();
const requiredEnvVars = [
'PORT',
'NODE_ENV',
'DB_HOST',
'DB_NAME',
'JWT_SECRET'
];
const missingVars = [];
for (const envVar of requiredEnvVars) {
if (!process.env[envVar]) {
missingVars.push(envVar);
}
}
if (missingVars.length > 0) {
console.error('❌ Missing required environment variables:');
missingVars.forEach(varName => {
console.error(` - ${varName}`);
});
process.exit(1);
}
console.log('✅ All required environment variables are set');Advanced Validation with Joi:
npm install joi// config/validation.js
const Joi = require('joi');
require('dotenv').config();
const envSchema = Joi.object({
// Server
PORT: Joi.number().default(3000),
NODE_ENV: Joi.string().valid('development', 'production', 'staging', 'test').default('development'),
// Database
DB_HOST: Joi.string().required(),
DB_PORT: Joi.number().default(27017),
DB_NAME: Joi.string().required(),
DB_USER: Joi.string().required(),
DB_PASSWORD: Joi.string().required(),
// JWT
JWT_SECRET: Joi.string().min(32).required(),
JWT_EXPIRES_IN: Joi.string().default('7d'),
// Email
EMAIL_HOST: Joi.string().required(),
EMAIL_PORT: Joi.number().default(587),
EMAIL_USER: Joi.string().required(),
EMAIL_PASS: Joi.string().required(),
// Features
DEBUG: Joi.boolean().default(false),
ENABLE_LOGGING: Joi.boolean().default(true)
}).unknown(); // Allow unknown variables
const { error, value } = envSchema.validate(process.env, {
abortEarly: false
});
if (error) {
console.error('❌ Environment validation failed:');
error.details.forEach(detail => {
console.error(` - ${detail.message}`);
});
process.exit(1);
}
console.log('✅ Environment variables validated successfully');
module.exports = value;Using Validated Config:
// server.js
const config = require('./config/validation');
console.log('Server Config:', {
port: config.PORT,
env: config.NODE_ENV,
db: `${config.DB_HOST}:${config.DB_PORT}/${config.DB_NAME}`,
debug: config.DEBUG
});
// Use config values
app.listen(config.PORT, () => {
console.log(`Server running in ${config.NODE_ENV} mode`);
});8. Best Practices – Security Tips
Security Checklist:
// ✅ DO's
// 1. Always add .env to .gitignore
// .gitignore
.env
.env.*
!.env.example
// 2. Create .env.example with dummy values
// .env.example
PORT=3000
DB_PASSWORD=your_password_here
JWT_SECRET=your_jwt_secret_here
// 3. Use long, random secrets
const crypto = require('crypto');
const secret = crypto.randomBytes(64).toString('hex');
console.log(secret); // Generate and copy to .env
// 4. Never hardcode defaults for sensitive values
const JWT_SECRET = process.env.JWT_SECRET;
if (!JWT_SECRET) {
throw new Error('JWT_SECRET is required!');
}
// 5. Validate required variables at startup
require('./config/validate');
// 6. Use different secrets for different environments
// .env.development: JWT_SECRET=dev_secret
// .env.production: JWT_SECRET=prod_very_long_random_secret
// 7. Rotate secrets periodically
// Change JWT_SECRET every 30-90 days
// 8. Use environment-specific configs
const config = {
development: require('./config/development'),
production: require('./config/production')
}[process.env.NODE_ENV];❌ DON’Ts:
// ❌ NEVER hardcode secrets
const API_KEY = 'abc123'; // BIG NO!
// ❌ Never commit .env to GitHub
// Always add to .gitignore
// ❌ Don't use default values for sensitive data
const JWT_SECRET = process.env.JWT_SECRET || 'default_secret'; // BAD!
// ❌ Don't log environment variables
console.log(process.env); // Don't do this!
// ❌ Don't use simple secrets
JWT_SECRET = 'password123'; // Too weak!
// ❌ Don't share .env files via email/Slack
// Use password managers or secure vaultsProduction Security Tips:
// config/production.js
module.exports = {
// Use process manager (PM2) to manage env variables
// pm2 start server.js --env production
// Use Docker secrets for sensitive data
// docker secret create db_password ./db_password.txt
// Use cloud secret managers
// AWS Secrets Manager
// Azure Key Vault
// HashiCorp Vault
// For serverless, use environment variables in console
// AWS Lambda: Environment variables section
// Vercel: Environment Variables in dashboard
// Heroku: Config Vars in settings
};9. Real-world Project Setup
Complete Professional Setup:
// config/index.js
const dotenv = require('dotenv');
const path = require('path');
const Joi = require('joi');
// Load environment file based on NODE_ENV
const env = process.env.NODE_ENV || 'development';
const envFile = `.env.${env}`;
dotenv.config({ path: path.resolve(process.cwd(), envFile) });
dotenv.config({ path: path.resolve(process.cwd(), '.env.local'), override: true });
// Validation schema
const envSchema = Joi.object({
NODE_ENV: Joi.string().valid('development', 'production', 'staging', 'test').required(),
PORT: Joi.number().default(3000),
// Database
DB_HOST: Joi.string().required(),
DB_PORT: Joi.number().default(5432),
DB_NAME: Joi.string().required(),
DB_USER: Joi.string().required(),
DB_PASSWORD: Joi.string().required(),
// JWT
JWT_SECRET: Joi.string().min(32).required(),
JWT_EXPIRES_IN: Joi.string().default('7d'),
JWT_REFRESH_SECRET: Joi.string().min(32).required(),
JWT_REFRESH_EXPIRES_IN: Joi.string().default('30d'),
// Redis
REDIS_URL: Joi.string().required(),
// Email
EMAIL_HOST: Joi.string().required(),
EMAIL_PORT: Joi.number().default(587),
EMAIL_USER: Joi.string().required(),
EMAIL_PASS: Joi.string().required(),
EMAIL_FROM: Joi.string().email().required(),
// Stripe
STRIPE_SECRET_KEY: Joi.string().required(),
STRIPE_WEBHOOK_SECRET: Joi.string().required(),
// AWS
AWS_ACCESS_KEY_ID: Joi.string().required(),
AWS_SECRET_ACCESS_KEY: Joi.string().required(),
AWS_REGION: Joi.string().default('ap-south-1'),
AWS_S3_BUCKET: Joi.string().required(),
// Features
DEBUG: Joi.boolean().default(false),
ENABLE_SWAGGER: Joi.boolean().default(false),
CORS_ORIGIN: Joi.string().default('*'),
// Rate Limiting
RATE_LIMIT_WINDOW_MS: Joi.number().default(15 * 60 * 1000),
RATE_LIMIT_MAX: Joi.number().default(100)
}).unknown();
// Validate
const { error, value: validatedEnv } = envSchema.validate(process.env, {
abortEarly: false
});
if (error) {
console.error('❌ Environment validation failed:');
error.details.forEach(detail => {
console.error(` ${detail.message}`);
});
process.exit(1);
}
// Export config
module.exports = {
env: validatedEnv.NODE_ENV,
isProduction: validatedEnv.NODE_ENV === 'production',
isDevelopment: validatedEnv.NODE_ENV === 'development',
isStaging: validatedEnv.NODE_ENV === 'staging',
isTest: validatedEnv.NODE_ENV === 'test',
server: {
port: validatedEnv.PORT,
corsOrigin: validatedEnv.CORS_ORIGIN
},
db: {
host: validatedEnv.DB_HOST,
port: validatedEnv.DB_PORT,
name: validatedEnv.DB_NAME,
user: validatedEnv.DB_USER,
password: validatedEnv.DB_PASSWORD,
url: `postgresql://${validatedEnv.DB_USER}:${validatedEnv.DB_PASSWORD}@${validatedEnv.DB_HOST}:${validatedEnv.DB_PORT}/${validatedEnv.DB_NAME}`
},
jwt: {
secret: validatedEnv.JWT_SECRET,
expiresIn: validatedEnv.JWT_EXPIRES_IN,
refreshSecret: validatedEnv.JWT_REFRESH_SECRET,
refreshExpiresIn: validatedEnv.JWT_REFRESH_EXPIRES_IN
},
redis: {
url: validatedEnv.REDIS_URL
},
email: {
host: validatedEnv.EMAIL_HOST,
port: validatedEnv.EMAIL_PORT,
auth: {
user: validatedEnv.EMAIL_USER,
pass: validatedEnv.EMAIL_PASS
},
from: validatedEnv.EMAIL_FROM
},
stripe: {
secretKey: validatedEnv.STRIPE_SECRET_KEY,
webhookSecret: validatedEnv.STRIPE_WEBHOOK_SECRET
},
aws: {
accessKeyId: validatedEnv.AWS_ACCESS_KEY_ID,
secretAccessKey: validatedEnv.AWS_SECRET_ACCESS_KEY,
region: validatedEnv.AWS_REGION,
s3Bucket: validatedEnv.AWS_S3_BUCKET
},
features: {
debug: validatedEnv.DEBUG,
enableSwagger: validatedEnv.ENABLE_SWAGGER
},
rateLimit: {
windowMs: validatedEnv.RATE_LIMIT_WINDOW_MS,
max: validatedEnv.RATE_LIMIT_MAX
}
};Using the Config:
// server.js
const config = require('./config');
const express = require('express');
const mongoose = require('mongoose');
const redis = require('redis');
const app = express();
// Database connection
mongoose.connect(config.db.url);
// Redis connection
const redisClient = redis.createClient({ url: config.redis.url });
// JWT middleware
const jwt = require('jsonwebtoken');
const token = jwt.sign({ id: 1 }, config.jwt.secret, {
expiresIn: config.jwt.expiresIn
});
// Conditional features
if (config.features.debug) {
app.use(require('morgan')('dev'));
}
if (config.features.enableSwagger) {
const swaggerUi = require('swagger-ui-express');
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));
}
// Rate limiting
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: config.rateLimit.windowMs,
max: config.rateLimit.max
});
app.use('/api', limiter);
app.listen(config.server.port, () => {
console.log(`🚀 Server running on port ${config.server.port}`);
console.log(`📝 Environment: ${config.env}`);
console.log(`🔧 Debug mode: ${config.features.debug}`);
});10. Common Mistakes + Solutions
Mistake 1: Forgetting to load dotenv
// ❌ process.env is undefined
const PORT = process.env.PORT; // undefined!
// ✅ Load dotenv at the very top
require('dotenv').config();
const PORT = process.env.PORT;Mistake 2: Committing .env to GitHub
# ❌ .env committed to git
git add .env
git commit -m "Added env file"
# ✅ Add to .gitignore
echo ".env" >> .gitignore
git add .gitignore
git commit -m "Added .gitignore"Mistake 3: Not validating required variables
// ❌ App crashes later with cryptic error
const JWT_SECRET = process.env.JWT_SECRET;
// Later: jwt.sign fails with "secret is required"
// ✅ Validate at startup
if (!process.env.JWT_SECRET) {
throw new Error('JWT_SECRET is required!');
}Mistake 4: Using default values for secrets
// ❌ Dangerous default
const JWT_SECRET = process.env.JWT_SECRET || 'default_secret';
// ✅ No default for secrets
const JWT_SECRET = process.env.JWT_SECRET;
if (!JWT_SECRET) throw new Error('JWT_SECRET required');Mistake 5: Loading dotenv after other modules
// ❌ Other modules need env vars
const config = require('./config'); // reads process.env
require('dotenv').config(); // too late!
// ✅ Load dotenv FIRST
require('dotenv').config();
const config = require('./config');11. Quick Cheat Sheet
Installation:
npm install dotenvBasic Setup:
require('dotenv').config();
const PORT = process.env.PORT || 3000;.env File:
PORT=3000
NODE_ENV=development
DB_PASSWORD=secret
JWT_SECRET=your_secret_keyAccessing Variables:
const port = process.env.PORT;
const isDev = process.env.NODE_ENV === 'development';
const debug = process.env.DEBUG === 'true';
const timeout = parseInt(process.env.TIMEOUT, 10);Multiple Environments:
.env.development
.env.production
.env.stagingLoading Specific File:
dotenv.config({ path: '.env.production' });Validation:
if (!process.env.JWT_SECRET) {
throw new Error('JWT_SECRET required');
}12. FAQ
Q1: Express.js environment variables Hindi में सबसे important package kya hai?dotenv – ye .env file से variables load करता है process.env में।
Q2: .env file ko GitHub par push karna chahiye?
❌ NEVER! Always add .env to .gitignore. Create .env.example for reference.
Q3: Multiple environments ke liye alag .env files kaise use karein?.env.development, .env.production – और NODE_ENV के according load करो।
Q4: process.env mein variable string mein aata है – number/boolean kaise use karein?
Parse manually: parseInt(process.env.PORT) या process.env.DEBUG === 'true'।
Q5: Required variables kaise validate karein?
Startup par check करो: if (!process.env.JWT_SECRET) throw new Error(...) या Joi library use करो।
Q6: Production mein env variables kaise set karein?
Heroku: heroku config:set KEY=value, AWS: Environment variables in console, Docker: -e KEY=value।
Q7: .env.example kyun banayein?
Team members को बताने के लिए कौन से variables chahiye – dummy values के साथ।
Q8: Kya .env file mein comments likh sakte hain?
Haan, # se start करो – # This is a comment
Q9: .env file mein variables ko expand kar sakte hain?
Haan, ${VAR_NAME} syntax use करो – DB_URL=mongodb://${DB_USER}:${DB_PASSWORD}@localhost
Q10: dotenv ke bina env variables access kar sakte hain?
Haan, system environment variables already process.env में होते हैं। dotenv sirf .env file load करता है।
13. Conclusion
बहुत बढ़िया दोस्तों! आज हमने Express.js environment variables Hindi को पूरी detail में समझा।
Quick Recap:
| Concept | Key Takeaway |
|---|---|
| Environment Variables | Sensitive data code से बाहर |
| dotenv | .env file load करने का package |
| process.env | Variables access करने का object |
| .gitignore | .env file ko GitHub से बचाओ |
| Validation | Required variables check करो |
| Multiple Environments | अलग-अलग configs |
Mera personal experience:
Pehle main database password code mein hardcode karta था – ek बार GitHub par push kar diya तो सबको dikh गया। उसके बाद से env variables use karna शुरू कर दिया। अब security ka tension nahi hai।
Tum bhi ye steps follow karo:
- ✅ dotenv install करो
- ✅ .env file banao
- ✅ .gitignore में .env add करो
- ✅ .env.example banao (for team)
- ✅ Validation add करो
अब तुम्हारी बारी है!
नीचे comment में बताओ:
- क्या तुमने कभी code में secret hardcode kiya है?
- तुम कौन सा validation method use karoge?
- अगला topic क्या चाहिए? (MongoDB with Mongoose? JWT Authentication? File Upload?)
The Easy Master पर बने रहो। Happy Secure Coding! 🔐🚀
Resources
Additional Resources
- React.js Kya Hai? JSX aur Components Samjhe – Beginner Guide 2026
- React Props and State Data Flow Hindi – समझे आसान भाषा में 2026
- React Router v6 – Multi-Page App Banaye (Routing Guide) 2026
- Advanced React Hooks – useContext and useReducer Samjhe 2026
- Redux Toolkit Simplified – State Management Aasaan Tarika 2026
- React API Integration Made Easy with Fetch and Axios
- React Performance Optimization – App Ko Fast कैसे बनाएं 2026
- React 19 New Features – AI Integration with React (2026)
- Node.js क्या है? 2026 में अपना पहला Backend Server बनाएँ
- NPM Packages कैसे इंस्टॉल करें? Modules (ESM vs CommonJS) 2026
- Express.js Tutorial – REST API Routing और Middleware समझे 2026
- Prisma ORM MongoDB से Database Connect कैसे करें – Easy Tutorial Hindi
- JWT Authentication Node.js – Secure Login System बनाए 2026
- WebSockets Node.js – Live Chat App कैसे बनाएं (Socket.io)
- Async Await vs Promises – Node.js में Async Code कैसे सीखें?
- Microservices Architecture node.js आसान हिंदी Explanation 2026
- Docker से Node.js App Production Ready Deploy करें 2026
- Express.js Setup – पहला Server कैसे बनाएं (Step-by-Step) 2026
- Express.js Routing – GET POST PUT DELETE Complete Guide
- Express Middleware समझे – Application, Router, Error Middleware
- Express req and res Objects – Query, Params, Body, Headers Explained
- Express Static Files और Templating – EJS से Dynamic HTML Banaye
- Express Router – API Routes को Organize करें (Modular Code)