前言
基于上一篇Sequelize的基本操作后的一些补充扩展
一.分页查询
在查看详情的接口中进行整改
router.get('/', async function (req, res, next) {try {const query = req.queryconst currentPage = Math.abs(Number(query.currentPage)) || 1const pageSize = Math.abs(Number(query.pageSize)) || 10const offset = (currentPage - 1) * pageSizeconst 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.paramsconst 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.paramsconst 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入门及简单的增删改查-CSDN博客基础上进行拓展,如想要更好了解这些内容,需要先看上一篇