Topics Express.js Framework Middleware & Error Handling
intermediate 15 min read

Middleware & Error Handling

Custom middleware, error handling patterns, and third-party middleware integration.

Middleware Types

// Application-level middleware\napp.use(middleware);\n\n// Router-level middleware\nrouter.use(middleware);\n\n// Error-handling middleware (4 params)\napp.use((err, req, res, next) => {\n  console.error(err.stack);\n  res.status(500).json({ error: err.message });\n});\n\n// Built-in middleware\napp.use(express.json({ limit: '10mb' }));\napp.use(express.static('public', { maxAge: '1d' }));\napp.use(express.urlencoded({ extended: false }));\n\n// Third-party middleware\nconst morgan = require('morgan');\nconst cors = require('cors');\nconst helmet = require('helmet');\n\napp.use(helmet());            // Security headers\napp.use(cors());              // Cross-origin requests\napp.use(morgan('combined'));  // HTTP request logging

Error Handling Pattern

// Async error wrapper\nconst asyncHandler = (fn) => (req, res, next) => {\n  Promise.resolve(fn(req, res, next)).catch(next);\n};\n\n// Usage\napp.get('/api/users', asyncHandler(async (req, res) => {\n  const users = await User.findAll();\n  res.json(users);\n}));\n\n// Custom error class\nclass AppError extends Error {\n  constructor(message, status) {\n    super(message);\n    this.status = status;\n  }\n}\n\napp.get('/api/users/:id', asyncHandler(async (req, res) => {\n  const user = await User.findById(req.params.id);\n  if (!user) throw new AppError('User not found', 404);\n  res.json(user);\n}));

Examples

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

// Wrapper for async route handlers
const asyncWrap = (fn) => (req, res, next) =>
  Promise.resolve(fn(req, res, next)).catch(next);

// Custom error class
class HttpError extends Error {
  constructor(status, message) {
    super(message);
    this.status = status;
  }
}

// Routes
app.get('/api/data', asyncWrap(async (req, res) => {
  const data = await simulateDbQuery();
  res.json(data);
}));

app.get('/api/error', asyncWrap(async (req, res) => {
  throw new HttpError(400, 'Bad request');
}));

// Error handler
app.use((err, req, res, next) => {
  const status = err.status || 500;
  const message = err.status ? err.message : 'Internal Server Error';
  
  if (!err.status) console.error('Unhandled:', err);
  
  res.status(status).json({
    error: message,
    ...(process.env.NODE_ENV === 'development' && { stack: err.stack }),
  });
});

function simulateDbQuery() {
  return new Promise(resolve =>
    setTimeout(() => resolve([{ id: 1, name: 'Sample' }]), 100)
  );
}

app.listen(3000);

Your Notes

Sign in to take notes for this lesson.

Quiz

Express.js Framework Quiz

0 questions

Sign in to take quiz

Discussion

Sign in to join the discussion.

Flashcards

Sign in to create flashcards.