【node.js后台api项目】(十)新增文章分类接口

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

1、接口相关信息

  • 路由: /my/article/addcates
  • method: post
  • 请求头需要携带 Authorization字段进行身份认证
  • 请求体
    • name: 分类名称
    • alias: 分类别名

2、 定义路由和处理函数

1.在 /router/artcate.js 模块中,添加 新增文章分类 的路由:

// 新增文章分类路由
router.post('/addcates' , article_handler.addArticleCates)
  1. /router_handler/artcate.js 模块中,定义并向外共享 新增文章分类 的路由处理函数:
// 新增文章分类 路由处理函数
const addArticleCates = (req, res) => {
  res.send('addcates')
}

老规矩测试一波
在这里插入图片描述

3、验证提交的数据

  1. 创建 /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
  1. 修改./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
}
  1. 新建./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
}
  1. 修改 ./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
}
  1. 修改./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


  1. 修改./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


  1. 修改./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、查询分类名称和别名是否被占用

  1. 定义查重的 SQL 语句:
// 定义查询 分类名称 与 分类别名 是否被占用的 SQL 语句
const sql = `select * from ${table.article_cate_Table} where name=? or alias=?`
  1. 调用 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、实现新增文章分类功能

  1. 定义新增文章分类的 SQL 语句:
const sql = `insert into ${table.article_cate_Table} set ?`
  1. 调用 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)
})

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

前端corner

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

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

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

打赏作者

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

抵扣说明:

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

余额充值