Project 1: Task Tracker with Node.js + MongoDB

Project 1: Task Tracker with Node.js + MongoDB

In this project, you'll build a basic task tracker using Node.js and MongoDB. This real-world app helps you understand how to connect to a MongoDB database, design a schema, and implement CRUD operations in a Node.js environment.

What We'll Build

A minimal task manager that lets users:

  • Add a task
  • View all tasks
  • Mark a task as complete
  • Delete a task

Step 1: Initialize the Project

Create a new directory and initialize a Node.js project:

    mkdir task-tracker
    cd task-tracker
    npm init -y

Install the required packages:

    npm install express mongoose body-parser nodemon

Step 2: Create Project Structure

Set up your file structure like this:

    task-tracker/
    ├── models/
    │   └── Task.js
    ├── routes/
    │   └── tasks.js
    ├── server.js

Step 3: Connect to MongoDB

Edit server.js to set up Express and connect to MongoDB:


// server.js
const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const taskRoutes = require('./routes/tasks');

const app = express();
app.use(bodyParser.json());
app.use('/api/tasks', taskRoutes);

mongoose.connect('mongodb://localhost:27017/taskdb', {
  useNewUrlParser: true,
  useUnifiedTopology: true
}).then(() => {
  console.log('Connected to MongoDB');
  app.listen(3000, () => console.log('Server running on port 3000'));
}).catch(err => console.error(err));
    Connected to MongoDB
    Server running on port 3000

Step 4: Define the Task Model

Create the file models/Task.js:


// models/Task.js
const mongoose = require('mongoose');

const TaskSchema = new mongoose.Schema({
  title: {
    type: String,
    required: true
  },
  completed: {
    type: Boolean,
    default: false
  }
});

module.exports = mongoose.model('Task', TaskSchema);

Q: Why use a schema if MongoDB is schema-less?

A: While MongoDB itself is flexible, using Mongoose schemas helps enforce structure and validation within our application logic.

Step 5: Create the Task Routes

Create routes/tasks.js to define all task-related routes:


// routes/tasks.js
const express = require('express');
const router = express.Router();
const Task = require('../models/Task');

// Add new task
router.post('/', async (req, res) => {
  try {
    const task = new Task({ title: req.body.title });
    await task.save();
    res.status(201).json(task);
  } catch (err) {
    res.status(400).json({ error: err.message });
  }
});

// Get all tasks
router.get('/', async (req, res) => {
  const tasks = await Task.find();
  res.json(tasks);
});

// Update task (mark as complete)
router.put('/:id', async (req, res) => {
  try {
    const task = await Task.findByIdAndUpdate(
      req.params.id,
      { completed: true },
      { new: true }
    );
    res.json(task);
  } catch (err) {
    res.status(400).json({ error: err.message });
  }
});

// Delete task
router.delete('/:id', async (req, res) => {
  try {
    await Task.findByIdAndDelete(req.params.id);
    res.json({ message: 'Task deleted' });
  } catch (err) {
    res.status(400).json({ error: err.message });
  }
});

module.exports = router;

Step 6: Run and Test the API

Start the server with nodemon:

    npx nodemon server.js

Use Postman or cURL to test the endpoints:

POST /api/tasks — Add a task

    curl -X POST http://localhost:3000/api/tasks -H "Content-Type: application/json" -d '{"meta_title": "Learn MongoDB"}'
    {
      "_id": "664218c0a83dfb31c5ebd511",
      "meta_title": "Learn MongoDB",
      "completed": false,
      "__v": 0
    }

GET /api/tasks — Get all tasks

    curl http://localhost:3000/api/tasks

PUT /api/tasks/:id — Mark task as completed

DELETE /api/tasks/:id — Delete a task

Conclusion

You've successfully created a full CRUD application using Node.js and MongoDB. This task tracker taught you how to structure a backend app, use Mongoose for schema modeling, and interact with a database through API endpoints.

In the next project, we'll expand this knowledge by building a blog platform using Express and MongoDB with advanced features like user management and pagination.

Srinivas Namala, author
About the author

Srinivas Namala

Software Engineer

Srinivas focuses on backend development, databases, systems, and the technologies used to build reliable server-side applications.

View LinkedIn profile ↗