Sequelize的拓展

前言

基于上一篇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入门及简单的增删改查-优快云博客基础上进行拓展,如想要更好了解这些内容,需要先看上一篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值