Skip to main content

Express Environment Setup

Setting up the right development environment is a crucial first step in building successful Express.js applications. In this guide, we'll walk through the entire process of configuring your environment for Express development, from installation to setting up environment-specific configurations.

What You'll Learn

  • Installing Node.js and npm
  • Setting up an Express project
  • Managing environment variables
  • Configuring different environments (development, production)
  • Best practices for environment setup

Prerequisites

Before we begin, make sure you have:

  • Basic knowledge of JavaScript
  • A text editor or IDE (like VS Code, Sublime Text, etc.)
  • Terminal/Command prompt access

Installing Node.js and npm

Express.js runs on Node.js, so our first step is to install Node.js which comes bundled with npm (Node Package Manager).

1. Download and Install Node.js

Visit the official Node.js website and download the LTS (Long Term Support) version which is recommended for most users.

2. Verify Installation

After installation, verify that Node.js and npm are correctly installed by running these commands in your terminal:

bash
node -v
npm -v

You should see version numbers displayed for both commands, like:

v16.15.0
8.5.5

Creating an Express Application

Now that we have Node.js installed, let's set up a basic Express application.

1. Create a Project Directory

bash
mkdir my-express-app
cd my-express-app

2. Initialize a Node.js Project

bash
npm init -y

This creates a package.json file with default values.

3. Install Express

bash
npm install express

4. Create a Basic Express Server

Create a file named app.js in your project directory:

javascript
const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
res.send('Hello World!');
});

app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
});

5. Run Your Express Application

bash
node app.js

Open your browser and navigate to http://localhost:3000. You should see "Hello World!" displayed.

Managing Environment Variables

Environment variables help you manage configuration that varies between different environments.

1. Install dotenv

bash
npm install dotenv

2. Create Environment Files

Create a .env file in your project root:

PORT=3000
NODE_ENV=development
DATABASE_URL=mongodb://localhost:27017/myapp

Important: Add .env to your .gitignore file to prevent sensitive information from being committed to version control:

node_modules/
.env

3. Load Environment Variables

Modify your app.js file to load environment variables:

javascript
require('dotenv').config();
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;

app.get('/', (req, res) => {
res.send('Hello World!');
});

app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
console.log(`Environment: ${process.env.NODE_ENV}`);
});

Setting Up Different Environments

Let's configure our application to behave differently based on the environment.

1. Create Environment-Specific Configuration Files

Create a config directory with environment-specific files:

my-express-app/
├── config/
│ ├── config.js
│ ├── development.js
│ └── production.js
├── app.js
└── package.json

config/development.js

javascript
module.exports = {
database: {
url: 'mongodb://localhost:27017/myapp',
options: {
useNewUrlParser: true,
useUnifiedTopology: true
}
},
logging: true,
morgan: 'dev'
};

config/production.js

javascript
module.exports = {
database: {
url: process.env.DATABASE_URL,
options: {
useNewUrlParser: true,
useUnifiedTopology: true
}
},
logging: false,
morgan: 'combined'
};

config/config.js

javascript
require('dotenv').config();
const env = process.env.NODE_ENV || 'development';
const config = require(`./${env}`);

module.exports = config;

2. Use Configuration in Your App

Update your app.js to use the configuration:

javascript
const express = require('express');
const morgan = require('morgan'); // You'll need to install this: npm install morgan
const config = require('./config/config');
const app = express();
const port = process.env.PORT || 3000;

// Apply environment-specific configuration
if (config.logging) {
app.use(morgan(config.morgan));
}

app.get('/', (req, res) => {
res.send(`Hello World from ${process.env.NODE_ENV || 'development'} environment!`);
});

app.listen(port, () => {
console.log(`Example app listening on port ${port}`);
console.log(`Environment: ${process.env.NODE_ENV || 'development'}`);
});

Running in Different Environments

To run your application in different environments, you can use:

Development (Default)

bash
node app.js

Production

bash
NODE_ENV=production node app.js

In Windows Command Prompt:

cmd
set NODE_ENV=production && node app.js

In PowerShell:

powershell
$env:NODE_ENV="production"; node app.js

Using npm Scripts

Add these scripts to your package.json for easier environment management:

json
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js",
"start:prod": "NODE_ENV=production node app.js"
}

Now you can run:

bash
npm run dev          # For development with auto-restart
npm start # For regular development
npm run start:prod # For production

Best Practices for Environment Setup

  1. Never commit sensitive information to version control. Use environment variables instead.

  2. Use environment-specific configuration files for different settings in development and production.

  3. Set appropriate defaults for when environment variables are not available.

  4. Use a proper logging strategy that changes based on the environment.

  5. Enable development tools only in development environment:

javascript
if (process.env.NODE_ENV !== 'production') {
// Enable development-specific middleware
app.use(require('morgan')('dev'));
app.use(require('errorhandler')());
}
  1. Validate your environment at startup:
javascript
const requiredEnvVars = ['DATABASE_URL', 'API_KEY'];

requiredEnvVars.forEach(envVar => {
if (!process.env[envVar]) {
console.error(`Error: Environment variable ${envVar} is required`);
process.exit(1); // Exit with error code
}
});

Real-World Example: Complete Express Setup

Here's a more complete example integrating all we've learned:

javascript
// app.js
require('dotenv').config();
const express = require('express');
const morgan = require('morgan');
const helmet = require('helmet'); // Security middleware
const compression = require('compression'); // Response compression
const config = require('./config/config');

const app = express();
const port = process.env.PORT || 3000;

// Basic middleware
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// Environment-specific middleware
if (process.env.NODE_ENV === 'production') {
app.use(helmet());
app.use(compression());
} else {
app.use(morgan('dev'));
}

// Database setup
const mongoose = require('mongoose');
mongoose.connect(config.database.url, config.database.options)
.then(() => console.log('Connected to database'))
.catch(err => console.error('Database connection error:', err));

// Routes
app.get('/', (req, res) => {
res.json({
message: 'API is running',
environment: process.env.NODE_ENV || 'development'
});
});

// Error handling middleware
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({
error: process.env.NODE_ENV === 'production' ? 'Server error' : err.message
});
});

// Start server
app.listen(port, () => {
console.log(`Server running on port ${port}`);
console.log(`Environment: ${process.env.NODE_ENV || 'development'}`);
});

To run this complete example, you'd need to install the additional dependencies:

bash
npm install express dotenv morgan helmet compression mongoose

Summary

In this guide, we've covered:

  • Setting up a basic Express application
  • Managing environment variables with dotenv
  • Creating environment-specific configuration files
  • Running Express in different environments
  • Best practices for environment management
  • A complete real-world Express setup example

By following these practices, you'll have a solid foundation for developing Express applications that can smoothly transition between development and production environments.

Additional Resources

Exercises

  1. Create a simple Express application that displays different messages based on the environment.
  2. Set up a configuration system that loads database credentials from environment variables.
  3. Create a middleware that only runs in development and logs request details.
  4. Configure your Express app to use different error handling approaches in development vs. production.
  5. Set up a complete Express project structure with environment-specific routing and middleware.

Happy coding!



If you spot any mistakes on this website, please let me know at [email protected]. I’d greatly appreciate your feedback! :)