Node.js
REST API
RESTful routing, Express Router, JSON responses, API versioning, CORS setup, and standard status codes in Node.js.
RESTful Route Structure: Standard CRUD routes using Express Router mapped to controller-style handler functions.
routes/users.js
JS
const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');
router.get('/', userController.index); // GET /users
router.post('/', userController.store); // POST /users
router.get('/:id', userController.show); // GET /users/:id
router.put('/:id', userController.update); // PUT /users/:id
router.delete('/:id', userController.destroy); // DELETE /users/:id
module.exports = router;
Express Router Mounting: Attach routers to the app with a base path prefix to organise routes cleanly.
app.js
JS
const express = require('express');
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// Mount routers
const userRoutes = require('./routes/users');
const productRoutes = require('./routes/products');
app.use('/users', userRoutes);
app.use('/products', productRoutes);
app.listen(3000, () => console.log('Server running on port 3000'));
JSON Response Pattern: Consistent API response wrapper with status, message, and data fields.
helpers/response.js
JS
// Helper functions
const ok = (res, data, message = 'Success') => res.status(200).json({ success: true, message, data });
const created = (res, data, message = 'Created') => res.status(201).json({ success: true, message, data });
const badReq = (res, message = 'Bad Request') => res.status(400).json({ success: false, message, data: null });
const notFound= (res, message = 'Not Found') => res.status(404).json({ success: false, message, data: null });
const serverErr=(res, message = 'Internal Error') => res.status(500).json({ success: false, message, data: null });
module.exports = { ok, created, badReq, notFound, serverErr };
// --- Usage in controller ---
// const R = require('../helpers/response');
// exports.show = async (req, res) => {
// const user = await User.findById(req.params.id);
// if (!user) return R.notFound(res, 'User not found');
// return R.ok(res, user);
// };
Common HTTP Status Codes: Quick reference for status codes used in REST APIs.
reference – status codes
JS
// 2xx – Success
res.status(200).json(data); // OK
res.status(201).json(data); // Created
res.status(204).send(); // No Content (e.g. delete)
// 4xx – Client Error
res.status(400).json({ message: 'Bad Request' });
res.status(401).json({ message: 'Unauthorized' });
res.status(403).json({ message: 'Forbidden' });
res.status(404).json({ message: 'Not Found' });
res.status(422).json({ message: 'Unprocessable Entity' });
// 5xx – Server Error
res.status(500).json({ message: 'Internal Server Error' });
res.status(503).json({ message: 'Service Unavailable' });
API Versioning with Prefix: Group routes under version prefixes (e.g.
/api/v1) for backward-compatible evolution.app.js – versioning
JS
const v1Users = require('./routes/v1/users');
const v1Products = require('./routes/v1/products');
const v2Users = require('./routes/v2/users');
// Version 1
app.use('/api/v1/users', v1Users);
app.use('/api/v1/products', v1Products);
// Version 2 (new implementation)
app.use('/api/v2/users', v2Users);
// Or use a router to group them
const v1 = express.Router();
v1.use('/users', v1Users);
v1.use('/products', v1Products);
app.use('/api/v1', v1);
CORS Setup with
cors package: Configure Cross-Origin Resource Sharing to allow specific origins, methods, and headers. Install with npm install cors.app.js – CORS
JS
const cors = require('cors');
// Allow all origins (development only)
app.use(cors());
// Restrict to specific origins (production)
const corsOptions = {
origin: ['https://myapp.com', 'https://admin.myapp.com'],
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
allowedHeaders: ['Content-Type', 'Authorization'],
credentials: true, // allow cookies / auth headers
optionsSuccessStatus: 200,
};
app.use(cors(corsOptions));
// Apply CORS only to API routes
app.use('/api', cors(corsOptions), apiRouter);