当前位置: 首页 > backend >正文

Express项目实战大事件后台 API 项目(五)——文章管理

目录

1. 新建 ev_articles 表

2. 发布新文章

2.1 实现步骤

2.2 初始化路由模块

2.3 初始化路由处理函数模块

2.4 使用 multer 解析表单数据

2.5 验证表单数据

2.6 实现发布文章的功能

2.7 使用 postman 进行测试


1. 新建 ev_articles

create table ev_articles(id int primary key not null unique auto_increment comment '文章编号',title varchar(255) not null comment '文章标题',content text not null comment '文章内容',cover_img varchar(255) not null comment '文章封面图片',pub_date varchar(255) not null comment '文章发表日期',state varchar(255) not null comment '文章发布状态',is_delete tinyint(1) not null default 0 comment '文章删除状态,0表示未删除,1表示删除。',cate_id int not null comment '文章所属分类的id',author_id int not null comment '文章所属作者的id'
) comment '文章表';

2. 发布新文章

2.1 实现步骤

  • 1. 初始化路由模块
  • 2. 初始化路由处理函数模块
  • 3. 使用 multer 解析表单数据
  • 4. 验证表单数据
  • 5. 实现发布文章的功能

2.2 初始化路由模块

①  创建 /router/article.js 路由模块,并初始化如下的代码结构:
// 导入 express
const express = require('express')
// 创建路由对象
const router = express.Router()
// 发布新文章
router.post('/add', (req, res) => {
res.send('ok')
})
// 向外共享路由对象
module.exports = router

② app.js 中导入并使用文章的路由模块:

// 导入并使用文章路由模块
const articleRouter = require('./router/article')
// 为文章的路由挂载统一的访问前缀 /my/article
app.use('/my/article', articleRouter)

2.3 初始化路由处理函数模块

① 创建 /router_handler/article.js 路由处理函数模块,并初始化如下的代码结构:
// 发布新文章的路由处理函数
const addArticle = (req, res) => {res.send('ok')
}module.exports = {addArticle
}
②  修改 /router/article.js 中的代码如下:
// 文章管理路由模块
// 导入 express
const express = require('express')// 创建路由对象实例
const router = express.Router()// 导入文章的路由处理函数模块
const article_handler = require('../router_handler/article.js')// 发布新文章路由
router.post('/add', article_handler.addArticle)// 向外共享路由对象
module.exports = router

2.4 使用 multer 解析表单数据

注意:
  • 使用 express.urlencoded() 中间件无法解析 multipart/form-data 格式的请求体数据。
当前项目,推荐使用 multer 来解析 multipart/form - data 格式的表单数据。 https://www.np
mjs.com/package/multer
①  运行如下的终端命令,在项目中安装 multer
npm i multer

② /router/article.js 模块中导入并配置 multer

// 导入解析 formdata 格式表单数据的包
const multer = require('multer')
// 导入处理路径的核心模块
const path = require('path')
// 创建 multer 的实例对象,通过 dest 属性指定文件的存放路径
const upload = multer({ dest: path.join(__dirname, '../uploads') })

③ 修改 发布新文章 的路由如下:

// 发布新文章的路由
// upload.single() 是一个局部生效的中间件,用来解析 FormData 格式的表单数据
// 将文件类型的数据,解析并挂载到 req.file 属性中
// 将文本类型的数据,解析并挂载到 req.body 属性中
router.post('/add', upload.single('cover_img'), article_handler.addArticle)
④ 在 /router_handler/article.js 模块中的 addArticle 处理函数中,将 multer 解析出
来的数据进行打印:
// 发布新文章的处理函数
const addArticle = (req, res) => {console.log(req.body) // 文本类型的数据console.log('--------分割线----------')console.log(req.file) // 文件类型的数据res.send('ok')
})

2.5 验证表单数据

实现思路:
  • 通过 express-joi 自动验证 req.body 中的文本数据;通过 if 判断手动验证 req.file 中的文件数据;
① 创建 /schema/article.js 验证规则模块,并初始化如下的代码结构:
/ 导入定义验证规则的模块
const joi = require('joi')// 定义标题、分类 id、内容、发布状态的验证规则
const title = joi.string().required()
const cate_id = joi.number().integer().min(1).required()
const content = joi.string().required().allow('')
const state = joi.string().valid('已发布', '草稿').required()// 定义验证规则对象 - 发布文章
const add_article_schema = {body: {title,cate_id,content,state}
}module.exports = {add_article_schema
}
② 在 /router/article.js 模块中,导入需要的验证规则对象,并在路由中使用:
// 导入验证数据的中间件
const expressJoi = require('@escook/express-joi')
// 导入文章的验证模块
const { add_article_schema } = require('../schema/article')
// 发布新文章的路由
// 注意:在当前的路由中,先后使用了两个中间件:
// 先使用 multer 解析表单数据
// 再使用 expressJoi 对解析的表单数据进行验证
router.post('/add', upload.single('cover_img'), expressJoi(add_article_schema),
article_handler.addArticle)
③ 在 /router_handler/article.js 模块中的 addArticle 处理函数中,通过 if 判断客户端是否提交了 封面图片
// 发布新文章的路由处理函数
const addArticle = (req, res) => {// console.log(req.body) // 文本类型的数据// console.log('--------------')// console.log(req.file) // 文件类型的数据// res.send('ok')// 手动判断是否上传了文章封面if (!req.file || req.file.fieldname !== 'cover_img') {return res.sendResponse('文章封面是必选参数!')}// todo: 表单数据合法,继续走后面的处理流程
}

2.6 实现发布文章的功能

①  整理要插入数据库的文章信息对象:
// 导入处理路径的 path 核心模块
const path = require('path')const articleInfo = {// 标题、内容、状态、所属的分类Id...req.body,// 文章封面在服务器端的存放路径cover_img: path.join('/uploads', req.file.filename),// 文章发布时间pub_date: new Date(),// 文章作者的Idauthor_id: req.user.id,
}
② 定义发布文章的 SQL 语句:
const sql = `insert into ev_articles set ?`
③ 调用 database.query() 执行发布文章的 SQL 语句:
// 导入数据库操作模块
const database = require('../database/index')
// 调用 database.query 执行语句
database.query(sql, articleInfo, (err, results) => {// 执行 sql 语句失败if (err) {return res.sendResponse(err)}
// 执行 sql 语句成功,但是影响行数不等于 1 if (results.affectedRows !== 1 ) {return res.sendResponse('发布文章失败')}// 执行 sql 语句成功// 发布文章成功res.sendResponse('发布文章成功!', 0)
})
④ 在 app.js 中,使用 express.static() 中间件,将 uploads 目录中的图片托管为静态资源:
// 托管静态资源文件
app.use('/uploads', express.static('./uploads'))

2.7 使用 postman 进行测试

http://www.xdnf.cn/news/1057.html

相关文章:

  • java集合框架day1————集合体系介绍
  • 服务器监控软件推荐
  • Python Cookbook-6.7 有命名子项的元组
  • RAG vs 微调:大模型定制化技术选型全解析
  • 10、Context:跨维度传音术——React 19 状态共享
  • 【Java核心技术卷Ⅰ-第11版学习-第3章-Java的基本程序设计结构】
  • 每日一题(9) 垃圾箱分布
  • 基于SpinrgBoot+Vue的智慧农业管理平台-031
  • 远程医疗系统如何有效防护CC攻击
  • 智慧教室电子班牌-智能管理系统源码,‌后端‌基于Spring Boot框架,前端‌使用Vue.js框架进行组件化开发
  • 在python中装饰器的使用
  • File工具总结
  • 悟空黑桃A邀请码(31187835)
  • VSCode远程图形化GDB
  • 算法 | 鲸鱼优化算法(WOA)与强化学习的结合研究
  • Dify-web开发思路
  • Pikachu靶场-SQL注入
  • STM32——相关软件安装
  • 【Linux】:HTTPS协议
  • 相机标定(输出相机内参和畸变参数)
  • ASP.NET 中防止用户多次登录的方法
  • wkhtmltopdf - HTML转PDF/图像命令行工具
  • python@staticmethod 是什么含义?
  • Coze平台​ 创建AI智能体的详细步骤指南
  • 多源异构网络安全数据(CAPEC、CPE、CVE、CVSS、CWE、ATTCK、D3FEND)的详细解析,包括其作用、数据内容及相互联系
  • 跨越1640年的诗路对话:谢灵运与瓯江山水的古今交响
  • EasyCVR视频汇聚平台安防监控问题排查:GB28181协议摄像头不在线的排查步骤
  • 基于Spring Boot实现文件秒传的完整方案
  • 5565反射内存网络产品
  • 【数据结构_11】二叉树(5)