Node.js+MongoDB模糊查询REST接口报错求助及示例需求
解决你的Express + MongoDB模糊查询接口问题
嘿,我来帮你搞定这个问题!从你给出的信息来看,主要有两个关键问题导致了当前的错误,咱们一步步来修正:
1. 首先解决Cannot GET的路由拼写错误
你在Postman里调用的路径是/autocoplete,但代码里定义的路由是/autocomplete/:size——仔细看!你把autocomplete拼成了autocoplete(少了一个t),这就是为什么服务器找不到这个接口的直接原因。先把拼写改对,这是最基础的一步。
2. 修正Mongoose查询的语法错误
你误用了MongoDB原生驱动的toArray()方法,但Mongoose的find()返回的是Query对象,它不支持这个方法。另外你的回调函数写法也有语法问题,箭头函数的位置不对。
修正后的完整路由代码
先给你一个基于回调的修正版本,和你原来的写法更接近:
router.get('/tire/autocomplete/:size', VerifyToken, function(req, res) { const size = req.params.size; // 使用Mongoose的exec()来执行查询,这才是正确的姿势 TechInfo.find({ Size: new RegExp(size, 'i') }) .exec(function(err, techinfos) { if (err) { console.error(err); return res.status(400).send({ status: 'ko', data: { msg: err.message } }); } res.status(200).send({ status: 'ok', data: { msg: 'Size tires available', tires: techinfos } }); }); });
推荐用Async/Await写法(更优雅易读)
如果你想让代码更现代、更易维护,推荐改用async/await的异步写法,出错处理也更清晰:
router.get('/tire/autocomplete/:size', VerifyToken, async function(req, res) { try { const size = req.params.size; // 直接await查询结果,不用嵌套回调 const techinfos = await TechInfo.find({ Size: new RegExp(size, 'i') }); res.status(200).send({ status: 'ok', data: { msg: 'Size tires available', tires: techinfos } }); } catch (err) { console.error(err); res.status(400).send({ status: 'ko', data: { msg: err.message } }); } });
几个额外的小提示
- 检查你的路由挂载前缀:如果这个router是挂载在
/api/v1.0/equipment/tires下的,那完整请求路径应该是/api/v1.0/equipment/tires/tire/autocomplete/[你的size参数]——如果觉得路径里的tire有点冗余,可以把路由改成/autocomplete/:size,这样请求路径就更简洁:/api/v1.0/equipment/tires/autocomplete/17(举个例子)。 new RegExp(size, 'i')已经实现了不区分大小写的模糊匹配,完全符合你想要的SQLlike效果。- 确认
VerifyToken中间件没有问题,它会不会在验证阶段就把请求拦截了?可以先暂时注释掉测试一下,排除中间件的影响。
最后,重启你的Express服务,在Postman里用正确的路径测试,应该就能正常返回数据啦!
内容的提问来源于stack exchange,提问作者gisman
相关产品推荐
相关产品推荐

