Health Tracker App Backend Using Node and Express.js
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:
Code Example: Create the required files as shown in folder structure and the following codes.
// 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);
});
//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;
//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;
//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});
}
};
//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});
}
};
//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;
//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:
Contact Us