Express Sequelize按key调用findAll查询用户失效问题解决
问题原因
你的/specuser路由配置的是GET请求,Express框架默认不会解析GET请求的请求体,因此控制器中读取req.body.key必然返回undefined。
对比你正常工作的/registered接口:同是GET请求,它通过req.query.email读取URL拼接的查询参数,符合GET请求的传参规则,所以能正常工作。
另外你返回全量用户的原因也很明确:Sequelize解析查询条件时,如果where子句里的字段值为undefined,会自动跳过该过滤条件,最终执行不带约束的全表查询。
修复步骤
优先选用符合REST语义的方案,和现有/registered接口保持传参逻辑一致:
- 修改
controllers/users.controllers.js中的findbykey方法,将读取req.body.key的逻辑改为读取req.query.key,参考代码:
const findbykey = async (req, res, next) => { try { // 替换原有的req.body.key读取逻辑 const searchKey = req.query.key; // 原有模糊查询逻辑保留,增加判空避免无参时查全表 const userList = await User.findAll({ where: searchKey ? { key: { [Op.like]: `%${searchKey}%` } } : {} }); res.json(userList); } catch (err) { next(err); } }
- 调用接口时将key作为URL查询参数传递,不要放到请求体里,请求格式示例:
GET /specuser?key=xxx你的目标key值xxx
如果用Postman测试,参数要填写在Params标签页下,不要填在Body标签页。
如果你坚持要通过请求体传key参数,需要做两处修改:
- 将路由层
/specuser的请求方法从GET改为POST - 确认项目入口文件中已经在路由注册前挂载了请求体解析中间件:
// app.js 中必须在路由注册前加这两行 app.use(express.json()); app.use(express.urlencoded({ extended: true }));
注意:GET请求携带请求体不符合HTTP规范,部分代理、服务器会直接丢弃GET请求的请求体内容,不推荐使用这种方案。
内容的提问来源于stack exchange,提问作者NextNightFlyer
相关产品推荐
相关产品推荐

