Skip to content

Express.js

Express is a minimal and flexible Node.js web application framework.

Installation

npm install express

Basic Server

const express = require('express');
const app = express();
const PORT = 3000;

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

app.listen(PORT, () => {
  console.log(`Server running on http://localhost:${PORT}`);
});

Routing

Basic Routes

// GET request
app.get('/users', (req, res) => {
  res.json({ users: [] });
});

// POST request
app.post('/users', (req, res) => {
  res.status(201).json({ message: 'User created' });
});

// PUT request
app.put('/users/:id', (req, res) => {
  res.json({ message: 'User updated' });
});

// DELETE request
app.delete('/users/:id', (req, res) => {
  res.json({ message: 'User deleted' });
});

Route Parameters

app.get('/users/:id', (req, res) => {
  const { id } = req.params;
  res.json({ userId: id });
});

// Multiple parameters
app.get('/users/:userId/posts/:postId', (req, res) => {
  const { userId, postId } = req.params;
  res.json({ userId, postId });
});

Query Parameters

// /search?q=express&page=1
app.get('/search', (req, res) => {
  const { q, page } = req.query;
  res.json({ query: q, page });
});

Middleware

Application-level Middleware

// Logger middleware
app.use((req, res, next) => {
  console.log(`${req.method} ${req.url}`);
  next();
});

// JSON body parser
app.use(express.json());

// URL-encoded body parser
app.use(express.urlencoded({ extended: true }));

// Static files
app.use(express.static('public'));

Route-level Middleware

const authenticate = (req, res, next) => {
  const token = req.headers.authorization;

  if (!token) {
    return res.status(401).json({ error: 'Unauthorized' });
  }

  // Verify token
  next();
};

app.get('/protected', authenticate, (req, res) => {
  res.json({ message: 'Protected resource' });
});

Error Handling Middleware

app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({
    error: 'Internal Server Error',
    message: err.message
  });
});

Request Object

app.get('/info', (req, res) => {
  console.log(req.method);        // GET
  console.log(req.url);           // /info
  console.log(req.params);        // Route parameters
  console.log(req.query);         // Query parameters
  console.log(req.body);          // Request body
  console.log(req.headers);       // Request headers
  console.log(req.cookies);       // Cookies
  console.log(req.ip);            // IP address
  console.log(req.hostname);      // Hostname

  res.send('Info logged');
});

Response Object

app.get('/response', (req, res) => {
  // Send text
  res.send('Hello');

  // Send JSON
  res.json({ message: 'Success' });

  // Set status code
  res.status(201).json({ created: true });

  // Send file
  res.sendFile(__dirname + '/index.html');

  // Download file
  res.download('/path/to/file.pdf');

  // Redirect
  res.redirect('/new-url');

  // Set headers
  res.set('Content-Type', 'application/json');

  // Set cookie
  res.cookie('name', 'value', { maxAge: 900000 });
});

Router

// routes/users.js
const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
  res.json({ users: [] });
});

router.get('/:id', (req, res) => {
  res.json({ user: { id: req.params.id } });
});

router.post('/', (req, res) => {
  res.status(201).json({ message: 'User created' });
});

module.exports = router;

// app.js
const userRoutes = require('./routes/users');
app.use('/api/users', userRoutes);

Template Engines

EJS

app.set('view engine', 'ejs');

app.get('/', (req, res) => {
  res.render('index', {
    title: 'My App',
    users: ['Alice', 'Bob']
  });
});
<!-- views/index.ejs -->
<!DOCTYPE html>
<html>
<head>
  <title><%= title %></title>
</head>
<body>
  <h1><%= title %></h1>
  <ul>
    <% users.forEach(user => { %>
      <li><%= user %></li>
    <% }); %>
  </ul>
</body>
</html>

File Upload

const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

app.post('/upload', upload.single('file'), (req, res) => {
  console.log(req.file);
  res.json({ filename: req.file.filename });
});

// Multiple files
app.post('/uploads', upload.array('files', 5), (req, res) => {
  res.json({ files: req.files });
});

CORS

const cors = require('cors');

// Enable all CORS requests
app.use(cors());

// Configure CORS
app.use(cors({
  origin: 'http://example.com',
  methods: ['GET', 'POST'],
  credentials: true
}));

Sessions

const session = require('express-session');

app.use(session({
  secret: 'secret-key',
  resave: false,
  saveUninitialized: true,
  cookie: { maxAge: 60000 }
}));

app.get('/login', (req, res) => {
  req.session.user = { id: 1, name: 'John' };
  res.send('Logged in');
});

app.get('/profile', (req, res) => {
  if (req.session.user) {
    res.json(req.session.user);
  } else {
    res.status(401).send('Not authenticated');
  }
});

Environment Variables

require('dotenv').config();

const PORT = process.env.PORT || 3000;
const DB_URL = process.env.DATABASE_URL;

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});
# .env
PORT=3000
DATABASE_URL=mongodb://localhost:27017/mydb
SECRET_KEY=mysecret

Example API

const express = require('express');
const app = express();

app.use(express.json());

let users = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' }
];

// Get all users
app.get('/api/users', (req, res) => {
  res.json(users);
});

// Get user by ID
app.get('/api/users/:id', (req, res) => {
  const user = users.find(u => u.id === parseInt(req.params.id));

  if (!user) {
    return res.status(404).json({ error: 'User not found' });
  }

  res.json(user);
});

// Create user
app.post('/api/users', (req, res) => {
  const user = {
    id: users.length + 1,
    name: req.body.name
  };

  users.push(user);
  res.status(201).json(user);
});

// Update user
app.put('/api/users/:id', (req, res) => {
  const user = users.find(u => u.id === parseInt(req.params.id));

  if (!user) {
    return res.status(404).json({ error: 'User not found' });
  }

  user.name = req.body.name;
  res.json(user);
});

// Delete user
app.delete('/api/users/:id', (req, res) => {
  const index = users.findIndex(u => u.id === parseInt(req.params.id));

  if (index === -1) {
    return res.status(404).json({ error: 'User not found' });
  }

  users.splice(index, 1);
  res.status(204).send();
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

Resources