Express API动态模糊查询路由配置问题求助
问题解决:API模糊查询动态数据获取失败
核心问题分析
你的代码存在三个关键错误:
- 参数获取方式不匹配:你实际通过URL查询参数(
?后内容)传递值,但控制器里尝试从req.params(路径参数)获取,两者不对应。 - URL格式错误:访问的
localhost:3000/artisans/nom?=data缺少参数名,正确格式应为?nom=data。 - 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
相关产品推荐
相关产品推荐

