Project Setup
bash
mkdir my-api && cd my-api
npm init -y
npm install express mongoose dotenv morgan cors
npm install -D nodemonServer Entry Point
javascript
// server.js
require("dotenv").config();
const express = require("express");
const mongoose = require("mongoose");
const cors = require("cors");
const morgan = require("morgan");
const app = express();
app.use(cors());
app.use(morgan("dev"));
app.use(express.json());
// Routes
app.use("/api/users", require("./routes/userRoutes"));
// Connect to DB and start
mongoose.connect(process.env.MONGODB_URI).then(() => {
app.listen(process.env.PORT || 5000, () =>
console.log("Server running on port", process.env.PORT || 5000)
);
});Mongoose Model
javascript
// models/User.js
const mongoose = require("mongoose");
const userSchema = new mongoose.Schema({
name: { type: String, required: true, minlength: 3 },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
role: { type: String, enum: ["user", "admin"], default: "user" },
}, { timestamps: true });
module.exports = mongoose.model("User", userSchema);REST Controller
javascript
// controllers/userController.js
const User = require("../models/User");
exports.getAllUsers = async (req, res) => {
try {
const { page = 1, limit = 10 } = req.query;
const users = await User.find()
.select("-password")
.limit(limit * 1)
.skip((page - 1) * limit)
.sort({ createdAt: -1 });
const total = await User.countDocuments();
res.json({
success: true,
data: users,
pagination: { page: +page, limit: +limit, total },
});
} catch (err) {
res.status(500).json({ success: false, message: err.message });
}
};Error Handling Middleware
javascript
// middleware/errorHandler.js
const errorHandler = (err, req, res, next) => {
const statusCode = err.statusCode || 500;
res.status(statusCode).json({
success: false,
message: err.message || "Server Error",
...(process.env.NODE_ENV === "development" && { stack: err.stack }),
});
};
module.exports = errorHandler;A well-structured API with proper error handling is what separates junior from senior developers.
Published by Sohail Code Academy
Share