To fetch a blog detail page data by ID from MongoDB in NextJS, you can follow these steps:
Step 1: Install the mongodb package in your Next.js project:
npm install mongodb
Step 2: Set up a connection to your MongoDB database. Create a file, let’s say db.js, in the root of your NextJS project:
import { MongoClient } from 'mongodb';
const uri = process.env.MONGODB_URI;
const options = { useNewUrlParser: true, useUnifiedTopology: true, };
let client;
let cachedDb;
async function connectToDatabase() {
if (cachedDb && client.isConnected()) {
return cachedDb;
}
try {
client = await MongoClient.connect(uri, options);
const db = client.db();
cachedDb = db; return db;
} catch (error) {
console.error('MongoDB connection error:', error);
}
}
export default connectToDatabase;
In this example, we use an environment variable MONGODB_URI to store the connection string to your MongoDB database. You can set this environment variable in a .env file or your preferred method.
Step 3: Create an API route to fetch the document by ID. Create a file, let’s say pages/api/blog/[id].js:
import connectToDatabase from ‘../../../db’;
export default async function handler(req, res) {
const { id } = req.query;
try {
const db = await connectToDatabase();
const collection = db.collection(‘blogs’);
const blog = await collection.findOne({ _id: id });
if (!blog) {
return res.status(404).json({ message: ‘Blog not found’ });
}
return res.status(200).json(blog);
} catch (error) {
console.error(‘Error fetching blog:’, error);
return res.status(500).json({
message: ‘Internal Server Error’ });
}
}
This API route receives the id as a parameter from the request’s query. It connects to the MongoDB database using connectToDatabase, retrieves the blogs collection, and finds the document by its _id field. If the document is found, it’s returned as a JSON response. Otherwise, a 404 status is returned.
Step 4: In your Next.js page or component, you can fetch the document using this API route. For example, if you have a BlogDetail component:
import { useRouter } from 'next/router';
import { useEffect, useState } from 'react';
const BlogDetail = () => {
const router = useRouter();
const { id } = router.query;
const [blog, setBlog] = useState(null);
useEffect(() => {
const fetchBlog = async () => {
if (id) {
const res = await fetch(`/api/blog/${id}`);
const data = await res.json();
setBlog(data);
}
};
fetchBlog();
}, [id]);
if (!blog) {
return (
{blog.title}
{blog.content}
{/* Render the rest of the blog details */}
); };
export default BlogDetail;
In this example, we use the useRouter hook from Next.js to extract the id parameter from the URL. We then fetch the blog document from the API route (/api/blog/[id]) using
