Express+Mongoose接口异常:请求参数id始终返回固定值
问题:获取单条文档时req.params.id始终返回同一值
我尝试通过id参数从数据库中获取单条文档,相关代码如下:
const router = express.Router(); // middleware for base url server.use("localhost/api/v1", tasksRouter); router .route("/tasks/:id") .get(controllers.getSingleTask) const getSingleTask = async (req, res) => { try { const taskID = req.params.id; const task = await Task.findOne({ _id: taskID }); if (!task) { return res.status(404).json({ msg: `No task with ID: ${taskID}` }); } return res.status(200).json({ task }); } catch (error) { return res.status(500).json({ msg: error }); } };
但每次发起请求时,无论传入的id是否存在,req.params.id始终返回同一个值,导致getSingleTask控制器返回同一份文档。使用的版本:express: "^4.17.1"、mongoose: "^5.11.10"。
比如发起请求localhost/api/v1/tasks/somerandomid时,打印出的req.params.id和查询到的task如下:
// 即使传入'somerandomid',获取到的id仍然是这个值 635651c3112d5405147b7e86 // 因为id匹配数据库第一条文档,控制器返回该文档 { completed: true, _id: 635651c3112d5405147b7e86, task: 'task number 1', __v: 0 }
解决方案
问题出在server.use()的路径配置上:express的use()方法第一个参数是路径前缀,不需要包含域名。你写的"localhost/api/v1"会被当作路径的一部分,导致路由匹配逻辑混乱,无法正确解析:id参数。
修正后的代码只需修改server.use这一行:
// 去掉域名,只保留路径前缀 server.use("/api/v1", tasksRouter);
修改后,express就能正确识别/tasks/:id中的:id参数,每次请求都会获取到传入的实际id值,进而查询到对应的文档。
内容的提问来源于stack exchange,提问作者Shaikh Ahmed
相关产品推荐
相关产品推荐

