【node.js后台api项目】(十)新增文章分类接口
1、接口相关信息
- 路由:
/my/article/addcates - method: post
- 请求头需要携带
Authorization字段进行身份认证 - 请求体
- name: 分类名称
- alias: 分类别名
2、 定义路由和处理函数
1.在 /router/artcate.js 模块中,添加 新增文章分类 的路由:
// 新增文章分类路由
router.post('/addcates' , article_handler.addArticleCates)
- 在
/router_handler/artcate.js模块中,定义并向外共享 新增文章分类 的路由处理函数:
// 新增文章分类 路由处理函数
const addArticleCates = (req, res) => {
res.send('addcates')
}
老规矩测试一波

3、验证提交的数据
- 创建
/schema/artcate.js文章分类数据验证模块,并定义如下的验证规则:
// 导入定义验证规则的模块
const joi = require('joi')
// 定义 分类名称 和 分类别名 的校验规则
const add_cate_schema = {
name: joi.string().required(),
alias: joi.string().alphanum().required()
}
module.exports = {
add_cate_schema
}
由于之前的验证数据的中间件joiExpress并不通用,所以现在我们将它抽离来进行改造。
2. 新建./schema/joiExpress.js模块,并初始化以下代码
const Joi = require('joi')
// 定义数据校验中间件
const joiExpress = (schema) => {
const body_schema = schema.body ? Joi.object(schema.body) : null
const params_schema = schema.params ? Joi.object(schema.param) : null
const query_schema = schema.query ? Joi.object(schema.query) : null
return (req, res, next) => {
if (body_schema) {
const bodyData = req.body ? req.body : {}
const { error } = body_schema.validate(bodyData)
if (error) return res.cc(error)
}
if (params_schema) {
const paramsData = req.params ? req.params : {}
const { error } = params_schema.validate(paramsData)
if (error) return res.cc(error)
}
if (query_schema) {
const queryData = req.query ? req.query : {}
const { error } = query_schema.validate(queryData)
if (error) return res.cc(error)
}
next()
}
}
module.exports = joiExpress
- 修改
./schema/user.js的代码如下
// 导入joi
const Joi = require('joi')
// 定义登录注册的校验规则
const reg_login_schema = {
body: {
username: Joi.string().alphanum().min(1).max(10).required(),
password: Joi.string()
.pattern(/^[\S]{6,12}$/)
.required()
}
}
module.exports = {
reg_login_schema
}
- 新建
./schema/userinfo.js,写入以下代码
// 导入joi
const Joi = require('joi')
// 更新用户信息校验规则
const update_userinfo_schema = {
body: {
// 定义 id, nickname, emial 的验证规则
id: Joi.number().integer().min(1).required(),
nickname: Joi.string().required(),
user_pic: Joi.string().required()
}
}
// 定义重置密码 验证规则
const update_password_schema = {
body: {
// 使用 password 这个规则,验证 req.body.oldPwd 的值
oldPwd: Joi.string()
.pattern(/^[\S]{6,12}$/)
.required(),
// 使用 joi.not(joi.ref('oldPwd')).concat(password) 规则,验证 req.body.newPwd 的值
// 1. joi.ref('oldPwd') 表示 newPwd 的值必须和 oldPwd 的值保持一致
// 2. joi.not(joi.ref('oldPwd')) 表示 newPwd 的值不能等于 oldPwd 的值
// 3. .concat() 用于合并 joi.not(joi.ref('oldPwd')) 和 password 这两条验证规则
newPwd: Joi.not(Joi.ref('oldPwd')).concat(
Joi.string()
.pattern(/^[\S]{6,12}$/)
.required()
)
}
}
// 定义 更新头像 验证规则
const update_avatar_schema = {
body: {
// dataUri() 指的是如下格式的字符串数据:
// data:image/png;base64,VE9PTUFOWVNFQ1JFVFM=
avatar: Joi.string().dataUri().required()
}
}
module.exports = {
update_userinfo_schema,
update_password_schema,
update_avatar_schema
}
- 修改
./schema/artcate.js代码如下:
// 导入joi
const Joi = require('joi')
// 定义 分类名称 和 分类别名 的校验规则
const add_cate_schema = {
body: {
name: joi.string().required(),
alias: joi.string().alphanum().required()
}
}
module.exports = {
add_cate_schema
}
- 修改
./router/user.js
const express = require('express')
// 导入路由处理函数
const userHandler = require('../router_handler/user.js')
// 导入登录注册校验规则
const { reg_login_schema } = require('../schema/user')
// 导入自定义的数据校验中间件
const joiExpress = require('../schema/joiExpress')
const router = express.Router()
// 登录路由
router.post('/login', joiExpress(reg_login_schema), userHandler.login)
// 注册路由
router.post('/register', joiExpress(reg_login_schema), userHandler.register)
module.exports = router
- 修改
./router/userinfo.js
const express = require('express')
// 创建路由对象
const router = express.Router()
// 导入路由处理函数模块
const userinfo_handler = require('../router_handler/userinfo')
// 导入用户信息校验规则模块
const { update_userinfo_schema, update_password_schema, update_avatar_schema } = require('../schema/userinfo')
// 导入数据校验的中间件
const joiExpress = require('../schema/joiExpress')
// 获取用户信息 的路由
router.get('/userinfo', userinfo_handler.getUserInfo)
// 更新用户信息 的路由
router.post('/userinfo', joiExpress(update_userinfo_schema), userinfo_handler.updateUserInfo)
// 重置密码 的路由
router.post('/updatepwd', joiExpress(update_password_schema), userinfo_handler.updatepwd)
// 更新用户头像路由
router.post('/update/avatar', joiExpress(update_avatar_schema), userinfo_handler.updateAvatar)
module.exports = router
- 修改
./router/artcate.js
const express = require('express')
const router = express.Router()
// 导入 文章分类 路由处理函数模块
const artcate_handler = require('../router_handler/artcate')
// 导入文章分类校验规则模块
const { add_cate_schema } = require('../schema/artcate')
// 导入自定义的数据校验中间件
const joiExpress = require('../schema/joiExpress')
// 获取文章分类列表路由
router.get('/cates', article_handler.getArticleCates)
// 新增文章分类路由
router.post('/addcates', joiExpress(add_cate_schema), artcate_handler.addArticleCates)
module.exports = router

4、查询分类名称和别名是否被占用
- 定义查重的 SQL 语句:
// 定义查询 分类名称 与 分类别名 是否被占用的 SQL 语句
const sql = `select * from ${table.article_cate_Table} where name=? or alias=?`
- 调用 db.query() 执行查重的操作:
// 执行查重操作
db.query(sql, [req.body.name, req.body.alias], (err, results) => {
if (err) return res.cc(err)
if (results.length === 2) return res.cc('分类名称和别名被占用,请更换后重试!')
if (results.length === 1 && req.body.name === results[0].name && req.body.alias === results[0].alias) return res.cc('分类名称和别名被占用,请更换后重试!')
if (results.length === 1 && req.body.name === results[0].name) return res.cc('分类名称被占用,请更换后重试!')
if (results.length === 1 && req.body.alias === results[0].alias) return res.cc('分类别名被占用,请更换后重试!')
// TODO:新增文章分类
5、实现新增文章分类功能
- 定义新增文章分类的 SQL 语句:
const sql = `insert into ${table.article_cate_Table} set ?`
- 调用 db.query() 执行新增文章分类的 SQL 语句:
db.query(sql, [req.body], (err, results) => {
if (err) return res.cc(err)
if (results.affectedRows !== 1) return res.cc('新增文章分类失败!')
res.cc('新增分类成功!', 0)
})

本文档详细介绍了如何在Node.js后台实现新增文章分类的API接口,包括接口定义、路由处理函数、数据验证、查询分类是否被占用以及新增功能的实现。同时,对数据验证中间件进行了改造,提高了代码的复用性和规范性。此外,还展示了如何检查分类名称和别名是否已被占用,确保数据的唯一性。
1531

被折叠的 条评论
为什么被折叠?



