”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Next JS 博客应用

Next JS 博客应用

发布于2024-11-08
浏览:346

Next JS Blog App

要使用 Next.js 构建具有后端和前端的博客应用程序,用户可以在其中添加和删除博客,并将数据存储在数据库中,请按照以下步骤操作:

1. 设置 Next.js 项目

首先,如果您还没有创建一个新的 Next.js 项目:

npx create-next-app@latest blog-app
cd blog-app
npm install

2. 建立数据库

对于这个项目,我们通过Mongoose使用MongoDB作为数据库。

  • 安装猫鼬:
npm install mongoose
  • 使用 MongoDB Atlas 等服务创建 MongoDB 数据库或使用本地 MongoDB 设置。

  • 通过创建 lib/mongodb.js 文件连接到 MongoDB:

// 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

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中,您可以在pages/api目录中创建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 (
    

Blog App

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

Blogs

    {blogs.map(blog => (
  • {blog.title}

    {blog.content}

  • ))}
); }

6. 启动服务器

运行您的应用程序:

npm run dev

7. 测试应用程序

  • 您现在可以添加和删除博客,所有数据都将存储在您的 MongoDB 数据库中。

如果您需要更多详细信息,请告诉我!

版本声明 本文转载于:https://dev.to/iamyathz/next-js-blog-app-4e1f?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-09
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-09
  • ## 如何修改 Python 源代码,同时保留格式和注释?
    ## 如何修改 Python 源代码,同时保留格式和注释?
    使用 AST 修改 Python 源代码解析、修改和写回 Python 源代码对于突变测试等任务来说是一项很有价值的任务。虽然标准 Python 模块提供了解析和编译代码的方法,但它们缺乏修改和重写源代码的能力。为了满足这一需求,一些库提供了解决方案:lib2to3: 由 Pythscope 和 2...
    编程 发布于2024-11-09
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-09
  • 如何使用 JavaScript 根据另一个下拉列表中的选择填充一个下拉列表?
    如何使用 JavaScript 根据另一个下拉列表中的选择填充一个下拉列表?
    使用 JavaScript 根据另一个下拉列表中的选择填充一个下拉列表当面临根据另一个下拉列表中的选择动态更新一个下拉列表中的选项的任务时,它是对于避免不必要的复杂性(例如数据库查询)至关重要。让我们探索一个简单的基于 JavaScript 的解决方案,无需 AJAX 调用即可完成此任务。为了说明此...
    编程 发布于2024-11-09
  • 如何从具有不同数组长度的字典创建 Pandas DataFrame?
    如何从具有不同数组长度的字典创建 Pandas DataFrame?
    从条目长度不均匀的字典创建 DataFrame在 Python 中,可以从每个条目保存一个 Numpy 数组的字典创建 DataFrame。然而,当条目之间的数组长度不同时,就会出现挑战。默认情况下,Pandas 需要统一长度的数组,从而导致类似“ValueError: arrays must al...
    编程 发布于2024-11-09
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-09
  • 如何防止 Pandas 在保存 CSV 时添加索引列?
    如何防止 Pandas 在保存 CSV 时添加索引列?
    避免使用 Pandas 保存的 CSV 中的索引列使用 Pandas 进行修改后保存 csv 文件时,默认行为是包含索引列。为了避免这种情况,可以在使用 to_csv() 方法时将索引参数设置为 False。为了详细说明,请考虑以下命令序列:pd.read_csv('C:/Path/to/file....
    编程 发布于2024-11-09
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-09
  • 为什么在 Java 中使用相同的种子时会得到相同的随机数?
    为什么在 Java 中使用相同的种子时会得到相同的随机数?
    具有固定种子的Java随机数:为什么输出相同?在您的代码中,您定义了一种使用以下命令生成随机数的方法指定的种子。但是,您会注意到,当您提供相同的种子时,所有 100 个生成的数字都是相同的。此行为是预期的,因为在 Random 构造函数中使用相同的种子会产生可预测的数字序列。种子是初始化随机数生成器...
    编程 发布于2024-11-09
  • jQuery Chaining 如何简化开发并提高代码效率?
    jQuery Chaining 如何简化开发并提高代码效率?
    理解 jQuery 中的对象和方法链接在 jQuery 中,链接允许在单个语句中串联多个 jQuery 方法。这使开发人员能够简化代码并轻松执行复杂的操作。链接的基本原理涉及每个 jQuery 方法的返回值。当调用 jQuery 方法时,它通常返回一个表示所选元素的 jQuery 对象。这允许在同一...
    编程 发布于2024-11-09
  • Hono.js 基准测试:Node.js、Deno 和 Bun — 哪个最快?
    Hono.js 基准测试:Node.js、Deno 和 Bun — 哪个最快?
    Deno 2.0 刚刚发布,并声称比 Bun 和 Node.js 更快,同样,Bun 也声称更快。这引起了我的兴趣,所以我决定测试它们的性能,看看它们在现实场景中的比较。 为了公平比较,我需要选择一个与所有三种 JavaScript 运行时环境(Node.js、Deno 和 Bun)兼容的框架。这就...
    编程 发布于2024-11-09
  • 何时应该使用 Tkinter 的 Entry Get 函数来有效检索输入?
    何时应该使用 Tkinter 的 Entry Get 函数来有效检索输入?
    Tkinter Entry 的 Get 函数:深入探讨其功能和用法在 Tkinter 中,Entry 小部件通常用于收集用户输入以进一步收集用户输入然而,与 Entry 关联的 get() 函数通常无法产生所需的结果,这可能会让开发人员感到困惑。本文深入探讨 get() 的概念,全面了解其执行和应用...
    编程 发布于2024-11-09
  • 如何克服 PHP 中日期表示的 2038 限制?
    如何克服 PHP 中日期表示的 2038 限制?
    PHP 中的日期表示:克服 2038 年限制虽然 PHP 的原生日期函数在 2038 年有一个截止日期,但还有其他方法处理超出此限制的日期。其中一种方法是仅存储年、月和日,而忽略小时、分钟、秒和毫秒部分。通过丢弃这些附加时间部分,可以显着扩展可表示日期的范围。这是因为这些组件中的每一个都占用了 PH...
    编程 发布于2024-11-09
  • 如何在 Go (Gorilla) 中向特定客户端发送有针对性的 Websocket 更新?
    如何在 Go (Gorilla) 中向特定客户端发送有针对性的 Websocket 更新?
    在 Go (Gorilla) 中向特定客户端发送 Websocket 更新尽管是 Go 新手,但您寻求有关实现 Websocket 通信的指导您的预输入项目。您已尝试利用 Gorilla 的 GitHub 存储库中的示例,但在理解如何识别特定客户端并针对 websocket 更新进行定位方面遇到了挑...
    编程 发布于2024-11-09

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3