【node.js后台api项目】(十三)实现发布新文章接口

1、建表

在这里插入图片描述

2、接口相关信息

  • 路由: /my/article/add
  • method: post
  • 请求头需要携带 Authorization字段进行身份认证
  • 请求体
    • title:string类型,文章标题
    • cate_id:int型,所属分类id
    • content: string类型,文章内容
    • cover_img:blob二进制,文章封面
    • state:状态(可选值为已发布、草稿),string类型
  • 备注:由于此接口涉及到文件上传的功能,因此提交的请求体,必须是 FormData 格式!

3、 定义路由和处理函数

  1. 创建 /router/article.js 路由模块,并初始化如下的代码结构:
const express = require('express')

const router = express.Router()

// 发布新文章 路由
router.post('/add', (req, res) => {
  res.send('ok')
})

module.exports = router
  1. 在 app.js 中导入并使用文章的路由模块:
// 导入文章路由
const articleRouter = require('./router/article')

// 使用文章 路由
app.use('/my/article' , articleRouter)
  1. 创建 /router_handler/article.js 路由处理函数模块,并初始化如下的代码结构:
// 发布文章路由处理函数
const addArticle = (req, res) => {
  res.send('ok')
}

module.exports = {
  addArticle
}
  1. 修改 /router/article.js 中的代码如下:
const express = require('express')

const router = express.Router()

// 导入路由处理函数
const { addArticle } = require('../router_handler/article')

// 发布新文章 路由
router.post('/add', addArticle)

module.exports = router

4、使用multer解析表单数据

  1. 运行如下的终端命令,在项目中安装 multer:
npm i multer@1.4.2
  1. 在 /router/article.js 模块中导入并配置 multer:
// 导入解析 formdata 格式表单数据的包
const multer = require('multer')
// 导入处理路径的核心模块
const path = require('path')

// 创建 multer 的实例对象,通过 dest 属性指定文件的存放路径
const upload = multer({ dest: path.join(__dirname, '../uploads') })
  1. 修改 发布新文章 的路由如下:
// 发布新文章的路由
// upload.single() 是一个局部生效的中间件,用来解析 FormData 格式的表单数据
// 将文件类型的数据,解析并挂载到 req.file 属性中
// 将文本类型的数据,解析并挂载到 req.body 属性中
router.post('/add', upload.single('cover_img'), addArticle)

5、验证表单数据

实现思路:通过 express-joi 自动验证 req.body 中的文本数据;通过 if 判断手动验证 req.file 中的文件数据.

  1. 创建 /schema/article.js 验证规则模块,并初始化如下的代码结构:
// 导入定义验证规则的模块
const joi = require('@hapi/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()

// 验证规则对象 - 发布文章
exports.add_article_schema = {
  body: {
    title,
    cate_id,
    content,
    state
  }
}
  1. 在 /router/article.js 模块中,导入需要的验证规则对象,并在路由中使用
// 导入验证数据的中间件
const joiExpress = require('../schema/joiExpress')
// 导入文章数据的验证模块
const { add_article_schema } = require('../schema/article')

// 使用验证规则中间件
router.post('/add', upload.single('cover_img'), joiExpress(add_article_schema), addArticle)
  1. 在 /router_handler/article.js 模块中的 addArticle 处理函数中,通过 if 判断客户端是否提交了 封面图片:
// 发布文章路由处理函数
const addArticle = (req, res) => {
  if (!req.file || req.file.fieldname !== 'cover_img') return res.cc('文章封面是必选参数!')
}

6、实现发布文章功能

  1. 整理要插入数据库的文章信息对象:
// 导入处理路径的 path 核心模块
const path = require('path')

const articleInfo = {
  // 标题、内容、状态、所属的分类Id
  ...req.body,
  // 文章封面在服务器端的存放路径
  cover_img: path.join('/uploads', req.file.filename),
  // 文章发布时间
  pub_date: new Date(),
  // 文章作者的Id
  author_id: req.user.id,
}
  1. 定义发布文章的 SQL 语句:
const sql = `insert into ev_articles set ?`
  1. 调用 db.query() 执行发布文章的 SQL 语句:
// 导入数据库操作模块
const db = require('../db/index')

// 执行 SQL 语句
db.query(sql, articleInfo, (err, results) => {
  // 执行 SQL 语句失败
  if (err) return res.cc(err)

  // 执行 SQL 语句成功,但是影响行数不等于 1
  if (results.affectedRows !== 1) return res.cc('发布文章失败!')

  // 发布文章成功
  res.cc('发布文章成功', 0)
})
  1. 在 app.js 中,使用 express.static() 中间件,将 uploads 目录中的图片托管为静态资源:
// 托管静态资源文件
app.use('/uploads', express.static('./uploads'))

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端corner

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值