Install nextjs npx create-next-app@latest https://nextjs.org/docs/getting-started/installation
Install the following
Mongoose
npm install mongoose
https://www.npmjs.com/package/mongoose
app\addProduct\page.tsx
//app\addProduct\page.tsx
"use client";
import { useState } from "react";
import { useRouter } from "next/navigation";
export default function AddProduct() {
const [name, setName] = useState("");
const [image, setImage] = useState("");
const [price, setPrice] = useState("");
const [category, setCategory] = useState("");
const router = useRouter();
const handleSubmit = async (e) => {
e.preventDefault();
if (!name || !image) {
alert("Name and image are required.");
return;
}
try {
const res = await fetch("/api/products", {
method: "POST",
headers: {
"Content-type": "application/json",
},
body: JSON.stringify({ name, image, price, category }),
});
if (res.ok) {
router.push("/products");
} else {
throw new Error("Failed to create a Product");
}
} catch (error) {
console.log(error);
}
};
return (
<div className="max-w-screen-lg mx-auto py-14">
<h1 className="text-4xl font-bold">Nextjs How to connect mongoDB Atlas using mongoose | Insert Data</h1>
<form onSubmit={handleSubmit} className="max-w-sm mx-auto">
<div className="mb-5">
<label className="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Name</label>
<input
onChange={(e) => setName(e.target.value)}
value={name}
className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
type="text"
placeholder="Product Name"
/>
</div>
<div className="mb-5">
<label className="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Image</label>
<input
onChange={(e) => setImage(e.target.value)}
value={image}
className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
type="text"
placeholder="/images/1.jpg"
defaultValue="/images/1.jpg"
/>
</div>
<div className="mb-5">
<label className="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Price</label>
<input
onChange={(e) => setPrice(e.target.value)}
value={price}
className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
type="number"
placeholder="1"
defaultValue="1"
/>
</div>
<div className="mb-5">
<label className="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Category</label>
<input
onChange={(e) => setCategory(e.target.value)}
value={category}
className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
type="text"
placeholder="Product Category"
/>
</div>
<button type="submit" className="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800">Add Product</button>
</form>
</div>
);
}
app\api\products\route.ts
//app\api\products\route.ts
import connectMongoDB from "@/libs/mongodb";
import Product from "@/models/ProductModel";
import { NextResponse } from "next/server";
export async function POST(request) {
const { name, image,price,category } = await request.json();
await connectMongoDB();
await Product.create({ name, image, price, category });
return NextResponse.json({ message: "Product Created" }, { status: 201 });
}
libs\mongodb.ts
//libs\mongodb.ts
import mongoose from "mongoose"; //npm install mongoose https://www.npmjs.com/package/mongoose
const connectMongoDB = async () => { //mongodb+srv://<username>:<password>@firstcluster.4rc4s.mongodb.net/<dbname>?retryWrites=true&w=majority
try {
await mongoose
.connect(process.env.MONGODB_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(() => {
console.log('Connected to the Database.');
})
.catch(err => console.error(err));
//console.log("Connected to MongoDB.");
} catch (error) {
console.log(error);
}
};
export default connectMongoDB;
models\ProductModel.ts
//models\ProductModel.ts
import mongoose, { Schema } from "mongoose";
const topicSchema = new Schema(
{
name: { type: String, required: true },
category: { type: String, required: true },
image: { type: String, required: true },
price: { type: Number, required: true },
},
{
timestamps: true,
}
);
const ProductModel = mongoose.models.Product || mongoose.model("Product", topicSchema);
export default ProductModel;
.env
//.env MONGODB_URI= "mongodb+srv://"username":"password"@cluster0.x45tgvn.mongodb.net/"databasename"?retryWrites=true&w=majority&appName=Cluster0"run C:\nextjs>npm run dev
