In this blog, we'll walk through creating a simple CRUD (Create, Read, Update, Delete) application using Express.js, MongoDB, and Swagger for API documentation. This guide will help you understand the basics of setting up a RESTful API with these technologies.
Prerequisites
Before we start, make sure you have the following installed:
- Node.js and npm (Node Package Manager)
 - MongoDB (You can use a local instance or a cloud service like MongoDB Atlas)
 
Project Setup
- Initialize the Project: Create a new directory for your project and initialize it with npm.
 
   mkdir express-sample-crud
   cd express-sample-crud
   npm init -y
- Install Dependencies: Install the necessary packages for your project.
 
   npm install express mongoose body-parser cors dotenv swagger-jsdoc swagger-ui-express
Project Structure
Here's a brief overview of the project structure:
express-sample-crud/
│
├── config/
│   ├── db.js
│   └── swagger.js
│
├── controllers/
│   └── userController.js
│
├── models/
│   └── userModel.js
│
├── routes/
│   └── userRoutes.js
│
├── my-express-app/
│   ├── .env
│   └── app.js
│
└── package.json
Step-by-Step Guide
1. Database Configuration
Create a db.js file in the config directory to set up the MongoDB connection.
const mongoose = require("mongoose");
const dotenv = require("dotenv");
dotenv.config();
const connectDB = async () => {
  try {
    await mongoose.connect(process.env.MONGO_URI, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
    console.log("MongoDB connected");
  } catch (err) {
    console.error(err.message);
    process.exit(1);
  }
};
module.exports = connectDB;
2. Swagger Configuration
Create a swagger.js file in the config directory to set up Swagger for API documentation.
const swaggerJsdoc = require("swagger-jsdoc");
const swaggerUi = require("swagger-ui-express");
const options = {
  definition: {
    openapi: "3.0.0",
    info: {
      title: "My Express API",
      version: "1.0.0",
      description: "A simple Express API with CRUD operations",
    },
    servers: [
      {
        url: "http://localhost:5000",
      },
    ],
  },
  apis: ["./routes/*.js"],
};
const specs = swaggerJsdoc(options);
module.exports = (app) => {
  app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(specs));
};
3. User Model
Create a userModel.js file in the models directory to define the User schema.
const mongoose = require("mongoose");
const UserSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    required: true,
    unique: true,
  },
  password: {
    type: String,
    required: true,
  },
});
module.exports = mongoose.model("User", UserSchema);
4. User Controller
Create a userController.js file in the controllers directory to handle the CRUD operations.
const User = require("../models/userModel");
exports.getUsers = async (req, res) => {
  try {
    const users = await User.find();
    res.json(users);
  } catch (err) {
    res.status(500).json({ message: err.message });
  }
};
exports.createUser = async (req, res) => {
  const { name, email, password } = req.body;
  try {
    const newUser = new User({ name, email, password });
    await newUser.save();
    res.status(201).json(newUser);
  } catch (err) {
    res.status(400).json({ message: err.message });
  }
};
exports.updateUser = async (req, res) => {
  const { id } = req.params;
  const { name, email, password } = req.body;
  try {
    const user = await User.findByIdAndUpdate(
      id,
      { name, email, password },
      { new: true }
    );
    if (!user) {
      return res.status(404).json({ message: "User not found" });
    }
    res.json(user);
  } catch (err) {
    res.status(400).json({ message: err.message });
  }
};
exports.deleteUser = async (req, res) => {
  const { id } = req.params;
  try {
    const user = await User.findByIdAndDelete(id);
    if (!user) {
      return res.status(404).json({ message: "User not found" });
    }
    res.json({ message: "User deleted successfully" });
  } catch (err) {
    res.status(500).json({ message: err.message });
  }
};
5. User Routes
Create a userRoutes.js file in the routes directory to define the API endpoints.
const express = require("express");
const {
  getUsers,
  createUser,
  updateUser,
  deleteUser,
} = require("../controllers/userController");
const router = express.Router();
/**
 * @swagger
 * components:
 *   schemas:
 *     User:
 *       type: object
 *       required:
 *         - name
 *         - email
 *         - password
 *       properties:
 *         name:
 *           type: string
 *           description: The user's name
 *         email:
 *           type: string
 *           description: The user's email
 *         password:
 *           type: string
 *           description: The user's password
 *       example:
 *         name: John Doe
 *         email: john.doe@example.com
 *         password: password123
 */
/**
 * @swagger
 * /api/users:
 *   get:
 *     summary: Get all users
 *     responses:
 *       200:
 *         description: A list of users
 *         content:
 *           application/json:
 *             schema:
 *               type: array
 *               items:
 *                 $ref: '#/components/schemas/User'
 */
router.get("/users", getUsers);
/**
 * @swagger
 * /api/users:
 *   post:
 *     summary: Create a new user
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             $ref: '#/components/schemas/User'
 *     responses:
 *       201:
 *         description: The created user
 *         content:
 *           application/json:
 *             schema:
 *               $ref: '#/components/schemas/User'
 *       400:
 *         description: Invalid input
 */
router.post("/users", createUser);
/**
 * @swagger
 * /api/users/{id}:
 *   put:
 *     summary: Update a user
 *     parameters:
 *       - in: path
 *         name: id
 *         schema:
 *           type: string
 *         required: true
 *         description: The user ID
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             $ref: '#/components/schemas/User'
 *     responses:
 *       200:
 *         description: The updated user
 *         content:
 *           application/json:
 *             schema:
 *               $ref: '#/components/schemas/User'
 *       404:
 *         description: User not found
 */
router.put("/users/:id", updateUser);
/**
 * @swagger
 * /api/users/{id}:
 *   delete:
 *     summary: Delete a user
 *     parameters:
 *       - in: path
 *         name: id
 *         schema:
 *           type: string
 *         required: true
 *         description: The user ID
 *     responses:
 *       200:
 *         description: User deleted successfully
 *       404:
 *         description: User not found
 */
router.delete("/users/:id", deleteUser);
module.exports = router;
6. Environment Variables
Create a .env file in the my-express-app directory to store environment variables.
MONGO_URI=mongodb://localhost:27017/express_crud
PORT=5000
7. Main Application File
Create an app.js file in the my-express-app directory to set up the Express application.
const express = require("express");
const bodyParser = require("body-parser");
const cors = require("cors");
const dotenv = require("dotenv");
const connectDB = require("./config/db");
const userRoutes = require("./routes/userRoutes");
const swaggerSetup = require("./config/swagger");
dotenv.config();
const app = express();
// Connect to MongoDB
connectDB();
// Middleware
app.use(bodyParser.json());
app.use(cors());
// Routes
app.use("/api", userRoutes);
// Swagger setup
swaggerSetup(app);
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
8. Package Configuration
Update your package.json file to include the necessary scripts and dependencies.
{
  "name": "express-sample-crud",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": "",
  "dependencies": {
    "body-parser": "^1.20.3",
    "cors": "^2.8.5",
    "dotenv": "^16.4.7",
    "express": "^4.21.2",
    "mongoose": "^8.11.0",
    "swagger-jsdoc": "^6.2.8",
    "swagger-ui-express": "^5.0.1"
  }
}
Running the Application
- Start your MongoDB server.
 - Run the application using the following command:
 
   node app.js
- Open your browser and navigate to 
http://localhost:5000/api-docsto view the Swagger API documentation. 
Conclusion
You've successfully created a CRUD application using Express.js, MongoDB, and Swagger. This setup provides a solid foundation for building more complex applications.
Don't forget to follow me on GitHub for more projects and updates: My GitHub Profile
You can find the source code for this project on GitHub: Express + MongoDB + Swagger CRUD Sample
    
Top comments (0)