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
相关产品推荐
相关产品推荐

