https://expressjs.com/
Express JS
Fast, unopinionated, minimalist web framework for Node.js
Install
$ npm install express --savev PS C:\nodeproject> npm install express --save
https://expressjs.com/en/starter/hello-world.html
mysql
$ npm install mysql
PS C:\nodeproject>npm install mysql
cors
CORS is a node.js package for providing a Connect/Express middleware that can be used to enable CORS with various options.
https://www.npmjs.com/package/cors
PS C:\nodeproject>npm i cors
bcrypt
https://www.npmjs.com/package/bcrypt
A library to help you hash passwords.
npm install bcrypt
run PS C:\nodeproject> node index.js
index.js
//index.js
const express = require('express')
const bodyParser = require('body-parser');
const cors = require('cors');
const bycrypt = require('bcrypt'); //npm install bcrypt
const db = require('./db');
const app = express()
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors({
origin: 'http://localhost:3000',
credentials: true
}));
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.post("/api/adduser", async (req, res) => {
const sql ="INSERT INTO users (name,email,username,password) VALUES (?, ?, ?, ?)";
const hashedPassword = await bycrypt.hash(req.body.password, 10);
const values = [req.body.name, req.body.email, req.body.username, hashedPassword];
db.query(sql, values, (err, result) => {
if (err)
return res.json({ message: "Something unexpected has occured" + err });
return res.json({ success: "New User added successfully" });
});
});
app.get("/api/users", (req, res) => {
const sql = "SELECT * FROM users";
db.query(sql, (err, result) => {
if (err) res.json({ message: "Server error" });
return res.json(result);
});
});
app.get("/api/getuser/:id", (req, res) => {
const id = req.params.id;
const sql = "SELECT * FROM users WHERE id= ?";
db.query(sql, [id], (err, result) => {
if (err) res.json({ message: "Server error" });
return res.json(result);
});
});
app.put("/api/edit/:id", async (req, res) => {
const id = req.params.id;
const sql ="UPDATE users SET name=?, email=?, username=? WHERE id=?";
const values = [
req.body.name,
req.body.email,
req.body.username,
id,
];
db.query(sql, values, (err, result) => {
if (err)
return res.json({ message: "Something unexpected has occured" + err });
return res.json({ success: "User updated successfully" });
});
});
app.delete("/api/delete/:id", (req, res) => {
const id = req.params.id;
const sql = "DELETE FROM users WHERE id=?";
const values = [id];
db.query(sql, values, (err, result) => {
if (err)
return res.json({ message: "Something unexpected has occured" + err });
return res.json({ success: "Student successfully Deleted" });
});
});
app.listen(3001, () => {console.log('Server started on port 3001')});
db.js
//db.js
const mysql = require("mysql");
const db = mysql.createPool({
socketPath: '/Applications/MAMP/tmp/mysql/mysql.sock',
connectionLimit: 10,
host: "localhost",
user: "root",
password: "root",
database: "nodeexpressDB"
});
// Ping database to check for common exception errors.
db.getConnection((err, connection) => {
if (err) {
if (err.code === 'PROTOCOL_CONNECTION_LOST') {
console.error('Database connection was closed.');
}
if (err.code === 'ER_CON_COUNT_ERROR') {
console.error('Database has too many connections.');
}
if (err.code === 'ECONNREFUSED') {
console.error('Database connection was refused.');
}
}
if (connection) connection.release();
return;
});
module.exports = db;
Next.js Install requirements
npm install axios
https://www.npmjs.com/package/axios
app\page.js
//app\page.js
import ListUser from '@/components/ListUser'
import { Suspense } from "react";
import Link from "next/link";
export default function Home() {
return (
<div className="w-screen py-20 flex justify-center flex-col items-center">
<div className="flex items-center justify-between gap-1 mb-5">
<h1 className="text-4xl font-bold">Next.js 14 Node Express CRUD (Create Read Update and Delete) | MySQL</h1>
</div>
<div className="overflow-x-auto">
<div className="mb-2 w-full text-right">
<Link
href="/users/create"
className="btn btn-primary">
Add New User
</Link>
</div>
<Suspense fallback="Loading...">
<ListUser/>
</Suspense>
</div>
</div>
);
}
app\users\create\page.jsx
//app\users\create\page.jsx
"use client";
import React, { useState } from "react";
import axios from 'axios' //npm install axios https://www.npmjs.com/package/axios
import { useRouter } from 'next/navigation';
const Addnewuser = () => {
const [inputs, setInputs] = useState([]);
const handleChange = (event) => {
const name = event.target.name;
const value = event.target.value;
setInputs(values => ({...values, [name]: value}));
}
const router = useRouter();
const handleSubmit = (event) => {
event.preventDefault();
axios.post('http://localhost:3001/api/adduser', inputs).then(function(response){
console.log(response.data);
router.push('/')
});
}
return (
<div className="max-w-md mx-auto mt-5">
<h1 className="text-2xl text-center mb-2">Add New User</h1>
<div>
<form onSubmit={handleSubmit}>
<div className="mb-5">
<label htmlFor="name" className="block text-sm font-medium text-gray-900">
Name
</label>
<input
type="text"
name="name"
id="name"
className="input input-bordered input-primary w-full max-w-xs"
placeholder="Name..."
onChange={handleChange}
/>
</div>
<div className="mb-5">
<label htmlFor="email" className="block text-sm font-medium text-gray-900">
Email
</label>
<input
type="email"
name="email"
id="email"
className="input input-bordered input-primary w-full max-w-xs"
placeholder="email..."
onChange={handleChange}
/>
</div>
<div className="mb-5">
<label htmlFor="username" className="block text-sm font-medium text-gray-900">
Username
</label>
<input
type="text"
name="username"
id="username"
className="input input-bordered input-primary w-full max-w-xs"
placeholder="Username..."
onChange={handleChange}
/>
</div>
<div className="mb-5">
<label htmlFor="password" className="block text-sm font-medium text-gray-900">
Password
</label>
<input
type="password"
name="password"
id="password"
className="input input-bordered input-primary w-full max-w-xs"
placeholder="Password..."
onChange={handleChange}
/>
</div>
<button type="submit" className="btn btn-primary">Add New User</button>
</form>
</div>
</div>
);
};
export default Addnewuser;
app\users\edit\[id]\page.jsx
//app\users\edit\[id]\page.jsx
"use client";
import React, { useState, useEffect } from 'react';
import axios from 'axios' //npm install axios https://www.npmjs.com/package/axios
import { useParams, useRouter } from 'next/navigation'
export default function Edituser() {
const [inputs, setInputs] = useState([]);
const {id}=useParams();
//console.log(id);
useEffect(() => {
getUser();
}, []);
function getUser() {
axios.get(`http://localhost:3001/api/getuser/${id}`).then(function(response) {
console.log(response.data[0]);
setInputs(response.data[0]);
});
}
const handleChange = (event) => {
const name = event.target.name;
const value = event.target.value;
setInputs(values => ({...values, [name]: value}));
}
const router = useRouter();
const handleSubmit = (event) => {
event.preventDefault();
axios.put(`http://localhost:3001/api/edit/${id}`, inputs).then(function(response){
console.log(response.data);
router.push('/')
});
}
return (
<div className="max-w-md mx-auto mt-5">
<h1 className="text-2xl text-center mb-2">Edit Form</h1>
<form onSubmit={handleSubmit}>
<div className="mb-3 mt-3">
<label className="block text-sm font-medium text-gray-900"> ID:</label>
<input type="text" id="id" name="id" value={id} disabled />
</div>
<div className="mb-3 mt-3">
<label className="block text-sm font-medium text-gray-900"> Full Name:</label>
<input type="text" className="input input-bordered input-primary w-full max-w-xs" placeholder="Enter Your Full Name" name="name"
value={inputs.name || ''}
onChange={handleChange}/>
</div>
<div className="mb-3 mt-3">
<label className="block text-sm font-medium text-gray-900">Email:</label>
<input type="text" className="input input-bordered input-primary w-full max-w-xs" id="email" placeholder="Enter email" name="email"
value={inputs.email || ''}
onChange={ handleChange}/>
</div>
<div className="mb-3 mt-3">
<label className="block text-sm font-medium text-gray-900">Username:</label>
<input type="text" className="input input-bordered input-primary w-full max-w-xs" id="username" placeholder="Enter username" name="username"
value={inputs.username || ''}
onChange={ handleChange}/>
</div>
<button type="submit" name="update" className="btn btn-primary">Update</button>
</form>
</div>
);
}
app\users\read\[id]\page.jsx
//app\users\read\[id]\page.jsx
"use client";
import React, { useState, useEffect } from 'react';
import axios from 'axios' //npm install axios https://www.npmjs.com/package/axios
import { useParams } from 'next/navigation'
export default function ViewUser() {
const {id}=useParams();
console.log(id);
const[user,setUser]=useState([]);
useEffect(()=>{
fetchUser();
},[id]);
const fetchUser=async()=>{
try{
const result=await axios.get("http://localhost:3001/api/getuser/"+id);
console.log(result.data[0]);
setUser(result.data[0])
}catch(err){
console.log("Something Wrong");
}
}
return (
<div className="max-w-2xl mx-auto mt-5">
<h1 className="text-2xl text-center mb-2">View User</h1>
<table className="table table-zebra">
<thead className="text-sm text-gray-700 uppercase bg-gray-50">
<tr>
<th>S No.</th>
<th>Name</th>
<th>Email</th>
<th>Username</th>
</tr>
</thead>
<tbody>
<tr>
<td>{user.id}</td>
<td>{user.name}</td>
<td>{user.email}</td>
<td>{user.username}</td>
</tr>
</tbody>
</table>
</div>
);
}
app\users\components\ListUser.jsx
//app\users\components\ListUser.jsx
"use client";
import axios from 'axios';
import { useEffect, useState } from "react";
import Link from "next/link";
export default function ListUser() {
const [users, setUsers] = useState([]);
useEffect(() => {
getUsers();
}, []);
function getUsers() {
axios.get('http://localhost:3001/api/users').then(function(response) {
//console.log(response.data);
setUsers(response.data);
});
}
const deleteUser = (id) => {
axios.delete(`http://localhost:3001/api/delete/${id}`).then(function(response){
console.log(response.data);
getUsers();
});
}
return (
<table className="table table-zebra">
<thead className="text-sm text-gray-700 uppercase bg-gray-50">
<tr>
<th className="py-3 px-6">#</th>
<th className="py-3 px-6">Name</th>
<th className="py-3 px-6">Email</th>
<th className="py-3 px-6">Username</th>
<th className="py-3 px-6 text-center">Actions</th>
</tr>
</thead>
<tbody>
{users.map((user, key) =>
<tr key={key} className="bg-white border-b">
<td className="py-3 px-6">{user.id}</td>
<td className="py-3 px-6">{user.name}</td>
<td className="py-3 px-6">{user.email}</td>
<td className="py-3 px-6">{user.username}</td>
<td className="flex justify-center gap-1 py-3">
<Link
href={`/users/read/${user.id}`}
className="btn btn-success">
Read
</Link>
<Link className="btn btn-info" href={`users/edit/${user.id}/`}>
Edit
</Link>
<button onClick={() => deleteUser(user.id)} className="btn btn-error">Delete</button>
</td>
</tr>
)}
</tbody>
</table>
)
}
run C:\nextjs>npm run dev
