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
https://mongoosejs.com/docs/
npm install mongoose --save
multer
npm install --save multer
http://expressjs.com/en/resources/middleware/multer.html
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
run PS C:\nodeproject> node index.js
index.js
//index.js
const express = require('express')
const mongoose = require('mongoose')
const cors = require('cors')
const multer = require('multer') //http://expressjs.com/en/resources/middleware/multer.html npm install --save multer
const UserModel = require('./User')
const app = express()
const port = 3000
const path = require('path') //https://expressjs.com/en/starter/static-files.html
app.use('/static', express.static(path.join(__dirname, 'public')))
app.use(cors())
app.use(express.json())
main().catch(err => console.log(err));
async function main() {
try {
await mongoose.connect('mongodb://127.0.0.1/nodeexpressdb', {});
console.log("CONNECTED TO DATABASE SUCCESSFULLY");
} catch (error) {
console.error('COULD NOT CONNECT TO DATABASE:', error.message);
}
}
const storage = multer.diskStorage({
destination: function(req, file, cb) {
return cb(null, "./public/images")
},
filename: function (req, file, cb) {
return cb(null, `${Date.now()}_${file.originalname}`)
}
})
const upload = multer({storage})
app.get('/hello', (req, res) => {
res.send('Hello World!')
})
app.post('/upload', upload.single('file'), (req, res) => {
console.log(req.body)
console.log(req.file)
return res.json({Status: "Success"});
})
app.post('/create',upload.single('file'), (req, res) => {
UserModel.create({
name: req.body.name,
email: req.body.email,
photo: req.file.filename
}).then(user => res.json(user))
.catch(err => res.json(err))
})
app.get('/', (req, res) => {
UserModel.find()
.then(users => res.json(users))
.catch(err => res.json(err))
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
User.js
//User.js
const mongoose = require('mongoose')
const UserSchema = new mongoose.Schema({
name: String,
email: String,
photo: String
})
const UserModel = mongoose.model("users", UserSchema)
module.exports = UserModel;
Next.js Install requirements
npm install axios
https://www.npmjs.com/package/axios
app\page.tsx
//app\page.tsx
import Link from "next/link";
import TableData from "@/components/tabledata";
import { Suspense } from "react";
import { Spinner } from "@/components/spinner";
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 MongoDB Create with Upload File and List all data | TailwindCSS DaisyUI</h1>
</div>
<div className="overflow-x-auto">
<div className="mb-2 w-full text-right">
<Link
href="/user/create"
className="btn btn-primary">
Create
</Link>
</div>
<Suspense fallback={<Spinner />}>
<TableData/>
</Suspense>
</div>
</div>
);
}
components\tabledata.tsx
//components\tabledata.tsx
"use client";
import Image from 'next/image'
import React, { useEffect, useState } from "react";
import axios from 'axios' //npm install axios https://www.npmjs.com/package/axios
import Link from "next/link";
export default function Users() {
const [userData, setUSerData] = useState([]);
useEffect(() => {
fetchData();
}, [])
const fetchData = async () => {
try {
const result = await axios("http://localhost:3000/");
console.log(result.data);
setUSerData(result.data)
} catch (err) {
console.log("somthing Wrong");
}
}
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">Photo</th>
<th className="py-3 px-6 text-center">Actions</th>
</tr>
</thead>
<tbody>
{userData.map((rs, index) => (
<tr key={rs.id} className="bg-white border-b">
<td className="py-3 px-6">{index + 1}</td>
<td className="py-3 px-6">{rs.name}</td>
<td className="py-3 px-6">{rs.email}</td>
<td className="py-3 px-6">
<Image
//src="http://localhost:3000/static/images/cairocoders-ednalan.png"
src={`http://localhost:3000/static/images/${rs.photo}`}
width={100}
height={100}
alt="Photo"
/>
</td>
<td className="flex justify-center gap-1 py-3">
<Link
href="#"
className="btn btn-info">
View
</Link>
<Link
href="#"
className="btn btn-primary">
Edit
</Link>
<button className="btn btn-secondary">Delete</button>
</td>
</tr>
))}
</tbody>
</table>
);
}
components\spinner.tsx
//components\spinner.tsx
export const Spinner = () => {
return (
<span className="loading loading-spinner loading-lg"></span>
);
};
app\user\create\page.tsx
//app\user\create\page.tsx
"use client";
import React, { useState } from "react";
import axios from 'axios' //npm install axios https://www.npmjs.com/package/axios
const CreateUserPage = () => {
const [name, setName] = useState("");
const [email, setEmail] = useState("");
const [file, setFile] = useState()
const onSubmitUpload = async (e) => {
e.preventDefault();
try {
const formData = new FormData()
formData.append("name", name);
formData.append("email", email);
formData.append('file', file)
axios.post('http://localhost:3000/create',formData )
.then((response) => {
console.log(response);
window.location.href = '/';
})
.catch(er => console.log(er))
} catch (err) {
console.log("Something Wrong");
}
}
return (
<div className="max-w-md mx-auto mt-5">
<h1 className="text-2xl text-center mb-2">Add New User</h1>
<div>
<form>
<div className="mb-5">
<label htmlFor="name" className="block text-sm font-medium text-gray-900">
Full Name
</label>
<input
type="text"
name="name"
id="name"
className="input input-bordered input-primary w-full max-w-xs"
placeholder="Full Name..."
onChange={(e) => setName(e.target.value)}
/>
</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={(e) => setEmail(e.target.value)}
/>
</div>
<div className="mb-5">
<label className="block text-sm font-medium text-gray-900">
Upload File
</label>
<input type="file" onChange={(e) => setFile(e.target.files[0])} className="file-input file-input-bordered file-input-secondary w-full max-w-xs"/>
</div>
<button type="submit" className="btn btn-primary" onClick={e => onClick={e => onSubmitUpload(e)}>Add User</button>
</form>
</div>
</div>
);
};
export default CreateUserPage;
next.config.mjs
//next.config.mjs
/** @type {import('next').NextConfig} */
//const nextConfig = {};
const nextConfig = {
reactStrictMode: true,
images : {
domains : ['localhost', 'cairocoders.com'] // == Domain name
}
}
export default nextConfig;
run C:\nextjs>npm run dev Github - Next.js 14 Node Express MongoDB Create with Upload File and List all data | TailwindCSS DaisyUI
