Next JS Blog App

王林
Release: 2024-09-05 17:32:09
Original
789 people have browsed it

Next JS Blog App

To build a blog app using Next.js with both backend and frontend, where users can add and delete blogs, and store the data in a database, follow these steps:

1.Set Up Next.js Project

First, create a new Next.js project if you haven't already:

npx create-next-app@latest blog-app cd blog-app npm install
Copy after login

2.Set Up Database

For this project, let's useMongoDBviaMongooseas the database.

  • Install Mongoose:
npm install mongoose
Copy after login
  • Create a MongoDB database using services like MongoDB Atlas or use a local MongoDB setup.

  • Connect to MongoDB by creating a lib/mongodb.js file:

// lib/mongodb.js import mongoose from 'mongoose'; const MONGODB_URI = process.env.MONGODB_URI; if (!MONGODB_URI) { throw new Error('Please define the MONGODB_URI environment variable'); } let cached = global.mongoose; if (!cached) { cached = global.mongoose = { conn: null, promise: null }; } async function dbConnect() { if (cached.conn) { return cached.conn; } if (!cached.promise) { cached.promise = mongoose.connect(MONGODB_URI).then((mongoose) => { return mongoose; }); } cached.conn = await cached.promise; return cached.conn; } export default dbConnect;
Copy after login

Add the MONGODB_URI to your .env.local file:

MONGODB_URI=mongodb+srv://:@cluster0.mongodb.net/blog-app?retryWrites=true&w=majority
Copy after login

3.Define Blog Schema

Create a model for blogs in models/Blog.js:

// models/Blog.js import mongoose from 'mongoose'; const BlogSchema = new mongoose.Schema({ title: { type: String, required: true, }, content: { type: String, required: true, }, }, { timestamps: true }); export default mongoose.models.Blog || mongoose.model('Blog', BlogSchema);
Copy after login

4.Create API Routes for Blog

In Next.js, you can create API routes in the pages/api directory.

  • Create pages/api/blog/index.js for handling GET and POST requests (adding blogs):
// pages/api/blog/index.js import dbConnect from '../../../lib/mongodb'; import Blog from '../../../models/Blog'; export default async function handler(req, res) { const { method } = req; await dbConnect(); switch (method) { case 'GET': try { const blogs = await Blog.find({}); res.status(200).json({ success: true, data: blogs }); } catch (error) { res.status(400).json({ success: false }); } break; case 'POST': try { const blog = await Blog.create(req.body); res.status(201).json({ success: true, data: blog }); } catch (error) { res.status(400).json({ success: false }); } break; default: res.status(400).json({ success: false }); break; } }
Copy after login
  • Create pages/api/blog/[id].js for handling DELETE requests:
// pages/api/blog/[id].js import dbConnect from '../../../lib/mongodb'; import Blog from '../../../models/Blog'; export default async function handler(req, res) { const { method } = req; const { id } = req.query; await dbConnect(); switch (method) { case 'DELETE': try { const blog = await Blog.findByIdAndDelete(id); if (!blog) { return res.status(400).json({ success: false }); } res.status(200).json({ success: true, data: {} }); } catch (error) { res.status(400).json({ success: false }); } break; default: res.status(400).json({ success: false }); break; } }
Copy after login

5.Create Frontend for Adding and Displaying Blogs

  • Create a page pages/index.js for listing all blogs and a form for adding new blogs:
// pages/index.js import { useState, useEffect } from 'react'; import axios from 'axios'; export default function Home() { const [blogs, setBlogs] = useState([]); const [title, setTitle] = useState(''); const [content, setContent] = useState(''); useEffect(() => { async function fetchBlogs() { const response = await axios.get('/api/blog'); setBlogs(response.data.data); } fetchBlogs(); }, []); const addBlog = async () => { const response = await axios.post('/api/blog', { title, content }); setBlogs([...blogs, response.data.data]); setTitle(''); setContent(''); }; const deleteBlog = async (id) => { await axios.delete(`/api/blog/${id}`); setBlogs(blogs.filter(blog => blog._id !== id)); }; return ( 

Blog App

{ e.preventDefault(); addBlog(); }}> setTitle(e.target.value)} placeholder="Blog Title" />