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);