💂 个人网站: 【紫陌】【笔记分享网】
💅 想寻找共同学习交流、共同成长的伙伴, 请点击【前端学习交流群】今天写项目接口看到接口文档要求带四个参数两个参数必选两个可选,当时在想可选参数要怎么做,毕竟自己也没有写过。然后想了一天终于想出一个感觉不是最佳的方案,但是可以满足需求。今天特此加深记忆。
1.文档要求
简要描述:
- 获取文章的列表数据
请求URL:
/my/article/list
请求方式:
- GET
Header:
Authorization:Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsInBhc3N3b3JkIjoiIiwibmlja25hbWUiOiLms6Xlt7Tlt7QiLCJlbWFpbCI6Im5pYmFiYUBpdGNhc3QuY24iLCJ1c2VyX3BpYyI6IiIsImlhdCI6MTU3ODAzNjY4MiwiZXhwIjoxNTc4MDcyNjgyfQ.Mwq7GqCxJPK-EA8LNrtMG04llKdZ33S9KBL3XeuBxuI
参数:
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
pagenum | 是 | int | 页码值 |
pagesize | 是 | int | 每页显示多少条数据 |
cate_id | 否 | string | 文章分类的 Id |
state | 否 | string | 文章的状态,可选值有:已发布、草稿 |
2.书写接口
在路由模块下 router/article.js
//获取文章列表
router.get('/list',article_handler.getArticle)
在业务逻辑模块下,router-handeler/article.js
//文章列表显示处理函数
exports.getArticle = (req, res) => {
//解构请求带来的参数
const { cate_id, state } = req.body
//pagesize一页展示多条数据 pagesize前端传来的可选参数,如果没传给个默认值5。传来的是字符串需要parseInt()函数转化
const pagesize = parseInt(req.body.pagesize) || 5
//pagenum当前第几页 pagenum前端传来的可选参数,如果没传给个默认值1。传来的是字符串需要parseInt()函数转化
const pagenum = (parseInt(req.body.pagenum) - 1) * pagesize || 1
//flag表示sql的参数情况
let flag = [];
// 定义全带参数的SQL语句,
let sql = ` SELECT a.Id,a.title,a.pub_date,a.state,b.name
FROM ev_articles a ,ev_article_cate b
WHERE a.is_delete = 0 AND ? = b.Id AND b.is_delete = 0 AND a.state = ?
ORDER BY a.id ASC
LIMIT ? , ? `
// 判断cate_id和state是否带了参数
if (cate_id === undefined && state === undefined) {
flag = [pagenum, pagesize]
//定义SQL语句
sql = sql.replace('AND ? = b.Id','AND a.cate_id = b.Id ').replace('AND a.state = ?','')
} else if (state === undefined) {
flag = [cate_id, pagenum, pagesize]
//定义SQL语句
sql =sql.replace('AND a.state = ?','')
} else if (cate_id === undefined) {
flag = [state, pagenum, pagesize]
//定义SQL语句
sql = sql.replace('AND ? = b.Id','AND a.cate_id = b.Id ')
console.log(sql);
} else {
flag = [cate_id, state, pagenum, pagesize]
}
console.log(req.body);
//执行SQL语句
db.query(sql, flag, (err, results) => {
// 执行 SQL 语句失败
if (err) return res.cc(err)
// 执行 SQL 语句成功
res.send({
status: 0,
message: '获取文章列表成功!',
data: results,
})
})
}
重点看那两个可选参数,处理的方法大概就是:
先定义一条带四个参数(全部参数)的SQL语句,
然后根据前端发请求是否带参数进行判断,
如果没有带参数就把对应的占位符的SQL条件用replace()函数替换成空,
然后在最外面定一个参数空数组flag来存放参数。如果前端传几个参数就往里数组填几个参数。
以我目前知识感觉这不是最好方案,如果还有大佬知道别的方案可以告诉我,你们写可选参数的时候怎么做的呢?欢迎评论区聊聊!!!