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

MongoDB查询首字母为S的记录时API返回空数组如何排查

问题排查与修复方案

存在的问题

  • 参数获取错误:你的路由/api/getStudentDetails没有定义路径参数,且你通过Postman的Params栏传递的是查询参数,应该使用req.query.name获取参数,而非req.params.name,后者只能拿到路由路径中定义的占位参数。
  • 查询逻辑不符合需求:你要查询名称以S开头的记录,需要使用MongoDB的正则匹配规则,不能直接做精确值匹配。
  • 查询条件构造错误:使用new dataModel()实例化的对象会携带mongoose内部属性,无法作为find方法的查询条件,直接传入普通JS对象即可。
  • 数据库连接逻辑不合理:每次接口请求都新建MongoDB连接,会导致连接溢出、查询异常,应该全局只初始化一次连接。

修复后的代码示例

// 全局初始化MongoDB连接,不要在每次请求时重复连接
const mongoose = require('mongoose');
const uri = "mongodb+srv://coolhack069:XzC6N7dOyUeQl8M9@cluster0.kz6v9.mongodb.net/assignment?retryWrites=true&w=majority";
mongoose.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true })
  .then(() => console.log('MongoDB连接成功'))
  .catch(err => console.log('连接失败', err));

// 修正后的查询接口
app.get('/api/getStudentDetails', async (req, res) => {
  try {
    // 从查询参数中获取要匹配的首字母
    const namePrefix = req.query.name;
    // 构造正则查询条件:^代表以指定字符开头,$options:i代表不区分大小写,不需要可以去掉
    const query = { name: { $regex: `^${namePrefix}`, $options: 'i' } };
    // 直接调用mongoose模型的查询方法
    const result = await dataModel.find(query);
    res.send(result);
  } catch (err) {
    res.status(500).send({ error: err.message });
  }
});

Postman请求调整

保持请求地址为http://localhost:3001/api/getStudentDetails,Params栏的key填name,value填S即可正常查询到符合条件的记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:15:03