Home >Web Front-end >JS Tutorial >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:
First, create a new Next.js project if you haven't already:
npx create-next-app@latest blog-app cd blog-app npm install
For this project, let's use MongoDB via Mongoose as the database.
npm install mongoose
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;
Add the MONGODB_URI to your .env.local file:
MONGODB_URI=mongodb+srv://<username>:<password>@cluster0.mongodb.net/blog-app?retryWrites=true&w=majority
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);
In Next.js, you can create API routes in the pages/api directory.
// 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; } }
// 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; } }
// 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 ( <div> <h1>Blog App</h1> <form onSubmit={(e) => { e.preventDefault(); addBlog(); }}> <input type="text" value={title} onChange={(e) => setTitle(e.target.value)} placeholder="Blog Title" /> <textarea value={content} onChange={(e) => setContent(e.target.value)} placeholder="Blog Content" /> <button type="submit">Add Blog</button> </form> <h2>Blogs</h2> <ul> {blogs.map(blog => ( <li key={blog._id}> <h3>{blog.title}</h3> <p>{blog.content}</p> <button onClick={() => deleteBlog(blog._id)}>Delete</button> </li> ))} </ul> </div> ); }
Run your application:
npm run dev
Let me know if you need further details!
The above is the detailed content of Next JS Blog App. For more information, please follow other related articles on the PHP Chinese website!