如何用React JS+Node.js(Express,MongoDB)搭建支持代码片段的博客
基于React + Express + MongoDB的个人博客实现方案
一、技术栈选型
- 前端:纯React JS,搭配轻量Markdown相关依赖实现内容编辑、渲染能力,不引入额外全栈框架
- 后端:Node.js + Express 框架,负责接口提供、登录鉴权逻辑
- 数据库:MongoDB,存储用户信息、博客文章、标签等核心数据
- 核心辅助依赖:
- 前端用
react-markdown做Markdown内容渲染,react-syntax-highlighter实现代码片段语法高亮,react-router-dom做单页路由,@uiw/react-md-editor作为轻量Markdown编辑器 - 后端用
mongoose做MongoDB数据模型映射,jsonwebtoken实现登录态校验,bcrypt做密码哈希加密,cors处理开发环境跨域
- 前端用
二、后端实现逻辑
数据模型设计
用mongoose定义两个核心数据模型即可满足需求:
- 管理员用户模型:仅存储博主账号信息,不开放普通用户注册,字段包含用户名、密码哈希值、账号创建时间
- 博客文章模型:核心字段如下
title:字符串类型,文章主标题,必填content:字符串类型,存储Markdown格式的文章正文,支持普通文本、多级标题、代码块等所有内容格式,必填summary:字符串类型,文章摘要,支持手动填写或自动从正文截取前150字生成tags:数组类型,存储文章关联的标签createTime/updateTime:时间类型,新建、编辑文章时自动生成更新isPublished:布尔类型,标记文章为草稿状态或已发布状态
接口设计
采用RESTful风格分两类接口:
- 公开无鉴权接口(所有访客可访问)
GET /api/posts:拉取已发布的文章列表,支持分页、按标签筛选GET /api/posts/:id:拉取单篇文章的完整详情POST /api/admin/login:管理员账号密码校验,登录成功返回JWT令牌
- 鉴权接口(请求头携带合法JWT才可访问)
POST /api/admin/posts:新建文章,传入标题、正文、标签、发布状态等参数PUT /api/admin/posts/:id:编辑对应ID的已有文章DELETE /api/admin/posts/:id:删除对应ID的文章
后端注意事项
- 管理员密码禁止明文存储,注册/初始化账号时用bcrypt生成哈希值存入数据库,登录时比对哈希值校验密码正确性
- 统一写鉴权中间件,拦截所有
/api/admin路径下的请求,令牌缺失或非法时直接返回401状态码 - 所有接口加基础参数校验,比如新建文章时校验标题、内容不能为空,避免脏数据写入数据库
- 个人博客无需开放注册入口,直接在服务初始化时生成默认管理员账号,或通过一次性脚本设置账号密码,减少被攻击的风险
三、前端实现逻辑
用React做单页应用,核心页面分为5个模块:
- 文章列表页:首页以卡片形式展示所有已发布文章,卡片上显示标题、摘要、发布时间、关联标签,点击卡片跳转到对应文章详情页
- 文章详情页:拉取单篇文章数据后,用Markdown渲染组件把正文转成页面DOM,代码块部分自动做语法高亮,展示效果和参考的博客样例一致
- 管理员登录页:提供账号密码输入框,登录成功后把JWT令牌存在localStorage,自动跳转到后台管理页
- 文章编辑页:左侧为Markdown编辑区,右侧为内容实时预览区,编辑器自带快捷按钮,可一键插入多级标题、代码块、列表等格式,编辑完成后可选择存为草稿或直接发布
- 后台文章管理页:展示所有文章(含草稿),提供编辑、删除操作入口
前端注意事项
- 所有需要鉴权的接口请求,自动从localStorage读取JWT加到请求头中,如果接口返回401状态码,自动清除本地存储的令牌并跳转到登录页
- 代码高亮默认支持JavaScript、Python、CSS、HTML等常用开发语言,可额外给代码块加一键复制按钮提升阅读体验
- 做基础响应式适配,保证移动端访问时内容排版正常
四、核心发布能力落地
需要的三类内容发布能力,通过Markdown格式存储+渲染的方案可以一次性覆盖,无需单独开发复杂的富文本解析逻辑:
- 纯文本发布:直接在编辑器中输入普通文字即可,渲染时自动转成段落标签展示
- 多级标题发布:在标题行首加对应数量的
#标记,即可生成一级到六级标题,层级样式和参考博客样例一致 - 代码片段发布:用三个反引号包裹代码内容并指定对应语言,渲染时自动生成带语法高亮的代码块,展示效果和参考样例完全匹配
五、部署方案
- 前端:执行打包命令生成静态资源文件,直接用Nginx托管即可
- 后端:Express服务用PM2做进程守护,部署在服务器指定端口
- 数据库:可直接在服务器安装MongoDB,也可选用云厂商提供的托管MongoDB服务,减少运维成本
- 反向代理配置:Nginx统一接收域名请求,把
/api路径的请求转发到Express服务,其余路径返回前端静态资源,即可解决线上跨域问题
内容的提问来源于stack exchange,提问作者Rohit Yadav
相关产品推荐
相关产品推荐

