How to Create CRUD with Mongoose and Express Easily
To create CRUD operations with
mongoose and express, define a Mongoose model for your data, then set up Express routes for Create, Read, Update, and Delete actions using async functions. Use express.json() middleware to parse JSON requests and handle database operations with Mongoose methods like save(), find(), findByIdAndUpdate(), and findByIdAndDelete().Syntax
Here is the basic syntax pattern for CRUD with Mongoose and Express:
- Model: Define a Mongoose schema and model for your data.
- Middleware: Use
express.json()to parse JSON request bodies. - Routes: Create Express routes for each CRUD operation:
POST /itemsto createGET /itemsto read allGET /items/:idto read onePUT /items/:idto updateDELETE /items/:idto delete
javascript
import express from 'express'; import mongoose from 'mongoose'; const app = express(); app.use(express.json()); const itemSchema = new mongoose.Schema({ name: String }); const Item = mongoose.model('Item', itemSchema); // Create app.post('/items', async (req, res) => { const item = new Item(req.body); await item.save(); res.status(201).json(item); }); // Read all app.get('/items', async (req, res) => { const items = await Item.find(); res.json(items); }); // Read one app.get('/items/:id', async (req, res) => { const item = await Item.findById(req.params.id); if (!item) return res.status(404).send('Not found'); res.json(item); }); // Update app.put('/items/:id', async (req, res) => { const item = await Item.findByIdAndUpdate(req.params.id, req.body, { new: true }); if (!item) return res.status(404).send('Not found'); res.json(item); }); // Delete app.delete('/items/:id', async (req, res) => { const item = await Item.findByIdAndDelete(req.params.id); if (!item) return res.status(404).send('Not found'); res.sendStatus(204); });
Example
This example shows a complete Express server with Mongoose CRUD for a simple Item model with a name field. It connects to MongoDB, listens on port 3000, and supports creating, reading, updating, and deleting items.
javascript
import express from 'express'; import mongoose from 'mongoose'; const app = express(); app.use(express.json()); mongoose.connect('mongodb://localhost:27017/testdb', { useNewUrlParser: true, useUnifiedTopology: true }).then(() => console.log('Connected to MongoDB')) .catch(err => console.error('MongoDB connection error:', err)); const itemSchema = new mongoose.Schema({ name: String }); const Item = mongoose.model('Item', itemSchema); app.post('/items', async (req, res) => { try { const item = new Item(req.body); await item.save(); res.status(201).json(item); } catch (err) { res.status(400).json({ error: err.message }); } }); app.get('/items', async (req, res) => { const items = await Item.find(); res.json(items); }); app.get('/items/:id', async (req, res) => { try { const item = await Item.findById(req.params.id); if (!item) return res.status(404).send('Item not found'); res.json(item); } catch { res.status(400).send('Invalid ID'); } }); app.put('/items/:id', async (req, res) => { try { const item = await Item.findByIdAndUpdate(req.params.id, req.body, { new: true }); if (!item) return res.status(404).send('Item not found'); res.json(item); } catch { res.status(400).send('Invalid ID'); } }); app.delete('/items/:id', async (req, res) => { try { const item = await Item.findByIdAndDelete(req.params.id); if (!item) return res.status(404).send('Item not found'); res.sendStatus(204); } catch { res.status(400).send('Invalid ID'); } }); app.listen(3000, () => console.log('Server running on http://localhost:3000'));
Output
Connected to MongoDB
Server running on http://localhost:3000
Common Pitfalls
Common mistakes when creating CRUD with Mongoose and Express include:
- Not using
express.json()middleware, soreq.bodyis undefined. - Not handling errors or invalid MongoDB IDs, causing server crashes.
- Forgetting to await async Mongoose calls, leading to unexpected behavior.
- Not returning proper HTTP status codes (e.g., 404 for not found, 201 for created).
Always validate input and handle exceptions to keep your API stable.
javascript
/* Wrong: Missing express.json() middleware */ app.post('/items', async (req, res) => { // req.body will be undefined const item = new Item(req.body); await item.save(); res.status(201).json(item); }); /* Right: Use express.json() middleware */ app.use(express.json()); app.post('/items', async (req, res) => { const item = new Item(req.body); await item.save(); res.status(201).json(item); });
Quick Reference
Here is a quick summary of Mongoose methods used for CRUD:
| Operation | Mongoose Method | Description |
|---|---|---|
| Create | new Model(data).save() | Create and save a new document |
| Read All | Model.find() | Get all documents |
| Read One | Model.findById(id) | Get one document by ID |
| Update | Model.findByIdAndUpdate(id, data, { new: true }) | Update document by ID and return updated |
| Delete | Model.findByIdAndDelete(id) | Delete document by ID |
Key Takeaways
Use express.json() middleware to parse JSON request bodies.
Define a Mongoose schema and model to represent your data.
Use async/await with Mongoose methods for database operations.
Handle errors and invalid IDs to avoid crashes.
Return proper HTTP status codes for each CRUD action.