Open In App

Health Tracker App Backend Using Node and Express.js

Last Updated : 14 Mar, 2024
Improve
Improve
Like Article
Like
Save
Share
Report

A Health Tracker App is a platform that allows users to log and monitor various data of their health and fitness. In this article, we are going to develop a Health Tracker App with Node.js and Express.js. that allows users to track their health-related activities such as exercise, meals, water intake, and sleep.

Prerequisites:

Approach to create Health Tracker App Backend:

  • User authentication (signup, login)
  • CRUD operations for health activities (create, read, update, delete)
  • Users can do the following things with this Health Tracker App:
    • Create a Health Activity
    • Modify Health Activity
    • Track Health Activity
    • Delete Health Activity

Steps to create Health-Tracker App

Step 1: Create the project folder using the following command.

mkdir health-tracker

Step 2: Initialize the Node application using the following command.

npm init -y

Step 3: Install the required dependencies.

npm install express dotenv mongoose

The updated Dependencies in package.json file will look like:

"dependencies": {
"dotenv": "^16.4.5",
"express": "^4.18.3",
"mongoose": "^8.2.0"
}

Project Structure:

Screenshot-2024-03-03-154146

project structure

Code Example: Create the required files as shown in folder structure and the following codes.

Javascript
// server.js

const express = require("express");
const app = express();
const dotenv = require("dotenv");
const mongoose = require("mongoose");
const authRoutes = require("./routes/authRoutes.js");
const healthRoutes = require("./routes/healthRoutes.js");

dotenv.config();
const PORT = 4000;

app.use(express.json());

app.use("/auth", authRoutes);
app.use("/health", healthRoutes);

mongoose
    .connect("mongodb://localhost:27017/healthTrackerDB", {
        useNewUrlParser: true,
        useUnifiedTopology: true,
    })
    .then(() => {
        console.log("Connected to MongoDB");
    })
    .catch((err) => {
        console.error("Error connecting to MongoDB:", err);
    });

app.listen(PORT, (req, res) => {
    console.log("App Started on PORT:", PORT);
});
Javascript
//models/HealthActivity.js

const mongoose = require("mongoose");

const healthActivitySchema = new mongoose.Schema({
    userId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User",
        required: true,
    },
    activityType: {
        type: String,
        enum: ["exercise", "meal", "water intake", "sleep"],
        required: true,
    },
    description: {
        type: String,
        required: true,
    },
    duration: {
        type: Number,
    },
    calories: {
        type: Number,
    },
    createdAt: {
        type: Date,
        default: Date.now,
    },
});

const HealthActivity = mongoose.model("HealthActivity",
                                       healthActivitySchema);

module.exports = HealthActivity;
Javascript
//models/HealthActivity.js

const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
    username: {
        type: String,
        required: true,
        unique: true,
    },
    email: {
        type: String,
        required: true,
        unique: true,
    },
    password: {
        type: String,
        required: true,
    },
});

const User = mongoose.model("User", userSchema);

module.exports = User;
Javascript
//controller/authController.js

const User = require("../models/User");

exports.signup = async (req, res) => {
    try {
        const { username, email, password } = req.body;
        const user = await User.create({ username, email, password });
        res.status(201).json({ success: true, user });
    } catch (error) {
        res.status(400).json({ success: false, message: error.message});
    }
};

exports.login = async (req, res) => {
    try {
        const { email, password } = req.body;
        const user = await User.findOne({ email });
        if (!user) {
            return res
                .status(404)
                .json({ success: false, message: "User not found" });
        }
        if (user.password !== password) {
            return res
                .status(401)
                .json({success:false,message: "Incorrect password" });
        }
        // Passwords match
        res.status(200).json({success:true,message:"Login successful"});
    } catch (error) {
        res.status(400).json({success:false,message:error.message});
    }
};
Javascript
//controller/healthController.js

const HealthActivity = require("../models/HealthActivity");

exports.createActivity = async (req, res) => {
    try {
        const { userId, 
                activityType, 
                description, 
                duration, 
                calories } = req.body;
        const activity = await HealthActivity.create({
            userId,
            activityType,
            description,
            duration,
            calories,
        });
        res.status(201).json({ success: true, activity });
    } catch (error) {
        res.status(400).json({ success: false, message: error.message});
    }
};

exports.getActivity = async (req, res) => {
    try {
        const activity = await HealthActivity.findById(req.params.id);
        if (!activity) {
            return res
                .status(404)
                .json({ success: false, message: "Activity not found"});
        }
        res.status(200).json({ success: true, activity });
    } catch (error) {
        res.status(400).json({ success: false, message: error.message});
    }
};

exports.updateActivity = async (req, res) => {
    try {
        const { userId, 
                activityType, 
                description, 
                duration, 
                calories } = req.body;
        const activity = await HealthActivity.findByIdAndUpdate(
            req.params.id,
            { userId, activityType, description, duration, calories},
            { new: true }
        );
        if (!activity) {
            return res
                .status(404)
                .json({ success: false, message: "Activity not found"});
        }
        res.status(200).json({ success: true, activity });
    } catch (error) {
        res.status(400).json({ success: false, message: error.message});
    }
};

exports.deleteActivity = async (req, res) => {
    try {
        const activity = await HealthActivity
                                    .findByIdAndDelete(req.params.id);
        if (!activity) {
            return res
                .status(404)
                .json({ success: false, message: "Activity not found"});
        }
        res
            .status(200)
            .json({ success: true,
                    message: "Activity deleted successfully" });
    } catch (error) {
        res.status(400).json({ success: false, message: error.message});
    }
};
Javascript
//routes/authRoutes.js

const express = require("express");
const router = express.Router();
const authController = require("../controllers/authController");

router.post("/signup", authController.signup);
router.post("/login", authController.login);

module.exports = router;
Javascript
//routes/healthRoutes.js

const express = require("express");
const router = express.Router();
const healthController = require("../controllers/healthController");

router.post("/activity", healthController.createActivity);

router.get("/activity/:id", healthController.getActivity);

router.put("/activity/:id", healthController.updateActivity);

router.delete("/activity/:id", healthController.deleteActivity);

module.exports = router;

Output:

h1

Health Tracker App with Node.js and Express.js



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads