How to Organize Express App: Best Practices and Structure
Express app, separate concerns by creating folders for routes, controllers, and middleware. Use a main app.js to set up middleware and route imports, keeping code clean and maintainable.Syntax
An organized Express app typically has a main app.js file that imports middleware and routes. Routes are defined in separate files inside a routes folder. Controllers handle the logic and live in a controllers folder. Middleware functions are placed in a middleware folder.
This separation helps keep code easy to read and maintain.
const express = require('express'); const app = express(); // Middleware import const logger = require('./middleware/logger'); // Routes import const userRoutes = require('./routes/users'); app.use(express.json()); app.use(logger); app.use('/users', userRoutes); app.listen(3000, () => console.log('Server running on port 3000'));
Example
This example shows a simple Express app organized with separate folders for routes, controllers, and middleware. The app.js file sets up the server, middleware, and routes.
// app.js const express = require('express'); const app = express(); const logger = require('./middleware/logger'); const userRoutes = require('./routes/users'); app.use(express.json()); app.use(logger); app.use('/users', userRoutes); app.listen(3000, () => console.log('Server running on port 3000')); // middleware/logger.js module.exports = function (req, res, next) { console.log(`${req.method} ${req.url}`); next(); }; // routes/users.js const express = require('express'); const router = express.Router(); const userController = require('../controllers/userController'); router.get('/', userController.getAllUsers); router.post('/', userController.createUser); module.exports = router; // controllers/userController.js const users = []; exports.getAllUsers = (req, res) => { res.json(users); }; exports.createUser = (req, res) => { const user = req.body; users.push(user); res.status(201).json(user); };
Common Pitfalls
Common mistakes include putting all code in app.js, which makes the app hard to maintain. Another pitfall is mixing route definitions and business logic in the same file instead of separating controllers. Forgetting to use express.json() middleware causes issues parsing JSON requests.
// Wrong: All code in app.js const express = require('express'); const app = express(); app.get('/users', (req, res) => { res.json([]); }); app.listen(3000); // Right: Separate routes and controllers // routes/users.js const express = require('express'); const router = express.Router(); const userController = require('../controllers/userController'); router.get('/', userController.getAllUsers); module.exports = router;
Quick Reference
- app.js: Setup server, middleware, and route imports.
- routes/: Define URL paths and link to controllers.
- controllers/: Handle request logic and responses.
- middleware/: Custom functions for request processing.
- Use
express.json()to parse JSON bodies. - Keep files small and focused on one task.
Key Takeaways
app.js focused on setup and importing modules only.express.json() to handle request parsing.