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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 05:40:22