首页 > 解决方案 > 我希望能够按类别、按类别和型号获取产品,或者只获取所有产品。目前为此使用 3 个不同的端点

问题描述

我的后端有 3 个端点,它们根据某些标准返回产品。我想知道是否应该重写逻辑并将其合并到单个端点/函数中。目前我的路线如下所示:

router.get('/products', productController.getProducts);
router.get('/products/:categoryId', productController.getProductsByCategory);
router.get('/products/:model/:categoryId', productController.getProductsByModelCategory);

我有 3 个功能非常相似,但彼此之间也略有不同。我想知道是否应该通过重写其中一个函数并完全删除另外两个来干燥代码。这将使用一些条件语句使函数更加复杂,但我会删除很多重复的代码。另一方面,有 3 个端点,很清楚每个端点的作用。

module.exports.getProducts = async (req, res, next) => {
    let page = parseInt(req.query.page, 10)
    let limit = 10
    let offset = ( page - 1 ) * limit

    try {
        let products = await Product.findAndCountAll({
            limit: limit,
            offset: offset,
            order: [
                ['createdAt', 'DESC']
            ],
            include: [
                {
                    model: Model
                },
                {
                    model: Brand
                }
            ]
        })

        let pages = Math.ceil( products.count / limit )

        res.status(200).json({
            totalItems: products.count,
            totalPages: pages,
            products: products.rows
        })
    } catch (e) {
        console.log(e)
        res.status(500)
    }
}

module.exports.getProductsByCategory = async (req, res, next) => {
    let categoryId = req.params.categoryId
    let page = parseInt(req.query.page, 10)
    let limit = 10
    let offset = ( page - 1 ) * limit

    try {
        let products = await Product.findAndCountAll({
            limit: limit,
            offset: offset,
            where: {
                categoryId: categoryId
            }
        })

        let pages = Math.ceil( products.count / limit )

        res.status(200).json({
            totalItems: products.count,
            totalPages: pages,
            products: products.rows
        })
    } catch (e) {
        console.log(e)
        res.status(500)
    }
}

module.exports.getProductsByModelCategory = async (req, res, next) => {
    let model = req.params.model
    let categoryId = req.params.categoryId
    let page = parseInt(req.query.page, 10)
    let limit = 10
    let offset = ( page - 1 ) * limit

    try {
        let products = await Product.findAndCountAll({
            limit: limit,
            offset: offset,
            where: {
                categoryId: categoryId
            },
            include: {
                model: Model,
                where: {
                    name: model
                }
            }
        })

        let pages = Math.ceil( products.count / limit )

        res.status(200).json({
            totalItems: products.count,
            totalPages: pages,
            products: products.rows
        })
    } catch (e) {
        console.log(e)
        res.status(500)
    }
}

标签: javascriptnode.jsexpress

解决方案


如果我能代替你,我将有 3 个选择:

  1. 前置过滤器

    从后端获取所有数据。然后在前端过滤它。

    这样你就不需要 3 条单独的路线;只有一条路线就可以了。

  2. 使用参数

    将查询作为参数传递给后面的路由?。您可以访问控制器和用switch例中的参数或任何类似的内容,以根据参数显示结果。因此,只有一条路线。

  3. 你用过的一个。


推荐阅读