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-docs
to 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)