️ DEPRECATED GITLAB INSTANCE ️ This GitLab is now read-only for reference. Please use https://gitlab.iauro.co for all new work.

Migration completed on September 17, 2025

Commit 6d664f81 authored by Vishal Dalvi's avatar Vishal Dalvi

Initial commit

parent 6b155e23
test
\ No newline at end of file
# Nodejs_CRUD
npm init <br>
npm install <br>
node server.js <br>
const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const userRoutes = require('./routes/userRoutes');
const path = require('path');
const { log } = require('console');
require('dotenv').config();
const app = express();
// Middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
// Serve static files
app.use(express.static('./public'));
// Routes
app.use('/api', userRoutes);
const uri = process.env.MONGO_URI;
// Connect to MongoDB
mongoose.connect(uri, {})
.then(() => console.log('Database connected successfully'))
.catch(err => console.error('Database connection error:', err));
module.exports = app;
const mongoose = require('mongoose');
const UserSchema = new mongoose.Schema({
name: {
type: String,
required: true
},
email: {
type: String,
required: true,
unique: true
},
password: {
type: String,
required: true
}
});
const User = mongoose.model('User', UserSchema);
module.exports = User;
This diff is collapsed.
{
"name": "crudapi",
"version": "1.0.0",
"description": "practice",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node server.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/arjundhav/CRUDAPI.git"
},
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/arjundhav/CRUDAPI/issues"
},
"homepage": "https://github.com/arjundhav/CRUDAPI#readme",
"dependencies": {
"body-parser": "^1.20.2",
"dotenv": "^16.4.5",
"express": "^4.19.2",
"mongoose": "^8.5.2",
"prom-client": "^15.1.3"
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Register User</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="#">Home</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="users.html">View Users</a>
</li>
</ul>
</div>
</nav>
<div class="container mt-5">
<h1>Register User</h1>
<form id="registerForm">
<div class="form-group">
<label for="name">Name:</label>
<input type="text" class="form-control" id="name" name="name" required>
</div>
<div class="form-group">
<label for="email">Email:</label>
<input type="email" class="form-control" id="email" name="email" required>
</div>
<div class="form-group">
<label for="password">Password:</label>
<input type="password" class="form-control" id="password" name="password" required>
</div>
<button type="submit" class="btn btn-primary">Register</button>
</form>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.3/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<script src="./view.js"></script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Users</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="styles.css">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="index.html">Home</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="#">View Users</a>
</li>
</ul>
</div>
</nav>
<div class="container mt-5">
<h1 class="mb-4">Users</h1>
<button class="btn btn-primary mb-3">
<a href="./index.html" class="text-white">Register New</a>
</button>
<table class="table table-striped">
<thead class="thead-dark">
<tr>
<th>Name</th>
<th>Email</th>
<th>Actions</th>
</tr>
</thead>
<tbody id="userTable">
<!-- User rows will be inserted here -->
</tbody>
</table>
</div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.5.4/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<script src="./view.js"></script>
</body>
</html>
document.addEventListener('DOMContentLoaded', () => {
if (document.getElementById('registerForm')) {
document.getElementById('registerForm').addEventListener('submit', async (event) => {
event.preventDefault();
const name = document.getElementById('name').value;
const email = document.getElementById('email').value;
const password = document.getElementById('password').value;
const response = await fetch('/api/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name, email, password })
});
if (response.ok) {
alert('User registered successfully!');
window.location.href = './users.html';
// document.getElementById('registerForm').reset();
} else {
alert('Error registering user');
}
});
}
if (document.getElementById('userTable')) {
const fetchUsers = async () => {
const response = await fetch('/api/users');
const users = await response.json();
const userTable = document.getElementById('userTable');
userTable.innerHTML = '';
users.forEach(user => {
const row = document.createElement('tr');
row.innerHTML = `
<td>${user.name}</td>
<td>${user.email}</td>
<td>
<button onclick="deleteUser('${user._id}')">Delete</button>
<button onclick="editUser('${user._id}')">Edit</button>
</td>
`;
userTable.appendChild(row);
});
};
fetchUsers();
}
});
const deleteUser = async (id) => {
const response = await fetch(`/api/users/${id}`, {
method: 'DELETE'
});
if (response.ok) {
alert('User deleted successfully!');
location.reload();
} else {
alert('Error deleting user');
}
};
const editUser = async (id) => {
const newName = prompt('Enter new name:');
const newEmail = prompt('Enter new email:');
if (newName && newEmail) {
const response = await fetch(`/api/users/${id}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name: newName, email: newEmail })
});
if (response.ok) {
alert('User updated successfully!');
location.reload();
} else {
alert('Error updating user');
}
}
};
const express = require('express');
const router = express.Router();
const User = require('../models/User');
// Create a new user
router.post('/register', async (req, res) => {
try {
const user = new User(req.body);
await user.save();
res.status(201).send(user);
} catch (error) {
res.status(400).send(error);
}
});
// Get all users
router.get('/users', async (req, res) => {
try {
const users = await User.find({});
res.status(200).send(users);
} catch (error) {
res.status(500).send(error);
}
});
// Update a user by ID
router.put('/users/:id', async (req, res) => {
try {
const user = await User.findByIdAndUpdate(req.params.id, req.body, { new: true, runValidators: true });
if (!user) {
return res.status(404).send();
}
res.send(user);
} catch (error) {
res.status(400).send(error);
}
});
// Delete a user by ID
router.delete('/users/:id', async (req, res) => {
try {
const user = await User.findByIdAndDelete(req.params.id);
if (!user) {
return res.status(404).send();
}
res.send(user);
} catch (error) {
res.status(500).send(error);
}
});
module.exports = router;
const app = require('./app');
const express = require('express');
const client = require('prom-client');
// Define the port to listen on
const PORT = process.env.PORT || 3000;
app.use(express.static('./public'));
// Prometheus Metrics
const collectDefaultMetrics = client.collectDefaultMetrics;
collectDefaultMetrics();
const counter = new client.Counter({
name: 'type_counter',
help: 'Any arbitrary value to help identify this counter',
});
const gauge = new client.Gauge({
name: 'type_gauge',
help: 'Any arbitrary value to help identify this gauge',
});
const histogram = new client.Histogram({
name: 'type_histogram',
help: 'Any arbitrary value to help identify this histogram',
});
const summary = new client.Summary({
name: 'type_summary',
help: 'Any arbitrary value to help identify this summary',
});
const metrics = {
counter,
gauge,
histogram,
summary
};
const handleCounterIncrement = (req, res) => {
metrics.counter.inc();
res.send({ message: 'Success' });
};
const handleCounterReset = (req, res) => {
metrics.counter.reset();
res.send({ message: 'Success' });
};
const handleGaugeIncrement = (req, res) => {
metrics.gauge.inc();
res.send({ message: 'Success' });
};
const handleGaugeDecrement = (req, res) => {
metrics.gauge.dec();
res.send({ message: 'Success' });
};
const handleGaugeSetValue = (req, res) => {
metrics.gauge.set(Number(req.params.value)); // Ensure value is a number
res.send({ message: 'Success' });
};
const handleHistogramValue = (req, res) => {
metrics.histogram.observe(Number(req.params.value)); // Ensure value is a number
res.send({ message: 'Success' });
};
const handleSummaryValue = (req, res) => {
metrics.summary.observe(Number(req.params.value)); // Ensure value is a number
res.send({ message: 'Success' });
};
// Define routes for metrics
const metricsRouter = express.Router();
metricsRouter.get('/counter/inc', handleCounterIncrement);
metricsRouter.get('/counter/reset', handleCounterReset);
metricsRouter.get('/gauge/inc', handleGaugeIncrement);
metricsRouter.get('/gauge/dec', handleGaugeDecrement);
metricsRouter.get('/gauge/set/:value', handleGaugeSetValue);
metricsRouter.get('/histogram/:value', handleHistogramValue);
metricsRouter.get('/summary/:value', handleSummaryValue);
// Use the router for Prometheus metrics routes
app.use('/prom', metricsRouter);
// Metrics endpoint
app.use('/metrics', async (req, res) => {
try {
res.set('Content-Type', client.register.contentType);
res.end(await client.register.metrics());
} catch (ex) {
res.status(500).end(ex);
}
});
//Route to index.html for /
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname, './public/index.html'));
});
// Make the server listen on the specified port
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment