You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express API动态模糊查询路由配置问题求助

问题解决:API模糊查询动态数据获取失败

核心问题分析

你的代码存在三个关键错误:

  1. 参数获取方式不匹配:你实际通过URL查询参数(?后内容)传递值,但控制器里尝试从req.params(路径参数)获取,两者不对应。
  2. URL格式错误:访问的localhost:3000/artisans/nom?=data缺少参数名,正确格式应为?nom=data。
  3. Sequelize语法错误:where条件里的%${nom}%}多了一个闭合大括号,导致SQL语句生成异常。

修复步骤

1. 路由配置调整

如果使用查询参数(更适合模糊查询场景),保持现有路由即可:

var express = require('express');
var router = express.Router();
const service = require ('../services/artisans');

router.get ('/', service.getAll);
router.get ('/nom', service.getByName); // 无需修改路径,用查询参数传递值

module.exports = router;

如果偏好路径参数(如/nom/data),则修改路由为:

router.get ('/nom/:nom', service.getByName);

2. 控制器代码修正

根据参数类型调整获取逻辑,同时修复语法错误:

情况一:使用查询参数(推荐)

const { Op } = require('sequelize');
const Artisan = require ('../models/artisan');

exports.getByName = async (req, res, next) => {
    try {
        const { nom } = req.query; // 从req.query获取查询参数
        
        // 新增参数校验,避免无效查询
        if (!nom) {
            return res.status(400).json({ error: 'Missing nom parameter' });
        }

        const artisans = await Artisan.findAll({
            attributes: { exclude: ['createdAt', 'updatedAt'] },
            where: { 
                nom: { [Op.like]: `%${nom}%` } // 修复多余的闭合大括号
            }
        });
        
        if (artisans.length > 0) {
            return res.status(200).json(artisans);
        }
        return res.status(404).json({ error: 'user_not_found' });
    } catch (error) {
        console.error('Erreur dans /artisan :', error);
        res.status(500).json({ error: 'Failed to fetch artisan' });
    }
};

情况二:使用路径参数

const { Op } = require('sequelize');
const Artisan = require ('../models/artisan');

exports.getByName = async (req, res, next) => {
    try {
        const { nom } = req.params; // 从req.params获取路径参数

        const artisans = await Artisan.findAll({
            attributes: { exclude: ['createdAt', 'updatedAt'] },
            where: { 
                nom: { [Op.like]: `%${nom}%` } // 修复语法错误
            }
        });
        
        if (artisans.length > 0) {
            return res.status(200).json(artisans);
        }
        return res.status(404).json({ error: 'user_not_found' });
    } catch (error) {
        console.error('Erreur dans /artisan :', error);
        res.status(500).json({ error: 'Failed to fetch artisan' });
    }
};

3. 修正访问URL

  • 查询参数方式:访问localhost:3000/artisans/nom?nom=data
  • 路径参数方式:访问localhost:3000/artisans/nom/data

额外优化建议

  • 变量命名:将artisan改为artisans,更符合findAll返回数组的语义
  • 错误规范:统一返回JSON格式错误信息,便于前端处理

内容的提问来源于stack exchange,提问作者BoulayM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 21:17:47