前言
基于上一篇Sequelize的基本操作后的一些补充扩展
一.分页查询
在查看详情的接口中进行整改
router.get('/', async function (req, res, next) {
try {
const query = req.query
const currentPage = Math.abs(Number(query.currentPage)) || 1
const pageSize = Math.abs(Number(query.pageSize)) || 10
const offset = (currentPage - 1) * pageSize
const condition = {
order: [['id', 'DESC']],
limit: pageSize,
offset: offset
}
if (query.title) {
condition.where = {
title: {
[Op.like]: `%${query.title}%`
}
}
}
const { count, rows } = await Article.findAndCountAll(condition)
res.json({
code: 200,
message: "查询成功",
data: {
articles: rows,
pagination: {
total: count,
currentPage,
pageSize
}
}
});
} catch (error) {
res.status(500).json({
code: 500,
message: "查询失败",
errors: [error.message]
})
}
});
二.参数过滤
在更新数据的接口上进行整改
function filterBody(req) {
return {
title: req.body.title,
content: req.body.content
}
}
router.put('/:id', async function (req, res, next) {
try {
const { id } = req.params
const article = await Article.findByPk(id)
if (article) {
const body = filterBody(req)
await Article.update(body)
res.json({
status: true,
message: "更新成功",
data: article
})
} else {
res.status(404).json({
code: 404,
message: "查询不到信息"
})
}
}
catch (error) {
res.status(500).json({
code: 500,
message: "删除失败",
errors: [error.message]
})
}
})
三.验证表单数据
在models\article.js修改
'use strict';
const {
Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class Article extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) {
// define association here
}
}
Article.init({
// title: DataTypes.STRING,
//表单内容验证
title:{
type:DataTypes.STRING,
allowNull:false,
validate:{
notNull:{
msg:"标题必须存在"
},
notEmpty:{
msg:"标题不为空"
},
len:{
args:[2,45],
msg:"标题长度需要在2-45个字符之间"
}
}
},
content: DataTypes.TEXT
}, {
sequelize,
modelName: 'Article',
});
return Article;
};
在routes\admin\articles.js使用
router.post('/', async function (req, res, next) {
try {
const article = await Article.create(body)
res.status(200).json({
code: 200,
message: "新增成功",
data: article
})
}
catch (error) {
if (error.name === 'SequelizeValidationError') {
const errors = error.errors.map(e => e.message)
res.status(400).json({
code: 400,
message: "请求参数错误",
errors
})
} else {
res.status(500).json({
code: 500,
message: "新增失败",
errors: [error.message]
})
}
}
})
四.封装代码
新建一个utils文件夹,并新增一个response.js
/**
* 自定义404
*/
class NotFoundError extends Error {
constructor(message) {
super(message);
this.name = "NotFoundError"
}
}
/**
* 请求成功
*/
function success(res, message, data, code) {
res.status(code).json({
code: code,
message,
data
})
}
/**
* 请求失败
*/
function fail(res, error) {
if (error.name === 'SequelizeValidationError') {
const errors = error.errors.map(e => e.message)
return res.status(400).json({
code: 400,
message: "请求参数错误",
errors
})
}
if (error.name === 'NotFoundError') {
return res.status(404).json({
code: 404,
message: "资源不存在",
errors: [
error.message
]
})
}
res.status(500).json({
code: 500,
message: "服务器错误",
errors: [error.message]
})
}
module.exports = {
NotFoundError,
success,
fail
}
在routes\admin\articles.js使用
const { NotFoundError, success, fail } = require('../../utils/response')
/**
* 公共方法:查询当前文章
*/
async function getArticle(req,) {
const { id } = req.params
const article = await Article.findByPk(id)
if (!article) {
throw new NotFoundError(`ID:${id}的文章未找到`)
}
return article
}
router.get('/:id', async function (req, res, next) {
try {
const article = await getArticle(req)
res.json({
code: 200,
message: "查询成功",
data: article
});
success(res, "查询成功", article)
} catch (error) {
fail(res, error)
}
})
总结
以上内容皆是在上一篇Sequelize入门及简单的增删改查-优快云博客基础上进行拓展,如想要更好了解这些内容,需要先看上一篇