DEV Community

Rameez Kureshi
Rameez Kureshi

Posted on

Building a Clean REST API with Node.js and Express

Building REST APIs is one of the most practical skills in backend development. Here’s a clean, minimal approach using Node.js and Express that I use as my starting point for most projects.

Setup
bash
mkdir rest-api && cd rest-api
npm init -y
npm install express

Project Structure
rest-api/
├── server.js
├── routes/
│ └── users.js
└── middleware/
└── errorHandler.js

Test Server
const express = require('express');
const userRoutes = require('./routes/users');
const errorHandler = require('./middleware/errorHandler');

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

app.use(express.json());
app.use('/api/users', userRoutes);
app.use(errorHandler);

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

Routes with Validation
const express = require('express');
const router = express.Router();

let users = [];
let nextId = 1;

router.get('/', (req, res) => {
const { role } = req.query;
const filtered = role
? users.filter(u => u.role === role)
: users;
res.json(filtered);
});

router.get('/: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);
});

router.post('/', (req, res) => {
const { name, email, role } = req.body;
if (!name || !email) {
return res.status(400).json({ error: 'Name and email are required' });
}
const user = { id: nextId++, name, email, role: role || 'user' };
users.push(user);
res.status(201).json(user);
});

router.put('/: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' });
Object.assign(user, req.body);
res.json(user);
});

router.delete('/: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();
});

module.exports = router;

Error Handling Middleware
const errorHandler = (err, req, res, next) => {
console.error(err.stack);
res.status(err.status || 500).json({
error: err.message || 'Internal server error'
});
};

module.exports = errorHandler;

Top comments (0)