0
0
ExpressHow-ToBeginner · 4 min read

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 /items to create
    • GET /items to read all
    • GET /items/:id to read one
    • PUT /items/:id to update
    • DELETE /items/:id to 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, so req.body is 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:

OperationMongoose MethodDescription
Createnew Model(data).save()Create and save a new document
Read AllModel.find()Get all documents
Read OneModel.findById(id)Get one document by ID
UpdateModel.findByIdAndUpdate(id, data, { new: true })Update document by ID and return updated
DeleteModel.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.