Приложение для блога на Next JS
Чтобы создать приложение для блогов с помощью Next.js с бэкендом и фронтендом, где пользователи могут добавлять и удалять блоги, а также хранить данные в базе данных, нам будет необходимо выполнить следующие действия.
1. Создание проекта Next.js
Во-первых, создайте новый проект Next.js, если вы еще этого не сделали:
npx create-next-app@latest blog-app
cd blog-app
npm install
2. Настройка базы данных
Для этого проекта в качестве базы данных будем использовать MongoDB через Mongoose.
Сначала установите Mongoose:
npm install mongoose
Затем создайте базу данных MongoDB с помощью таких сервисов, как MongoDB Atlas, или используйте локальную установку MongoDB.
Подключитесь к MongoDB, создав файл lib/mongodb.js
:
// 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;
Добавьте MONGODB_URI
в ваш файл .env.local
:
MONGODB_URI=mongodb+srv://<username>:<password>@cluster0.mongodb.net/blog-app?retryWrites=true&w=majority
3. Создание схемы блога
Создайте модель для блогов в 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);
4. Создание маршрутов API для блога
В Next.js вы можете создавать маршруты API в каталоге pages/api
.
Сначала создайте страницу pages/api/blog/index.js
для обработки GET
- и POST
-запросов (добавление блогов):
// 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
для обработки запросов DELETE
:
// 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;
}
}
5. Создание фронтенда для добавления и отображения блогов
Создайте страницу pages/index.js
для списка всех блогов и форму для добавления новых блогов:
// 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>
);
}
6. Запуск сервера
Запустите ваше приложение:
npm run dev
7. Тестирование приложения
Теперь вы можете добавлять и удалять блоги, а все данные будут храниться в вашей базе данных MongoDB.
Благодарю вас за прочтение!