لإنشاء تطبيق مدونة باستخدام Next.js مع كل من الواجهة الخلفية والواجهة الأمامية، حيث يمكن للمستخدمين إضافة المدونات وحذفها، وتخزين البيانات في قاعدة بيانات، اتبع الخطوات التالية:
أولاً، قم بإنشاء مشروع Next.js جديد إذا لم تقم بذلك بالفعل:
npx create-next-app@latest blog-app cd blog-app npm install
لهذا المشروع، دعونا نستخدم MongoDB عبر 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://: @cluster0.mongodb.net/blog-app?retryWrites=true&w=majority
إنشاء نموذج للمدونات في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);
في Next.js، يمكنك إنشاء مسارات API في دليل الصفحات/api.
// 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 (); }Blog App
Blogs
{blogs.map(blog => (
- ))}
{blog.title}
{blog.content}
قم بتشغيل التطبيق الخاص بك:
npm run dev
أخبرني إذا كنت بحاجة إلى مزيد من التفاصيل!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3