当前位置:   article > 正文

Node.js入门实战指南:如何构建高效稳定的API接口?详细教程带你飞_nodejs开发api接口

nodejs开发api接口

1、初始化

1.1创建项目

1.新建 api_server 文件夹作为项目根目录,并在项目根目录中运行如下的命令,初始化包管理配置文件:

npm init -y

2.运行如下的命令,安装特定版本的 express

npm i express@4.17.1

 3.在项目根目录中新建 app.js 作为整个项目的入口文件,并初始化如下的代码:

  1. // 导入 express 模块
  2. const express = require('express')
  3. // 创建 express 的服务器实例
  4. const app = express()
  5. // write your code here...
  6. // 调用 app.listen 方法,指定端口号并启动web服务器
  7. app.listen(3007, function () {
  8. console.log('api server running at http://127.0.0.1:3007')
  9. })

1.2 配置 cors 跨域

1.运行如下的命令,安装 cors 中间件:

npm i cors@2.8.5
2.在 app.js 中导入并配置 cors 中间件:
  1. // 导入 cors 中间件
  2. const cors = require('cors')
  3. // 将 cors 注册为全局中间件
  4. app.use(cors())

​1.3 配置解析表单数据的中间件

通过如下的代码,配置解析 application/x-www-form-urlencoded 格式的表单数据的中间件:

app.use(express.urlencoded({ extended: false }))

1.4 初始化路由相关的文件夹

1.在项目根目录中,新建 router 文件夹,用来存放所有的路由模块

    路由模块中,只存放客户端的请求与处理函数之间的映射关系

2.在项目根目录中,新建router_handler 文件夹,用来存放所有的 路由处理函数模块

     路由处理函数模块中,专门负责存放每个路由对应的处理函数

3.在项目根目录中,新建 schema 文件夹,用来存放表单验证规则模块

    表单验证规则模块中,只存放各个路由的表单数据校验代码

1.5 初始化 config.js 配置文件

在项目根目录下创建 config.js ,用来存放全局变量

  1. module.exports = {
  2. jwtSecretKey: 'itheima No1. ^_^', // 加密字符串
  3. expiration_time: '10h' // token 有效期为 10 个小时
  4. }

1.6 初始化 db 数据库配置文件

在项目根目录下创建 db 文件夹,里面创建index.js 文件

  1. // 导入 mysql 模块 npm i mysql@2.18.1
  2. const mysql = require('mysql')
  3. // 创建数据库连接对象
  4. const db = mysql.createPool({
  5. host: 'localhost',
  6. user: 'root', // 本地
  7. // user: 'my_db_01', // 线上
  8. password: '207080',
  9. database: 'my_db_01',
  10. })
  11. // 检测 mysql 模块能否正常工作
  12. // 调用 db.query() 函数,指定要执行的 SQL 语句,通过回调函数拿到执行的结果:
  13. db.query('select 1', (err, results) => {
  14. if (err) return console.log(err.message);
  15. // 只要能打印出 [ RowDataPacket { '1': 1 } ]的结果,就能证明数据库链接正常
  16. console.log(results);
  17. })
  18. // 向外共享 db 数据库连接对象
  19. module.exports = db

1.7 在根目录创建 public 文件夹,用来存放静态数据

最终的项目结构

2、接口api实现

 用户注册登录的接口(使用 jwt 做前后端身份验证)

1.在 router 文件夹中,新建 user.js 文件,作为用户的路由模块,并初始化代码如下:

  1. // 用户登录/注册的路由模块
  2. const express = require('express')
  3. // 创建路由对象
  4. const router = express.Router()
  5. // 导入用户路由处理函数模块
  6. const userHandler = require('../router_handler/user')
  7. // 1. 导入验证表单数据的中间件(自动验证) npm i @escook/express-joi
  8. const expressJoi = require('@escook/express-joi')
  9. // 2. 导入需要的验证规则对象
  10. const { reg_login_schema } = require('../schema/user')
  11. // 注册新用户
  12. // 3. 在注册新用户的路由中,声明局部中间件,对当前请求中携带的数据进行验证
  13. // 3.1 数据验证通过后,会把这次请求流转给后面的路由处理函数
  14. // 3.2 数据验证失败后,终止后续代码的执行,并抛出一个全局的 Error 错误,进入全局错误级别中间件中进行处理
  15. router.post('/reguser', expressJoi(reg_login_schema), userHandler.regUser)
  16. // 登录
  17. router.post('/login', expressJoi(reg_login_schema), userHandler.login)
  18. // 将路由对象共享出去
  19. module.exports = router

2.在 /router_handler/user.js 中,使用 exports 对象,分别向外共享如下两个 路由处理函数 :

  1. /**
  2. * 在这里定义和用户相关的路由处理函数,供 /router/user.js 模块进行调用
  3. */
  4. // 导入 mySql 数据库的链接模块
  5. const db = require('../db/index.js')
  6. // 导入对密码进行加密处理的第三方中间件 npm i bcryptjs@2.4.3
  7. const bcrypt = require('bcryptjs')
  8. // 用这个包来生成 Token 字符串
  9. const jwt = require('jsonwebtoken')
  10. // 导入配置文件
  11. const config = require('../config')
  12. // 注册用户的处理函数
  13. exports.regUser = (req, res) => {
  14. // 1.判断用户名和密码是否为空
  15. // 接收表单数据
  16. const userinfo = req.body
  17. // 2.检测用户名是否被占用
  18. // 定义 SQL 语句:
  19. const sql = `select * from ev_users where username=?`
  20. // 执行 SQL 语句并根据结果判断用户名是否被占用:
  21. db.query(sql, [userinfo.username], function (err, results) {
  22. // 执行 SQL 语句失败
  23. if (err) {
  24. return res.cc(err.message)
  25. }
  26. // 用户名被占用
  27. if (results.length > 0) {
  28. return res.cc('用户名被占用,请更换其他用户名!')
  29. }
  30. // TODO: 用户名可用,继续后续流程...
  31. // 调用 bcrypt.hashSync(明文密码, 随机盐的长度) 方法,对用户的密码进行加密处理:
  32. // 对用户的密码,进行 bcrype 加密,返回值是加密之后的密码字符串
  33. userinfo.password = bcrypt.hashSync(userinfo.password, 10)
  34. // 向 my_db_01 数据库的 ev_users 表插入新用户
  35. const user = { username: userinfo.username, password: userinfo.password }
  36. const sql = 'insert into ev_users set ?'
  37. db.query(sql, user, (err, results) => {
  38. // 执行 SQL 语句失败
  39. if (err) {
  40. return res.cc(err.message)
  41. }
  42. // SQL 语句执行成功,但影响的行数不为 1
  43. if (results.affectedRows !== 1) {
  44. return res.cc('注册新用户失败,请稍后重试!')
  45. }
  46. return res.cc('注册成功!', 0, 201)
  47. })
  48. })
  49. }
  50. // 登录的处理函数
  51. exports.login = (req, res) => {
  52. // 1.接收表单数据:
  53. const userinfo = req.body
  54. // 2.定义 SQL 语句
  55. const sql = `select * from ev_users where username=?`
  56. // 3.执行 SQL 语句,查询用户的数据:
  57. db.query(sql, userinfo.username, function (err, results) {
  58. // 执行 SQL 语句失败
  59. if (err) return res.cc(err)
  60. // 执行 SQL 语句成功,但是查询到数据条数不等于 1
  61. if (results.length !== 1) return res.cc('登录失败,用户不存在!')
  62. // TODO:判断用户输入的登录密码是否和数据库中的密码一致
  63. // 核心实现思路:调用 bcrypt.compareSync(用户提交的密码, 数据库中的密码) 方法比较密码是否一致
  64. // 返回值是布尔值(true 一致、false 不一致)
  65. // 拿着用户输入的密码,和数据库中存储的密码进行对比
  66. const compareResult = bcrypt.compareSync(userinfo.password, results[0].password)
  67. // const compareResult = userinfo.password == results[0].password
  68. // 如果对比的结果等于 false, 则证明用户输入的密码错误
  69. if (!compareResult) {
  70. return res.cc('登录失败,密码错误!')
  71. }
  72. // TODO:登录成功,生成 Token 字符串
  73. // 核心注意点:在生成 Token 字符串的时候,一定要剔除 密码 和 头像 的值
  74. // 剔除完毕之后,user 中只保留了用户的 id, username, nickname, email 这四个属性的值
  75. const user = { ...results[0], password: '', user_pic: '' }
  76. // 运行如下的命令,安装生成 Token 字符串的包:
  77. // npm i jsonwebtoken@8.5.1
  78. // 生成 Token 字符串
  79. // 参数1:用户的信息对象
  80. // 参数2:加密的秘钥
  81. // 参数3:配置对象,可以配置当前 token 的有效期
  82. // 记住:千万不要把密码加密到 token 字符中
  83. const tokenStr = jwt.sign(user, config.jwtSecretKey, {
  84. expiresIn: config.expiration_time, // token 有效期
  85. })
  86. res.send({
  87. status: 0,
  88. msg: '登录成功!',
  89. // 为了方便客户端使用 Token,在服务器端直接拼接上 Bearer 的前缀
  90. token: 'Bearer ' + tokenStr,
  91. })
  92. })
  93. }

3.在/schema/user.js 中,创建表单验证规则

  1. // 用户信息验证模块
  2. // 使用第三方的中间件验证表单数据
  3. /*
  4. 安装 @hapi/joi 包,为表单中携带的每个数据项,定义验证规则:
  5. npm install @hapi/joi@17.1.0 // @hapi/joi 版本已弃用,
  6. npm install joi
  7. 安装 @escook/express-joi 中间件,来实现自动对表单数据进行验证的功能:
  8. npm i @escook/express-joi
  9. */
  10. const joi = require('joi')
  11. /**
  12. * string() 值必须是字符串 默认情况不支持空字符串 Joi.string().allow('') 支持空字符串
  13. * alphanum() 值只能是包含 a-zA-Z0-9 的字符串
  14. * min(length) 最小长度
  15. * max(length) 最大长度
  16. * required() 值是必填项,不能为 undefined
  17. * pattern(正则表达式) 值必须符合正则表达式的规则
  18. * number()值必须是一个数字
  19. * email()值必须是邮箱格式
  20. */
  21. // 用户名的验证规则
  22. const username = joi.string().alphanum().min(1).max(10).required()
  23. // 密码的验证规则 6~12位 [\S]表示,非空白就匹配 [\s] 只要出现空白就匹配
  24. // /^[\S]{6,12}$/ = 以非空白的元素开头和结尾数量6-12
  25. const password = joi
  26. .string()
  27. .pattern(/^[\S]{6,12}$/)
  28. .required()
  29. // 注册和登录表单的验证规则对象
  30. exports.reg_login_schema = {
  31. // 表示需要对 req.body 中的数据进行验证
  32. body: {
  33. username,
  34. password,
  35. },
  36. }
  37. // 定义 id, nickname, emial 的验证规则
  38. const id = joi.number().integer().min(1).required()
  39. const nickname = joi.string().required()
  40. const email = joi.string().email().required()
  41. // 验证规则对象 - 更新用户基本信息
  42. exports.update_userinfo_schema = {
  43. body: {
  44. id,
  45. nickname,
  46. email,
  47. },
  48. }
  49. // 验证规则对象 - 重置密码
  50. exports.update_password_schema = {
  51. body: {
  52. // 使用 password 这个规则,验证 req.body.oldPwd 的值
  53. oldPwd: password,
  54. // 使用 joi.not(joi.ref('oldPwd')).concat(password) 规则,验证 req.body.newPwd 的值
  55. // 解读:
  56. // 1. joi.ref('oldPwd') 表示 newPwd 的值必须和 oldPwd 的值保持一致
  57. // 2. joi.not(joi.ref('oldPwd')) 表示 newPwd 的值不能等于 oldPwd 的值
  58. // 3. .concat() 用于合并 joi.not(joi.ref('oldPwd')) 和 password 这两条验证规则
  59. newPwd: joi.not(joi.ref('oldPwd')).concat(password),
  60. },
  61. }
  62. // 头像的验证规则就不需要了,因为在router/userinfo内使用 multer 来解析数据自带验证
  63. // 头像图片的验证规则
  64. // dataUri() 指的是如下格式的字符串数据:
  65. // data:image/png;base64,VE9PTUFOWVNFQ1JFVFM=
  66. // const avatar = joi.string().dataUri().required()
  67. // 验证规则对象 - 更新头像
  68. // exports.update_avatar_schema = {
  69. // body: {
  70. // avatar,
  71. // },
  72. // }

更新用户信息的接口(包含文件上传

1.在 router 文件夹中,新建 userinfo.js 文件,作为用户的路由模块,并初始化代码如下:

  1. // 用户信息的路由模块
  2. // 导入 express
  3. const express = require('express')
  4. const router = express.Router()
  5. // 导入用户信息的处理函数模块
  6. const userinfo_handler = require('../router_handler/userinfo')
  7. // 导入验证数据合法性的中间件
  8. const expressJoi = require('@escook/express-joi')
  9. // 导入解析 formdata 格式表单数据的包
  10. const multer = require("multer")
  11. // 导入处理路径的核心模块
  12. const path = require('path')
  13. // 导入需要的验证规则对象
  14. const { update_userinfo_schema, update_password_schema } = require('../schema/user')
  15. // 获取用户的基本信息
  16. router.get('/userinfo', userinfo_handler.getUserInfo)
  17. // 更新用户的基本信息
  18. router.put('/userinfo', expressJoi(update_userinfo_schema), userinfo_handler.updateUserInfo)
  19. // 重置密码的路由
  20. router.patch('/updatepwd', expressJoi(update_password_schema), userinfo_handler.updatePassword)
  21. // 更新用户头像的路由
  22. // 注意:使用 express.urlencoded() 中间件无法解析 multipart/form-data 格式的请求体数据。
  23. // npm i multer@1.4.2
  24. // 创建 multer 的实例对象,通过 dest 属性指定文件的存放路径
  25. const upload = multer({ dest: path.join(__dirname, '../public/image/head_portrait') })
  26. // upload.single() 是一个局部生效的中间件,用来解析 FormData 格式的表单数据
  27. // 将文件类型的数据(avatar),解析并挂载到 req.files 属性中 files是数组
  28. // 将其他文本类型的数据,解析并挂载到 req.body 属性中
  29. // array 有两个参数 表单name属性值(前端的文件对象名要和这里的相同) 最多上传文件的个数
  30. router.post('/update/avatar', upload.array('avatar', 1), userinfo_handler.updateAvatar)
  31. // 或
  32. // 将文件类型的数据,解析并挂载到 req.file 属性中 file是对象
  33. // 将其他文本类型的数据,解析并挂载到 req.body 属性中
  34. // router.post('/update/avatar', upload.single('avatar'), userinfo_handler.updateAvatar)
  35. module.exports = router

2.在 /router_handler/userinfo.js 中,使用 exports 对象,向外共享路由处理函数 :

  1. /**
  2. * 在这里定义和用户信息相关的路由处理函数,供 /router/userinfo.js 模块进行调用
  3. */
  4. // 导入数据库操作模块
  5. const db = require('../db/index')
  6. // 导入文件操作模块
  7. const fs = require('fs')
  8. // 导入处理路径的 path 核心模块
  9. const path = require('path')
  10. // 导入对密码进行加密处理的第三方中间件 npm i bcryptjs@2.4.3
  11. const bcrypt = require('bcryptjs')
  12. // 获取用户基本信息的处理函数
  13. exports.getUserInfo = (req, res) => {
  14. // 根据用户的 id,查询用户的基本信息
  15. // 注意:为了防止用户的密码泄露,需要排除 password 字段
  16. const sql = `select id, username, nickname, email, user_pic,role_id,role_name,is_enabled from ev_users where id=?`
  17. // 调用 db.query() 执行 SQL 语句:
  18. // 注意:req 对象上的 user 属性,是 Token 解析成功,express-jwt 中间件帮我们挂载上去的
  19. db.query(sql, req.user.id, (err, results) => {
  20. // 1. 执行 SQL 语句失败
  21. if (err) return res.cc(err)
  22. // 2. 执行 SQL 语句成功,但是查询到的数据条数不等于 1
  23. if (results.length !== 1) return res.cc('获取用户信息失败!')
  24. // 3. 将用户信息响应给客户端
  25. res.send({
  26. status: 0,
  27. msg: '获取用户基本信息成功!',
  28. data: results[0],
  29. })
  30. })
  31. }
  32. // 更新用户基本信息的处理函数
  33. exports.updateUserInfo = (req, res) => {
  34. const sql = `update ev_users set ? where id=?`
  35. db.query(sql, [req.body, req.body.id], (err, results) => {
  36. // 执行 SQL 语句失败
  37. if (err) return res.cc(err)
  38. // 执行 SQL 语句成功,但影响行数不为 1
  39. if (results.affectedRows !== 1) return res.cc('修改用户基本信息失败!')
  40. // 修改用户信息成功
  41. return res.cc('修改用户基本信息成功!', 0)
  42. })
  43. }
  44. // 重置密码的处理函数
  45. exports.updatePassword = (req, res) => {
  46. // 定义根据 id 查询用户数据的 SQL 语句
  47. const sql = `select * from ev_users where id=?`
  48. // 执行 SQL 语句查询用户是否存在
  49. db.query(sql, req.user.id, (err, results) => {
  50. // 执行 SQL 语句失败
  51. if (err) return res.cc(err)
  52. // 检查指定 id 的用户是否存在
  53. if (results.length !== 1) return res.cc('用户不存在!')
  54. // TODO:判断提交的旧密码是否正确
  55. // 在头部区域导入 bcryptjs 后,(因为数据库中的密码是加密过的)
  56. // 即可使用 bcrypt.compareSync(提交的密码,数据库中的密码) 方法验证密码是否正确
  57. // compareSync() 函数的返回值为布尔值,true 表示密码正确,false 表示密码错误
  58. // 判断提交的旧密码是否正确
  59. const compareResult = bcrypt.compareSync(req.body.oldPwd, results[0].password)
  60. if (!compareResult) return res.cc('原密码错误!')
  61. // 对新密码进行 bcrypt 加密之后,更新到数据库中:
  62. // 定义更新用户密码的 SQL 语句
  63. const sql = `update ev_users set password=? where id=?`
  64. // 对新密码进行 bcrypt 加密处理
  65. const newPwd = bcrypt.hashSync(req.body.newPwd, 10)
  66. console.log(req.body.newPwd);
  67. // 执行 SQL 语句,根据 id 更新用户的密码
  68. db.query(sql, [newPwd, req.user.id], (err, results) => {
  69. // SQL 语句执行失败
  70. if (err) return res.cc(err)
  71. // SQL 语句执行成功,但是影响行数不等于 1
  72. if (results.affectedRows !== 1) return res.cc('更新密码失败!')
  73. // 更新密码成功
  74. res.cc('更新密码成功!', 0)
  75. })
  76. })
  77. }
  78. // 更新用户头像的处理函数
  79. exports.updateAvatar = (req, res) => {
  80. // req.files/req.file 是上传成功文件的信息对象 (.array req.files .single('avatar') req.file)
  81. // req.body 上传文件时所携带的其他文本表单数据
  82. let file = req.files[0]
  83. // 手动判断是否上传了头像
  84. if (!file || file.fieldname !== 'avatar') return res.cc('头像是必选参数!')
  85. // Date.now() 返回自 1970 年 1 月 1 日 00:00:00 (UTC) 到当前时间的毫秒数。类型为 number,
  86. // toString() 方法返回 string 类型。
  87. // file.originalname 文件的名称包含了格式 如: '人è\x84¸.PNG'
  88. // 这里写相对路径
  89. // 定义新的文件名
  90. // let Url = 'public/image/head_portrait/' + Date.now().toString() + '_' + req.file.originalname
  91. let Url = path.join('public/image/head_portrait/', file.originalname)// 覆盖重复的文件
  92. // fs.rename():重命名文件或文件夹 同步
  93. // fs.renameSync(oldPath,newPath) 异步 oldPath 原路径 newPath 新路径
  94. fs.renameSync(path.join('./public/image/head_portrait/', file.filename), Url) // 设置文件名
  95. // 图片访问路径
  96. const imgUrl = `/${Url}`
  97. const sql = 'update ev_users set user_pic=? where id=?'
  98. // 调用 db.query() 执行 SQL 语句,更新对应用户的头像:
  99. // req.body.avatar 是一个base(贝s)64字符串,可以直接用img 标签展示
  100. db.query(sql, [imgUrl, req.user.id], (err, results) => {
  101. // 执行 SQL 语句失败
  102. if (err) return res.cc(err)
  103. // 执行 SQL 语句成功,但是影响行数不等于 1
  104. if (results.affectedRows !== 1) return res.cc('更新头像失败!')
  105. // 更新用户头像成功
  106. // return res.cc('更新头像成功!', 0)
  107. res.send({
  108. status: 0,
  109. msg: '更新头像成功',
  110. imgUrl: imgUrl
  111. })
  112. })
  113. }

3.在/schema/user.js 中,写入表单验证规则

表单验证已经写在上面注册与登录的文件中,他们共用 schema/user.js 文件

分页模糊查询-获取文章列表

1.在 router 文件夹中,新建 article.js 文件,作为用户的路由模块,并初始化代码如下:

  1. // 导入 express
  2. const express = require('express')
  3. // 创建路由对象
  4. const router = express.Router()
  5. // 导入验证数据的中间件(自动验证)
  6. const expressJoi = require('@escook/express-joi')
  7. // 导入获取文章列表的验证模块
  8. const { getArticleList_schema, } = require('../schema/article')
  9. // 导入文章的路由处理函数模块
  10. const article_handler = require('../router_handler/article')
  11. // 获取-文章列表
  12. router.post('/list', expressJoi(getArticleList_schema), article_handler.getArticleList)
  13. module.exports = router

2.在 /router_handler/article.js 中,使用 exports 对象,向外共享路由处理函数 :

  1. // 导入数据库操作模块
  2. const db = require('../db/index')
  3. /**
  4. * 带分页和模糊查询-获取文章列表
  5. * */
  6. exports.getArticleList = (req, res) => {
  7. const body = req.body;
  8. let sql = 'select * from ev_articles where is_delete<>1 ' // 查询列表所有的数据
  9. let sql_b = 'select count(*) as total from ev_articles where is_delete<>1' // 查询结果总数据条数
  10. let content = [] // 实参
  11. let isMore = false //是否有多个查询参数
  12. let total = 0 // 总数
  13. db.query(sql_b, (err, results) => {
  14. if (err) return res.cc(err)
  15. total = results[0].total
  16. })
  17. if (body.model.cate_id) {
  18. /** like 用法:
  19. * 使用like一般都需要指定某列数据应用like查询,它的语法如下:
  20. * select * from 表名 where 列名 like 要查询的数据
  21. * select * from 表名 where 列名 like '%abc%' 查询列值包含abc的
  22. * select * from 表名 where 列名 like 'abc%' 查询列值以abc开头的
  23. * select * from 表名 where 列名 like '%abc' 查询列值以abc结尾的
  24. * select * from 表名 where 列名 like 'ab%c' 查询列值以ab开头,c结尾的
  25. * % 占位符表示0个或多个字符,可放在查询条件的任意位置
  26. */
  27. sql += 'and cate_id like ? ';
  28. content.push('%' + body.model.cate_id + '%') // 模糊查询 cate_id
  29. isMore = true;
  30. }
  31. if (body.model.state) {
  32. if (isMore) {//true代表有多个参数
  33. sql += 'and state like ? ' // and 是与两个条件都必须满足,or是或的关系
  34. } else {
  35. sql += 'and state like ? '
  36. }
  37. content.push('%' + body.model.state + '%') // 模糊查询 state
  38. }
  39. if (body.current) { //开启分页
  40. let current = body.current;//当前页码
  41. let pageSize = body.size;//一页展示多少条数据
  42. sql += 'limit ?,?' // ? 开始查询的索引 , ? 要查多少条数据
  43. // parseInt 将字符串转为整数
  44. content.push((current - 1) * pageSize, parseInt(pageSize))
  45. }
  46. db.query(sql, content, (err, results) => {
  47. // 执行 SQL 语句失败
  48. if (err) return res.cc(err)
  49. // SQL 语句执行成功,但是没有查询到任何数据
  50. if (results.length === 0) return res.cc('文章列表数据为空,请更筛选条件重试~', 0)
  51. res.json({
  52. status: 0,
  53. msg: '获取文章列表数据成功!',
  54. total: total,
  55. data: results
  56. })
  57. })
  58. }

3.在/schema/article.js 中,写入表单验证规则

  1. // 导入定义验证规则的模块
  2. const joi = require('joi')
  3. /**
  4. * string() 值必须是字符串 默认情况不支持空字符串 Joi.string().allow('') 支持空字符串
  5. * alphanum() 值只能是包含 a-zA-Z0-9 的字符串
  6. * min(length) 最小长度
  7. * max(length) 最大长度
  8. * required() 值是必填项,不能为 undefined
  9. * pattern(正则表达式) 值必须符合正则表达式的规则
  10. * number()值必须是一个数字
  11. * email()值必须是邮箱格式
  12. * integer() 整数
  13. * valid() 有效值
  14. */
  15. const current = joi.number().integer().required()
  16. const size = joi.number().integer().required()
  17. const cate_idR = joi.required()
  18. const stateR = joi.string().valid('已发布', '草稿', '').required()
  19. //校验规则对象 - 获取 - 文章列表
  20. exports.getArticleList_schema = {
  21. body: {
  22. current,
  23. size,
  24. model: {
  25. cate_id: cate_idR,
  26. state: stateR
  27. }
  28. }
  29. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/68992
推荐阅读
相关标签
  

闽ICP备14008679号