Task 9: Working with Express & MongoDB to create an Express server with CRUD endpoints for a Users collection using Mongoose.

---

✅ Step 1: Project Setup

mkdir express-mongo-users
cd express-mongo-users
npm init -y
npm install express mongoose dotenv

✅ Step 2: Folder Structure

express-mongo-users/
├── models/
│   └── User.js
├── routes/
│   └── userRoutes.js
├── .env
├── server.js

✅ Step 3: Create .env File

PORT=5000
MONGO_URI=mongodb://localhost:27017/yourdbname

> Replace yourdbname with your actual MongoDB database name.

✅ Step 4: Mongoose User Model – models/User.js

const mongoose = require('mongoose');

const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    required: true,
    unique: true,
  },
  age: Number
}, { timestamps: true });

module.exports = mongoose.model('User', userSchema);

✅ Step 5: User Routes – routes/userRoutes.js

const express = require('express');
const router = express.Router();
const User = require('../models/User');

// Create User
router.post('/', async (req, res) => {
  try {
    const user = await User.create(req.body);
    res.status(201).json(user);
  } catch (err) {
    res.status(400).json({ error: err.message });
  }
});

// Get All Users
router.get('/', async (req, res) => {
  const users = await User.find();
  res.json(users);
});

// Get Single User
router.get('/:id', async (req, res) => {
  try {
    const user = await User.findById(req.params.id);
    if (!user) return res.status(404).json({ error: 'User not found' });
    res.json(user);
  } catch (err) {
    res.status(400).json({ error: err.message });
  }
});

// Update User
router.put('/:id', async (req, res) => {
  try {
    const user = await User.findByIdAndUpdate(req.params.id, req.body, { new: true });
    if (!user) return res.status(404).json({ error: 'User not found' });
    res.json(user);
  } catch (err) {
    res.status(400).json({ error: err.message });
  }
});

// Delete User
router.delete('/:id', async (req, res) => {
  try {
    const result = await User.findByIdAndDelete(req.params.id);
    if (!result) return res.status(404).json({ error: 'User not found' });
    res.json({ message: 'User deleted successfully' });
  } catch (err) {
    res.status(400).json({ error: err.message });
  }
});

module.exports = router;

✅ Step 6: Server File – server.js

const express = require('express');
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const userRoutes = require('./routes/userRoutes');

dotenv.config();

const app = express();
app.use(express.json());

// Connect to MongoDB
mongoose.connect(process.env.MONGO_URI, {
  useNewUrlParser: true,
  useUnifiedTopology: true
})
.then(() => console.log('MongoDB connected'))
.catch((err) => console.error('MongoDB connection error:', err));

// Routes
app.use('/api/users', userRoutes);

const PORT = process.env.PORT || 5000;
app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

✅ Step 7: Run the Server
node server.js

✅ Sample API Endpoints (use Postman or curl):
POST   /api/users – Create a user
GET    /api/users – Get all users
GET    /api/users/:id – Get user by ID
PUT    /api/users/:id – Update user
DELETE /api/users/:id – Delete user